使用 Amazon CLI 上传大型档案 - Amazon S3 Glacier
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

如果您不熟悉 Amazon Simple Storage Service (Amazon S3) 中的归档存储功能,建议您先详细了解 Amazon S3 中的 S3 Glacier 存储类、S3 Glacier 即时检索S3 Glacier 灵活检索S3 Glacier 深度归档。有关更多信息,请参阅 Amazon S3 用户指南中的 S3 Glacier 存储类和用于存档对象的存储类。

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

使用 Amazon CLI 上传大型档案

您可以使用 Amazon Command Line Interface (Amazon CLI) 在 Amazon S3 Glacier (S3 Glacier) 中删除档案。为了改善大型档案的上传体验,S3 Glacier 提供了多个 API 操作来支持分段上传。通过这些 API 操作,您可以分段上传档案。您可以独立地、以任何顺序以及并行地上传这些段。如果某个分段上传失败,则您只需重新上传该分段,而无需重新上传整个档案。您可以对大小从 1 字节到大约 40,000 GiB 的档案使用分段上传。

有关 S3 Glacier 分段上传的更多信息,请参阅分段上传大型档案(分段上传)

(先决条件)设置 Amazon CLI

  1. 下载并配置 Amazon CLI。有关说明,请参阅《Amazon Command Line Interface 用户指南》中的以下主题:

    安装 Amazon Command Line Interface

    配置 Amazon Command Line Interface

  2. 在命令提示符处输入以下命令来验证 Amazon CLI 设置。这些命令没有显式提供凭证,因此将使用默认配置文件的凭证。

    • 尝试使用 help 命令。

      aws help
    • 要获取已配置账户上 S3 Glacier 文件库的列表,请使用 list-vaults 命令。将 123456789012 替换为您自己的 Amazon Web Services 账户 ID。

      aws glacier list-vaults --account-id 123456789012
    • 要查看 Amazon CLI 的当前配置数据,请使用 aws configure list 命令。

      aws configure list

(先决条件)安装 Python

要完成分段上传,您必须计算要上传的档案的 SHA256 树形哈希。此操作与计算要上传的文件的 SHA256 树形哈希不同。要计算待上传档案的 SHA256 树形哈希,可以使用 Java、 C#(使用 .NET)或 Python。在此示例中,您将使用 Python。有关使用 Java 或 C# 的说明,请参阅计算校验和

有关安装 Python 的更多信息,请参阅《Boto3 开发人员指南》中的安装或更新 Python

(先决条件)创建 S3 Glacier 文件库

要使用下面的示例,必须至少创建一个 S3 Glacier 文件库。有关如何创建文件库的更多信息,请参阅在 Amazon S3 Glacier 中创建文件库

示例:使用 Amazon CLI 分段上传大型档案

在此示例中,您将创建一个文件并使用分段上传 API 操作将此文件分段上传到 Amazon S3 Glacier。

重要

在开始此过程之前,请确保您已执行所有先决条件的步骤。要上传档案,必须创建文件库,配置 Amazon CLI,并准备好使用 Java、C# 或 Python 来计算 SHA256 树形哈希。

以下过程使用 initiate-multipart-uploadupload-multipart-partcomplete-multipart-upload Amazon CLI 命令。

有关所有这些命令的更多详细信息,请参阅《Amazon CLI 命令参考》中的 initiate-multipart-uploadupload-multipart-partcomplete-multipart-upload

  1. 使用 initiate-multipart-upload 命令创建分段上传资源。在您的请求中,请指定分段大小(以字节数为单位)。除了最后一个分段以外,您上传的每个分段都必须为此大小。启动上传任务时,您不需要知道整个档案的大小。但是,在最后一步完成上传时,您将需要知道每个分段的总大小(以字节为单位)。

    在下面的命令中,将 --vault-name--account-ID 参数的值替换为您自己的信息。此命令指定每个文件将上传分段大小为 1 兆字节 (MiB)(1024 x 1024 字节)的档案。如果需要,请替换此 --part-size 参数值。

    aws glacier initiate-multipart-upload --vault-name awsexamplevault --part-size 1048576 --account-id 123456789012

    预期输出:

    { "location": "/123456789012/vaults/awsexamplevault/multipart-uploads/uploadId", "uploadId": "uploadId" }

    完成后,该命令将输出分段上传资源的上传 ID 和在 S3 Glacier 中的位置。在后续步骤中,您将使用此上传 ID。

  2. 在本示例中,您可以使用以下命令创建一个 4.4 MiB 的文件,将其拆分为 1 MiB 的块,然后上传每个块。要上传自己的文件,您可以按照类似的步骤将数据拆分为多个块并上传每个分段。

    Linux 或 macOS

    以下命令将在 Linux 或 macOS 上创建一个名为 file_to_upload 的 4.4 MiB 的文件。

    mkfile -n 9000b file_to_upload
    Windows

    以下命令将在 Windows 上创建一个名为 file_to_upload 的 4.4 MiB 的文件。

    fsutil file createnew file_to_upload 4608000
  3. 接下来,您将把此文件拆分为 1 MiB 的块。

    split -b 1048576 file_to_upload chunk

    您现在有以下五个块。前四个大小为 1 MiB,最后一个是 400 千字节 (KiB)。

    chunkaa chunkab chunkac chunkad chunkae
  4. 使用 upload-multipart-part 命令以上传档案的一个分段。您可以按任何顺序上传档案分段。此外,您还可以并行上传分段。您最多可以为一个分段上传上传 10 000 段。

    在下面的命令中,将替换 --vault-name--account-ID--upload-id 参数的值。上传 ID 必须与 initiate-multipart-upload 命令输出中提供的 ID 相匹配。--range 参数指定您将上传大小为 1 MiB(1024 x 1024 字节)的分段。此大小必须与您在 initiate-multipart-upload 命令中指定的大小一致。如有必要,请调整此大小值。--body 参数指定您要上传的分段的名称。

    aws glacier upload-multipart-part --body chunkaa --range='bytes 0-1048575/*' --vault-name awsexamplevault --account-id 123456789012 --upload-id upload_ID

    如果成功,该命令将生成包含已上传分段校验和的输出。

  5. 再次运行 upload-multipart-part 命令以上传分段上传的其余部分。更新每个命令的 --range–-body 参数值,使其与您要上传的分段相匹配。

    aws glacier upload-multipart-part --body chunkab --range='bytes 1048576-2097151/*' --vault-name awsexamplevault --account-id 123456789012 --upload-id upload_ID
    aws glacier upload-multipart-part --body chunkac --range='bytes 2097152-3145727/*' --vault-name awsexamplevault --account-id 123456789012 --upload-id upload_ID
    aws glacier upload-multipart-part --body chunkad --range='bytes 3145728-4194303/*' --vault-name awsexamplevault --account-id 123456789012 --upload-id upload_ID
    aws glacier upload-multipart-part --body chunkae --range='bytes 4194304-4607999/*' --vault-name awsexamplevault --account-id 123456789012 --upload-id upload_ID
    注意

    最终命令的 --range 参数值较小,因为上传的最后一个分段小于 1 MiB。如果成功,每个命令都将生成包含每个已上传分段校验和的输出。

  6. 接下来,您将接组档案并完成上传。您必须包括档案的总大小和 SHA256 树形哈希。

    要计算档案的 SHA256 树形哈希,可以使用 Java、 C# 或 Python。在此示例中,您将使用 Python。有关使用 Java 或 C# 的说明,请参阅计算校验和

    创建 Python 文件 checksum.py 并插入以下代码。如果需要,请替换原始文件的名称。

    from botocore.utils import calculate_tree_hash checksum = calculate_tree_hash(open('file_to_upload', 'rb')) print(checksum)
  7. 运行 checksum.py 以计算 SHA256 树形哈希。以下哈希值可能与您的输出不匹配。

    $ python3 checksum.py $ 3d760edb291bfc9d90d35809243de092aea4c47b308290ad12d084f69988ae0c
  8. 使用 complete-multipart-upload 命令完成档案上传。替换 --vault-name--account-ID--upload-ID--checksum 参数的值。--archive 参数值以字节为单位指定档案的总大小。此值必须是为您上传的各段的所有大小之和。如果需要,请替换此值。

    aws glacier complete-multipart-upload --archive-size 4608000 --vault-name awsexamplevault --account-id 123456789012 --upload-id upload_ID --checksum checksum

    完成后,该命令将输出档案的 ID、校验和以及在 S3 Glacier 中的位置。