使用 Amazon S3 Glacier AWS CLI - AWS Command Line Interface

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 Amazon S3 Glacier AWS CLI

Amazon S3 Glacier 简介

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

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

aws glacier help
注意

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

先决条件

要运行 glacier 命令,您需要:

  • 安装和配置 AWS CLI。有关更多信息,请参阅安装或更新到最新版本的 AWS CLI的身份验证和访问凭证 AWS 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 -) 以使用当前账户。

准备要上传的文件

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

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'

启动文件分段上传和上传

使用 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,用来配置分段上传。操作完成后, AWS 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 需要原始文件的树形哈希值,以确认所有上传的片段都 AWS 完好无损。

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

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

注意

Windows 用户可使用 type 命令来代替 cat。Op SSL en 在 Windows 上可用,网址为 Op SSL en.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 开发人员指南》中的分段上传大型档案计算校验和

资源

AWS CLI 参考:

服务参考: