
示例工程教程后端【免费下载链接】aws-doc-sdk-examplesWelcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below.项目地址https://gitcode.com/gh_mirrors/aw/aws-doc-sdk-examples点击查看免费下载导读本文以 AWS 官方代码仓库 aws-doc-sdk-examples 中 javav2/example_code/glacier 的 Amazon Glacier现称 Amazon S3 GlacierJava 示例为核心系统讲解如何用 AWS SDK for Java 2.x 完成归档生命周期中的六类核心操作创建仓库Vault、描述仓库、列举仓库、上传归档、发起下载 Job 并获取归档内容、删除归档与删除仓库。读完本文你将掌握GlacierClient的完整调用链、SHA-256 树形哈希Tree Hash的校验原理、Job 异步轮询下载模式以及如何通过 Maven 构建、命令行运行并用 JUnit 5 集成测试验证整套流程。Amazon S3 Glacier 与 Java 2.x SDK 概览Amazon S3 Glacier 面向不频繁访问infrequently used的数据提供持久、极低成本的存储并内置数据归档与备份所需的加密、访问控制等安全特性。在使用 Java 2.x SDK 时核心入口是software.amazon.awssdk.services.glacier.GlacierClient。本目录下的示例全部使用同步客户端并在构造时显式指定Region.US_EAST_1GlacierClient glacier GlacierClient.builder() .region(Region.US_EAST_1) .build();所有示例共享com.example.glacier包名代码文件中还带有snippet-start/snippet-end标记方便 AWS 官方文档直接提取代码片段。⚠ 重要提示来自原 README运行这些代码可能在你的 AWS 账户产生费用具体请参考 AWS Pricing 与 Free Tier运行测试同样可能产生费用建议为代码授予最小权限least privilege只授予执行任务所需的最低权限这些代码并未在所有 AWS 区域经过测试。项目结构与环境准备目录与文件清单本示例位于仓库的 javav2/example_code/glacier 目录结构如下glacier/ ├── Makefile # make 构建入口封装 Maven 命令 ├── README.md # 本示例的说明文档 ├── metadata.yaml # 文件到 AWS 服务的映射元数据 ├── pom.xml # Maven 构建配置Java 21 AWS SDK BOM ├── run_example.sh # 便捷运行脚本 └── src/ ├── main/java/com/example/glacier/ │ ├── CreateVault.java # 创建仓库 │ ├── DescribeVault.java # 描述仓库 │ ├── ListVaults.java # 列举仓库 │ ├── UploadArchive.java # 上传归档含 Tree Hash 计算 │ ├── ArchiveDownload.java # 发起检索 Job 并下载归档 │ ├── DeleteArchive.java # 删除归档 │ └── DeleteVault.java # 删除仓库 └── test/java/GlacierTest.java # JUnit 5 集成测试其中 metadata.yaml 将上述 7 个主类文件与测试文件统一映射到glacier服务便于仓库的自动化构建与测试体系识别。前置条件所有 Java 2.x 示例的前置要求统一记录在 javav2/README.md主要包括本地访问本仓库通过 clone、fork 或下载 zip 获取代码安装 Apache Maven版本 3.0配置 AWS 凭证所有示例假设 Java SDK 能通过默认凭证提供链default credentials provider chain获取凭证可在~/.aws/config中配置默认 profile支持 IAM Identity Center SSO 或临时凭证或在~/.aws/credentials中配置配置默认区域可在默认 profile 中设置若未设置SDK 默认使用us-east-1——本示例的代码也恰好硬编码了Region.US_EAST_1。Maven 依赖pom.xmlpom.xml 中关键配置如下java.version为21编译器 source/target 均设为 21通过software.amazon.awssdk:bom版本2.35.10统一管理 AWS SDK 版本核心依赖software.amazon.awssdk:glacierGlacier 客户端、secretsmanager测试从 Secrets Manager 读取参数、gson解析 Secret JSON、log4j与slf4j日志测试依赖 JUnit Jupiter 5.9.2并通过maven-surefire-plugin的groupsIntegrationTest/groups只运行打了Tag(IntegrationTest)标记的用例。六大单操作Single Actions详解原 README 将示例归类为 Single actions——即调用单个服务函数的代码片段。下面逐一结合源码展开。1. 创建仓库CreateVaultCreateVault.java 演示glacier.createVault()。命令行参数只有一个vaultName要创建的仓库名称。核心调用如下CreateVaultRequest vaultRequest CreateVaultRequest.builder() .vaultName(vaultName) .build(); CreateVaultResponse createVaultResult glacier.createVault(vaultRequest); System.out.println(The URI of the new vault is createVaultResult.location());关键点CreateVaultRequest只需vaultNameaccountId未指定时 SDK 默认使用-当前账户返回值CreateVaultResponse.location()是新仓库的相对 URI 路径可用于后续操作异常统一捕获GlacierException打印awsErrorDetails().errorMessage()后退出。2. 描述仓库DescribeVault虽然原 README 的列表未单列但源码目录中包含了 DescribeVault.java它是创建后的自然下一步调用glacier.describeVault()DescribeVaultResponse desVaultResult glacier.describeVault(describeVaultRequest); System.out.print(CreationDate: desVaultResult.creationDate() \nLastInventoryDate: desVaultResult.lastInventoryDate() \nNumberOfArchives: desVaultResult.numberOfArchives() \nSizeInBytes: desVaultResult.sizeInBytes() \nVaultARN: desVaultResult.vaultARN() \nVaultName: desVaultResult.vaultName());响应中包含仓库的创建时间、最近一次库存清单生成时间、归档数量、总字节数、Vault ARN 与名称——这是运维排查与成本核算时的第一手数据。3. 列举仓库ListVaultsListVaults.java 演示了带marker分页的glacier.listVaults()调用。S3 Glacier 的 ListVaults 是分页接口每次返回一页结果并在response.marker()中给出下一页游标因此源码用while循环持续翻页while (!listComplete) { ListVaultsResponse response; if (newMarker ! null) { response glacier.listVaults(ListVaultsRequest.builder().marker(newMarker).build()); } else { response glacier.listVaults(ListVaultsRequest.builder().build()); } for (DescribeVaultOutput v : response.vaultList()) { totalVaults 1; System.out.println(* v.vaultName()); } newMarker response.marker(); if (newMarker null) { listComplete true; } }关键点该示例不接收命令行参数直接列出当前账户默认accountId -下的全部仓库marker为空表示已到最后一页若账户中没有任何仓库会输出No vaults found.每页条数可通过ListVaultsRequest.limit()控制默认 1000。4. 上传归档UploadArchive含 SHA-256 树形哈希校验UploadArchive.java 是整套示例中最具技术含量的一段除调用glacier.uploadArchive()外还完整实现了 S3 Glacier 要求的 SHA-256 树形哈希Tree Hash计算用于请求校验。命令行参数strPath vaultName分别是要上传的本地文件路径和仓库名。核心上传逻辑String checkVal computeSHA256(myFile); // 计算 1MB 分块的树形哈希 UploadArchiveRequest uploadRequest UploadArchiveRequest.builder() .vaultName(vaultName) .checksum(checkVal) .build(); UploadArchiveResponse res glacier.uploadArchive(uploadRequest, path); return res.archiveId();树形哈希的计算过程源码中computeSHA256TreeHash与getChunkSHA256Hashes将文件按1 MB1024 × 1024 字节分块numChunks file.length() / ONE_MB余数非零则加一块对每个分块独立计算 SHA-256 摘要得到叶子层哈希数组文件为空时直接返回md.digest()自底向上两两拼接并再次计算 SHA-256md.update(hash[i]); md.update(hash[i1]);当节点数为奇数时最后一个哈希直接上浮循环直至只剩一个根节点即为整棵树的根哈希最终通过toHex()输出小写十六进制字符串作为checksum。这正是 S3 Glacier 上传/校验数据完整性的核心机制也是官方文档要求的校验方式——把这段逻辑保留在示例中让开发者可以照搬复用于大文件分块上传场景。5. 发起 Job 并下载归档ArchiveDownloadInitiateJobArchiveDownload.java 对应原 README 中列出的InitiateJob操作但它实际演示了完整的发起 Job → 轮询状态 → 获取输出三步流程对应三个服务函数glacier.initiateJob()创建检索 Jobglacier.describeJob()轮询 Job 状态glacier.getJobOutputAsBytes()Job 成功后下载输出字节流。命令行参数vaultName accountId path仓库名、账户 ID、本地写入路径。第一步发起inventory-retrieval库存检索类型的 JobJobParameters job JobParameters.builder() .type(inventory-retrieval) .build(); InitiateJobRequest initJob InitiateJobRequest.builder() .jobParameters(job) .accountId(accountId) .vaultName(vaultName) .build(); InitiateJobResponse response glacier.initiateJob(initJob); System.out.println(The job ID is: response.jobId());第二步轮询 Job 状态。源码注释明确指出Polling a Job may take 4-6 hours according to the Documentation——S3 Glacier 的检索 Job 是异步任务可能需要数小时才能完成因此示例用while循环每秒调用一次describeJob()直到statusCodeAsString()返回Succeededwhile (!finished) { DescribeJobResponse response glacier.describeJob(jobRequest); jobStatus response.statusCodeAsString(); if (jobStatus.compareTo(Succeeded) 0) finished true; else { System.out.println(yy status is: jobStatus); Thread.sleep(1000); } yy; }第三步Job 成功后调用getJobOutputAsBytes()SDK 提供的便捷方法一次性返回响应体字节写入本地文件ResponseBytesGetJobOutputResponse objectBytes glacier.getJobOutputAsBytes(jobOutputRequest); byte[] data objectBytes.asByteArray(); OutputStream os new FileOutputStream(myFile); os.write(data); os.close();需要说明inventory-retrieval类型的 Job 返回的是仓库库存清单归档元数据列表而非单个归档内容。若需要下载某个具体归档应将JobParameters.type改为archive-retrieval并补充archiveId——本示例保留了最简实现开发者可在此基础上扩展。6. 删除归档与删除仓库DeleteArchive.java 调用glacier.deleteArchive()命令行参数为vaultName accountId archiveId三者都需要显式提供DeleteArchiveRequest delArcRequest DeleteArchiveRequest.builder() .vaultName(vaultName) .accountId(accountId) .archiveId(archiveId) .build(); glacier.deleteArchive(delArcRequest); System.out.println(The archive was deleted.);DeleteVault.java 调用glacier.deleteVault()只需vaultNameDeleteVaultRequest delVaultRequest DeleteVaultRequest.builder() .vaultName(vaultName) .build(); glacier.deleteVault(delVaultRequest); System.out.println(The vault was deleted!);重要约束S3 Glacier 要求删除仓库前仓库必须为空没有任何归档。因此在真实流程中DeleteVault 应放在 DeleteArchive 之后执行测试文件也正是按这个顺序编排的。构建与运行用 Maven 构建按 javav2/README.md 的说明在glacier目录下执行mvn packageMaven 会自动下载 AWS SDK for Java 等依赖。若希望打包出包含全部依赖的 uber JAR可在 POM 中配置maven-shade-plugin官方 README 给出了3.0.0版本的完整插件配置示例打包后在target目录生成类似glacierJ2Example-1.0-SNAPSHOT.jar的文件。用 make 构建若平台装有make可直接在包含Makefile的目录下运行makeMakefile本质上是 Maven 命令的封装因此仍需先安装 Maven。运行单个示例类构建完成后可用java -cp直接运行java -cp target/glacierJ2Example-1.0-SNAPSHOT.jar com.example.glacier.CreateVault myVaultName更便捷的方式是使用仓库自带的 run_example.sh它设置CLASSPATHtarget/sdk-glacier-examples-1.0.jar并通过mvn exec:java以com.example.glacier.$className作为主类执行剩余参数原样传给主类./run_example.sh CreateVault myVaultName ./run_example.sh UploadArchive C:\\AWS\\test.pdf myVaultName各示例参数速查示例类参数说明CreateVaultvaultName要创建的仓库名DescribeVaultvaultName要描述的仓库名ListVaults无列举当前账户全部仓库UploadArchivestrPath vaultName本地文件路径 仓库名ArchiveDownloadvaultName accountId path仓库名 账户 ID 本地输出路径DeleteArchivevaultName accountId archiveId仓库名 账户 ID 归档 IDDeleteVaultvaultName要删除的仓库名须为空仓库用 JUnit 5 跑集成测试原 README 提醒运行测试可能产生 AWS 账户费用。测试文件位于 src/test/java/GlacierTest.java使用 JUnit 5Jupiter全部标记Tag(IntegrationTest)按Order(1)~Order(7)顺序执行 7 个用例testCreateVault— 调用CreateVault.createGlacierVault();testDescribeVault— 调用DescribeVault.describeGlacierVault();testListVaults— 调用ListVaults.listAllVault();testUploadArchive— 上传后断言返回的archiveId非空testArchiveDownload— 调用ArchiveDownload.createJob()发起库存检索 JobtestDeleteArchive— 用上一步得到的archiveId调用DeleteArchive.deleteGlacierArchive()testDeleteVault— 对一个空仓库调用DeleteVault.deleteGlacierVault()。测试参数从哪里来测试所需的vaultName、strPath、downloadVault、accountId、emptyVault通过getSecretValues()从AWS Secrets Manager读取Secret 名为test/glacierSecretsManagerClient secretClient SecretsManagerClient.builder() .region(Region.US_EAST_1) .build(); GetSecretValueRequest valueRequest GetSecretValueRequest.builder() .secretId(test/glacier) .build(); GetSecretValueResponse valueResponse secretClient.getSecretValue(valueRequest); return valueResponse.secretString();拿到 JSON 后内嵌类SecretValues用 Gson 反序列化为字段。从源码结构可以推断该 Secret 的 JSON 至少包含vaultName、strPath、downloadVault、emptyVault、accountId五个键。运行测试前需预先创建好这些资源如用于下载测试的downloadVault、用于删除测试的空仓库emptyVault并在 Secret 中配置对应值。运行命令mvn test由于maven-surefire-plugin配置了groupsIntegrationTest/groups只有打了该标签的用例会被执行。执行时会看到类似Test 1 passed... 的日志输出全部通过后 Maven 报告Tests run: 7, Failures: 0, Errors: 0, Skipped: 0并输出BUILD SUCCESS。关键源码路径索引主文档javav2/example_code/glacier/README.md前置条件与构建说明javav2/README.md创建仓库CreateVault.java描述仓库DescribeVault.java列举仓库ListVaults.java上传归档含 Tree HashUploadArchive.java发起 Job 与下载ArchiveDownload.java删除归档 / 删除仓库DeleteArchive.java、DeleteVault.java集成测试GlacierTest.java构建配置pom.xml、run_example.sh、metadata.yaml实战建议与注意事项最小权限原则为运行这些示例的 IAM 角色只授予 Glacier 相关的最小权限如glacier:CreateVault、glacier:UploadArchive、glacier:InitiateJob、glacier:DeleteArchive等避免使用管理员凭证资源清理顺序删除归档在前、删除仓库在后且仓库必须为空否则删除操作会失败Job 轮询的耗时预期S3 Glacier 检索 Job 可能耗时数小时示例中的每秒轮询仅为演示生产环境应改用事件通知如 SNS Lambda或更长的时间间隔大文件上传超过约 100 MB 的归档应优先使用 Multipart Upload分段上传本示例的 Tree Hash 计算逻辑可作为分段校验的基础实现费用提醒无论是运行示例还是运行测试都会在 AWS 账户中产生实际费用建议使用独立测试账户并提前规划资源生命周期。以上内容以仓库中 glacier/README.md 为主体骨架所有代码细节、构建方式与测试流程均可在 javav2/example_code/glacier 目录下的源码、POM 与测试文件中逐一验证。赞分享示例工程教程后端【免费下载链接】aws-doc-sdk-examplesWelcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below.项目地址https://gitcode.com/gh_mirrors/aw/aws-doc-sdk-examples点击查看免费下载相关推荐使用 AWS SDK for C 操作 Amazon S3 Glacier从创建 Vault 到单次与分片归档上传实战使用 AWS SDK for C 操作 Amazon S3 Glacier从创建 Vault 到单次与分片归档上传实战 导读 本文基于 aws doc s示例工程教程后端Node-static高级用法自定义转换流与动态内容处理技巧Node static高级用法自定义转换流与动态内容处理技巧 Node static是一个强大且高效的HTTP静态文件服务器模块它完全符合RFC 2616标示例工程教程后端使用 AWS SDK for .NET 操作 Amazon S3 Glaciervault 管理与归档上传下载实战使用 AWS SDK for .NET 操作 Amazon S3 Glaciervault 管理与归档上传下载实战 Amazon S3 Glacier 是为不示例工程教程后端上一篇超50%性能提升CUTLASS命令行分析器的GPU优化实战指南下一篇Ink问题排查常见错误的解决方法汇总创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考