使用 AWS CLI上传大型档案 - Amazon S3 Glacier

此页面仅适用于使用保管库的 S3 Glacier 服务的现有客户以及 2012 年以RESTAPI来的原始客户。

如果您正在寻找档案存储解决方案,我们建议您在亚马逊 S3、S3 Glacier 即时检索、S3 Glacier 灵活检索和 S3 Glacier Deep Archive Dee p Archive 中使用 S3 Glacier 存储类。要了解有关这些存储选项的更多信息,请参阅 Amazon S3 用户指南中的 S3 Glacier 存储类和使用 S3 Glacier 存储类的长期数据存储。这些存储类别使用 Amazon S3API,适用于所有区域,并且可以在 Amazon S3 控制台中进行管理。它们提供存储成本分析、存储镜头、高级可选加密功能等功能。

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

使用 AWS CLI上传大型档案

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

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

(先决条件)设置 AWS CLI

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

    正在安装 AWS Command Line Interface

    正在配置 AWS Command Line Interface

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

    • 尝试使用 help 命令。

      aws help
    • 要获取已配置账户上 S3 Glacier 文件库的列表,请使用 list-vaults 命令。Replace(替换) 123456789012 带上你的 AWS 账户 身份证。

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

      aws configure list

(先决条件)安装 Python

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

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

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

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

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

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

重要

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

以下过程使用initiate-multipart-uploadupload-multipart-part、和complete-multipart-upload AWS CLI 命令。

有关所有这些命令的更多详细信息,请参阅《AWS 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 中的位置。