在 Amazon CLI 中使用 Amazon S3 Glacier
| 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和Amazon CLI 身份验证和访问凭证。
-
本教程使用几个命令行工具,这些工具通常预装在 Unix 类操作系统上,包括 Linux 和 macOS。Windows 用户可以通过安装 Cygwin
并从 Cygwin 终端运行命令来使用相同的工具。如有可执行相同功能的 Windows 本机命令和实用工具,我们会注明。
创建 Amazon S3 Glacier 文件库
使用 create-vault 命令创建文件库。
$aws glacier create-vault --account-id - --vault-namemyvault{ "location": "/123456789012/vaults/myvault" }
注意
所有 S3 Glacier 命令都需要一个账户 ID 参数。使用连字符 (--account-id -) 以使用当前账户。
准备要上传的文件
创建一个用于测试上传的文件。以下命令将创建一个正好包含 3 MiB 随机数据的名为 largefile 的文件。
Linux 或 macOS
$dd if=/dev/urandom of=largefilebs=3145728 count=11+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 createnewlargefile3145728File C:\temp\largefile is created
接下来,使用文件拆分器将文件拆分为 1 MiB(1,048,576 字节)的块。
$split -b 1048576 --verboselargefilechunkcreating 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-namemyvault{ "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 --bodychunkaa--range 'bytes 0-1048575/*' --account-id - --vault-namemyvault{ "checksum": "e1f2a7cd6e047fa606fe2f0280350f69b9f8cfa602097a9a026360a7edc1f553" }$aws glacier upload-multipart-part --upload-id $UPLOADID --bodychunkab--range 'bytes 1048576-2097151/*' --account-id - --vault-namemyvault{ "checksum": "e1f2a7cd6e047fa606fe2f0280350f69b9f8cfa602097a9a026360a7edc1f553" }$aws glacier upload-multipart-part --upload-id $UPLOADID --bodychunkac--range 'bytes 2097152-3145727/*' --account-id - --vault-namemyvault{ "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 MiB 的部分(如果您还没有这样做)。
$split --bytes=1048576 --verbose largefile chunkcreating file `chunkaa' creating file `chunkab' creating file `chunkac' -
计算并存储每个区块的二进制 SHA-256 哈希。
$openssl dgst -sha256 -binary chunkaa >hash1$openssl dgst -sha256 -binary chunkab >hash2$openssl dgst -sha256 -binary chunkac >hash3 -
合并前两个哈希,并采用结果的二进制哈希。
$cat hash1 hash2 > hash12$openssl dgst -sha256 -binary hash12 > hash12hash -
将区块
aa和ab的父哈希与区块ac的哈希合并并对结果进行哈希处理,此时将输出十六进制。将结果存储在 shell 变量中。$cat hash12hash hash3 > hash123$openssl dgst -sha256 hash123SHA256(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 参考:》
《服务参考:》