将 Amazon S3 Glacier 与 Amazon CLI 结合使用 - Amazon Command Line Interface
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

将 Amazon S3 Glacier 与 Amazon CLI 结合使用

Amazon S3 Glacier 简介

本主题显示执行 S3 Glacier 常见任务的 Amazon CLI 命令。这些示例演示如何使用 Amazon CLI 将大型文件上传到 S3 Glacier,方法是将它拆分为较小的部分并从命令行上传它们。

您可以使用 Amazon Command Line Interface (Amazon CLI) 访问 Amazon S3 Glacier 功能。要列出 S3 Glacier 的 Amazon CLI 命令,请使用以下命令。

aws glacier help
注意

有关命令参考和其他示例,请参阅《Amazon CLI 命令参考》中的 aws glacier

先决条件

要运行 glacier 命令,您需要:

  • 安装和配置 Amazon CLI。有关更多信息,请参阅 安装或更新到最新版本的 Amazon CLI身份验证和访问凭证

  • 本教程使用几个命令行工具,这些工具通常预装在 Unix 类操作系统上,包括 Linux 和 macOS。Windows 用户可以通过安装 Cygwin 并从 Cygwin 终端运行命令来使用相同的工具。如有可执行相同功能的 Windows 本机命令和实用工具,我们会注明。

创建 Amazon S3 Glacier 文件库

使用 create-vault 命令创建文件库。

$ aws glacier create-vault --account-id - --vault-name myvault { "location": "/123456789012/vaults/myvault" }
注意

所有 S3 Glacier 命令都需要一个账户 ID 参数。使用连字符 (--account-id -) 以使用当前账户。

准备要上传的文件

创建一个用于测试上传的文件。以下命令将创建一个正好包含 3 MiB 随机数据的名为 largefile 的文件。

Linux 或 macOS

$ dd if=/dev/urandom of=largefile bs=3145728 count=1 1+0 records in 1+0 records out 3145728 bytes (3.1 MB) copied, 0.205813 s, 15.3 MB/s

dd 是一个实用工具,该实用工具将大量字节从输入文件复制到输出文件。上一个示例使用系统设备文件 /dev/urandom 作为随机数据的源。fsutil 在 Windows 中执行相似的功能。

Windows

C:\> fsutil file createnew largefile 3145728 File C:\temp\largefile is created

接下来,将文件拆分为 1 MiB(1,048,576 字节)的区块。

$ split -b 1048576 --verbose largefile chunk creating file `chunkaa' creating file `chunkab' creating file `chunkac'
注意

HJ-Split 是一个免费的文件拆分器,适用于 Windows 和很多其他平台。

启动文件分段上传和上传

使用 initiate-multipart-upload 命令在 Amazon S3 Glacier 中创建分段上传。

$ aws glacier initiate-multipart-upload --account-id - --archive-description "multipart upload test" --part-size 1048576 --vault-name myvault { "uploadId": "19gaRezEXAMPLES6Ry5YYdqthHOC_kGRCT03L9yetr220UmPtBYKk-OssZtLqyFu7sY1_lR7vgFuJV6NtcV5zpsJ", "location": "/123456789012/vaults/myvault/multipart-uploads/19gaRezEXAMPLES6Ry5YYdqthHOC_kGRCT03L9yetr220UmPtBYKk-OssZtLqyFu7sY1_lR7vgFuJV6NtcV5zpsJ" }

S3 Glacier 需要每个部分的大小以字节为单位(本例中以 1 MiB 为单位)、您的文件库名称和一个账户 ID,用来配置分段上传。操作完成时,Amazon CLI 会输出一个上传 ID。将上传 ID 保存到 shell 变量以待将来使用。

Linux 或 macOS

$ UPLOADID="19gaRezEXAMPLES6Ry5YYdqthHOC_kGRCT03L9yetr220UmPtBYKk-OssZtLqyFu7sY1_lR7vgFuJV6NtcV5zpsJ"

Windows

C:\> set UPLOADID="19gaRezEXAMPLES6Ry5YYdqthHOC_kGRCT03L9yetr220UmPtBYKk-OssZtLqyFu7sY1_lR7vgFuJV6NtcV5zpsJ"

接下来,使用 upload-multipart-part 命令上传三个部分的每个部分。

$ aws glacier upload-multipart-part --upload-id $UPLOADID --body chunkaa --range 'bytes 0-1048575/*' --account-id - --vault-name myvault { "checksum": "e1f2a7cd6e047fa606fe2f0280350f69b9f8cfa602097a9a026360a7edc1f553" } $ aws glacier upload-multipart-part --upload-id $UPLOADID --body chunkab --range 'bytes 1048576-2097151/*' --account-id - --vault-name myvault { "checksum": "e1f2a7cd6e047fa606fe2f0280350f69b9f8cfa602097a9a026360a7edc1f553" } $ aws glacier upload-multipart-part --upload-id $UPLOADID --body chunkac --range 'bytes 2097152-3145727/*' --account-id - --vault-name myvault { "checksum": "e1f2a7cd6e047fa606fe2f0280350f69b9f8cfa602097a9a026360a7edc1f553" }
注意

上一个示例使用美元符号 ($) 在 Linux 上引用 UPLOADID shell 变量的内容。在 Windows 命令行上,在变量名称(例如, %UPLOADID%)的任一侧使用百分号 (%) 。

在上传各个部分时,您必须指定其字节范围,以便 S3 Glacier 可以按正确的顺序重组它。由于每个部分的大小为 1,048,576 字节,因此第一个部分占用 0-1048575 字节,第二个部分占用 1048576-2097151 字节,第三个部分占用 2097152-3145727 字节。

完成上传

Amazon S3 Glacier 需要原始文件的树形哈希,以确认所有上传的部分都已完整地到达Amazon。

要计算树形哈希,必须将文件拆分为 1 MiB 的部分并计算每个部分的二进制 SHA-256 哈希。然后,将哈希列表拆分成对,合并每对中的两个二进制哈希,并采用结果的哈希。重复此步骤,直到只剩下一个哈希。如果任一级别出现奇数数量的哈希,请将其提升到下一级别而无需修改。

在使用命令行实用工具时,正确计算树形哈希的关键是以二进制的形式存储每个哈希,并且仅在最后一步将其转换为十六进制。对树中的任何哈希的十六进制版本进行合并或哈希处理将导致错误结果。

注意

Windows 用户可使用 type 命令来代替 cat。OpenSSL 适用于 Windows,可在 OpenSSL.org 找到。

计算树形哈希
  1. 将原始文件拆分为 1 MiB 的部分(如果您还没有这样做)。

    $ split --bytes=1048576 --verbose largefile chunk creating file `chunkaa' creating file `chunkab' creating file `chunkac'
  2. 计算并存储每个区块的二进制 SHA-256 哈希。

    $ openssl dgst -sha256 -binary chunkaa > hash1 $ openssl dgst -sha256 -binary chunkab > hash2 $ openssl dgst -sha256 -binary chunkac > hash3
  3. 合并前两个哈希,并采用结果的二进制哈希。

    $ cat hash1 hash2 > hash12 $ openssl dgst -sha256 -binary hash12 > hash12hash
  4. 将区块 aaab 的父哈希与区块 ac 的哈希合并并对结果进行哈希处理,此时将输出十六进制。将结果存储在 shell 变量中。

    $ cat hash12hash hash3 > hash123 $ openssl dgst -sha256 hash123 SHA256(hash123)= 9628195fcdbcbbe76cdde932d4646fa7de5f219fb39823836d81f0cc0e18aa67 $ TREEHASH=9628195fcdbcbbe76cdde932d4646fa7de5f219fb39823836d81f0cc0e18aa67

最后,使用 complete-multipart-upload 命令完成上传。此命令采用原始文件的大小(以字节为单位)、最终树形哈希值(十六进制形式)以及您的账户 ID 和文件库名称。

$ aws glacier complete-multipart-upload --checksum $TREEHASH --archive-size 3145728 --upload-id $UPLOADID --account-id - --vault-name myvault { "archiveId": "d3AbWhE0YE1m6f_fI1jPG82F8xzbMEEZmrAlLGAAONJAzo5QdP-N83MKqd96Unspoa5H5lItWX-sK8-QS0ZhwsyGiu9-R-kwWUyS1dSBlmgPPWkEbeFfqDSav053rU7FvVLHfRc6hg", "checksum": "9628195fcdbcbbe76cdde932d4646fa7de5f219fb39823836d81f0cc0e18aa67", "location": "/123456789012/vaults/myvault/archives/d3AbWhE0YE1m6f_fI1jPG82F8xzbMEEZmrAlLGAAONJAzo5QdP-N83MKqd96Unspoa5H5lItWX-sK8-QS0ZhwsyGiu9-R-kwWUyS1dSBlmgPPWkEbeFfqDSav053rU7FvVLHfRc6hg" }

您也可以使用 describe-vault 命令查看文件库的状态。

$ aws glacier describe-vault --account-id - --vault-name myvault { "SizeInBytes": 3178496, "VaultARN": "arn:aws:glacier:us-west-2:123456789012:vaults/myvault", "LastInventoryDate": "2018-12-07T00:26:19.028Z", "NumberOfArchives": 1, "CreationDate": "2018-12-06T21:23:45.708Z", "VaultName": "myvault" }
注意

基本上每天都会更新一次文件库的状态。有关更多信息,请参阅 使用文件库

现在可以安全删除您创建的块和哈希文件。

$ rm chunk* hash*

有关分段上传的更多信息,请参阅《Amazon S3 Glacier 开发人员指南》中的分段上传大型档案计算校验和

资源

Amazon CLI 参考:

服务参考: