

**本文档仅适用于 Amazon CLI 版本 1。**

我们已宣布即将终止对 Amazon CLI 版本 1 的支持。建议您迁移到 Amazon CLI 版本 2。有关日期、其它详细信息以及如何迁移的信息，请参阅[公告](https://www.amazonaws.cn/blogs/developer/cli-v1-maintenance-mode-announcement/)。有关 Amazon CLI 版本 2 的相关文档，请参阅[版本 2 用户指南](https://docs.amazonaws.cn/cli/latest/userguide/)。

# 在 Amazon CLI 中使用 Amazon Glacier
<a name="cli-services-glacier"></a>


| Amazon Glacier 简介 | 
| --- | 
|    | 

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

您可以使用 Amazon Command Line Interface（Amazon CLI）访问 Amazon Glacier 功能。要列出 Amazon Glacier 的 Amazon CLI 命令，请使用以下命令。

```
aws glacier help
```

**注意**  
有关命令参考和其他示例，请参阅**《Amazon CLI 命令参考》中的 `[aws glacier](https://docs.amazonaws.cn/cli/v1/reference/glacier/index.html)`。

**Topics**
+ [先决条件](#cli-services-glacier-prereqs)
+ [创建 Amazon Glacier 保管库](#cli-services-glacier-vault)
+ [准备要上传的文件](#cli-services-glacier-prep)
+ [启动文件分段上传和上传](#cli-services-glacier-initiate)
+ [完成上传](#cli-services-glacier-complete)
+ [资源](#cli-services-glacier-resources)

## 先决条件
<a name="cli-services-glacier-prereqs"></a>

要运行 `glacier` 命令，您需要：
+ 安装和配置 Amazon CLI。有关更多信息，请参阅 [安装、更新和卸载 Amazon CLI](cli-chap-install.md) 和 [Amazon CLI 身份验证和访问凭证](cli-chap-authentication.md)。
+ 本教程使用几个命令行工具，这些工具通常预装在 Unix 类操作系统上，包括 Linux 和 macOS。Windows 用户可以通过安装 [Cygwin](https://www.cygwin.com/) 并从 Cygwin 终端运行命令来使用相同的工具。如有可执行相同功能的 Windows 本机命令和实用工具，我们会注明。

## 创建 Amazon Glacier 保管库
<a name="cli-services-glacier-vault"></a>

使用 `[create-vault](https://docs.amazonaws.cn/cli/v1/reference/glacier/create-vault.html)` 命令创建文件库。

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

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

## 准备要上传的文件
<a name="cli-services-glacier-prep"></a>

创建一个用于测试上传的文件。以下命令将创建一个正好包含 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'
```

## 启动文件分段上传和上传
<a name="cli-services-glacier-initiate"></a>

使用 `[initiate-multipart-upload](https://docs.amazonaws.cn/cli/v1/reference/glacier/initiate-multipart-upload.html)` 命令在 Amazon 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"
}
```

Amazon 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](https://docs.amazonaws.cn/cli/v1/reference/glacier/upload-multipart-part.html)` 命令上传三个部分的每个部分。

```
$ 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%`）的任一侧使用百分号 (%) 。

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

## 完成上传
<a name="cli-services-glacier-complete"></a>

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

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

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

**注意**  
Windows 用户可使用 `type` 命令来代替 `cat`。OpenSSL 适用于 Windows，可在 [OpenSSL.org](https://www.openssl.org/source/) 找到。

**计算树形哈希**

1. 将原始文件拆分为 1 MiB 的部分（如果您还没有这样做）。

   ```
   $ split --bytes=1048576 --verbose largefile chunk
   creating file `chunkaa'
   creating file `chunkab'
   creating file `chunkac'
   ```

1. 计算并存储每个区块的二进制 SHA-256 哈希。

   ```
   $ openssl dgst -sha256 -binary chunkaa > hash1
   $ openssl dgst -sha256 -binary chunkab > hash2
   $ openssl dgst -sha256 -binary chunkac > hash3
   ```

1. 合并前两个哈希，并采用结果的二进制哈希。

   ```
   $ cat hash1 hash2 > hash12
   $ openssl dgst -sha256 -binary hash12 > hash12hash
   ```

1. 将区块 `aa` 和 `ab` 的父哈希与区块 `ac` 的哈希合并并对结果进行哈希处理，此时将输出十六进制。将结果存储在 shell 变量中。

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

最后，使用 `[complete-multipart-upload](https://docs.amazonaws.cn/cli/v1/reference/glacier/complete-multipart-upload.html)` 命令完成上传。此命令采用原始文件的大小（以字节为单位）、最终树形哈希值（十六进制形式）以及您的账户 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](https://docs.amazonaws.cn/cli/v1/reference/glacier/describe-vault.html)` 命令查看文件库的状态。

```
$ 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"
}
```

**注意**  
基本上每天都会更新一次文件库的状态。有关更多信息，请参阅 [使用文件库](https://docs.amazonaws.cn/amazonglacier/latest/dev/working-with-vaults.html)。

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

```
$ rm chunk* hash*
```

有关分段上传的更多信息，请参阅**《Amazon Glacier 开发人员指南》中的[分段上传大型档案](https://docs.amazonaws.cn/amazonglacier/latest/dev/uploading-archive-mpu.html)和[计算校验和](https://docs.amazonaws.cn/amazonglacier/latest/dev/checksum-calculations.html)。

## 资源
<a name="cli-services-glacier-resources"></a>

** Amazon CLI《参考：**》
+ `[aws glacier](https://docs.amazonaws.cn/cli/v1/reference/glacier/index.html)`
+ `[aws glacier complete-multipart-upload](https://docs.amazonaws.cn/cli/v1/reference/glacier/complete-multipart-upload.html)`
+ `[aws glacier create-vault](https://docs.amazonaws.cn/cli/v1/reference/glacier/create-vault.html)`
+ `[aws glacier describe-vault](https://docs.amazonaws.cn/cli/v1/reference/glacier/describe-vault.html)`
+ `[aws glacier initiate-multipart-upload](https://docs.amazonaws.cn/cli/v1/reference/glacier/initiate-multipart-upload.html)`

**《服务参考：**》
+ [《Amazon Glacier 开发人员指南》](https://docs.amazonaws.cn/amazonglacier/latest/dev/)
+ **《Amazon Glacier 开发人员指南》中的[分段上传大型档案](https://docs.amazonaws.cn/amazonglacier/latest/dev/uploading-archive-mpu.html)
+ **《Amazon Glacier 开发人员指南》中的[计算校验和](https://docs.amazonaws.cn/amazonglacier/latest/dev/checksum-calculations.html)
+ **《Amazon Glacier 开发人员指南》中的[处理保管库](https://docs.amazonaws.cn/amazonglacier/latest/dev/working-with-vaults.html)