使用分段上传来上传和复制对象 - Amazon Simple Storage Service

使用分段上传来上传和复制对象

分段上传允许上传单个对象作为一组分段。每个分段都是对象数据的连续部分。您可以独立上传以及按任意顺序上传这些对象分段。如果任意分段传输失败,可以重新传输该分段且不会影响其他分段。上传完所有的数据元分段后,Amazon S3 将汇集这些分段并创建数据元。一般而言,如果您的对象大小达到了 100 MB,您应该考虑使用分段上传,而不是在单个操作中上传对象。

使用分段上传可提供以下优势:

  • 提高吞吐量 – 您可以并行上传分段以提高吞吐量。

  • 从任何网络问题中快速恢复 – 较小的分段大小可以将由于网络错误而需重启失败的上传所产生的影响降至最低。

  • 暂停和恢复对象上传 – 您可以在一段时间内逐步上传对象分段。启动分段上传后,不存在过期期限;您必须显式地完成或停止分段上传。

  • 在您知道对象的最终大小前开始上传 – 您可以在创建对象时将其上传。

我们建议您按以下方式使用分段上传:

  • 如果您在稳定的高带宽网络上传大型对象,请通过并行分段上传对象实现多线程上传,使用分段上传以充分利用您的可用带宽。

  • 如果您在断点网络中上传对象,请使用分段上传以提高应对网络错误的复原能力,从而避免重新上传。在使用分段上传时,您只需重新尝试上传在上传期间中断的部分即可。而无需从头重新开始上传对象。

分段上传流程

分段上分为三个步骤:开始上传、上传对象分段,以及在上传所有分段后完成分段上传。收到完成分段上传请求后,Amazon S3 将构建来自已上传分段的数据元,然后您可以像在您的桶中访问任何其他对象一样访问该对象。

您可以列出所有正在执行的分段上传,或者获取为特定分段上传操作上传的分段列表。以上每个操作都在本节中进行了说明。

分段上传开始

当您发送请求以开始分段上传时,Amazon S3 将返回具有上传 ID 的响应,此 ID 是分段上传的唯一标识符。无论您何时上传分段、列出分段、完成上传或停止上传,您都必须包括此上传 ID。如果您想要提供描述已上传的对象的任何元数据,必须在请求中提供它以开始分段上传。

分段上传

上传分段时,除了指定上传 ID,还必须指定分段编号。您可以选择 1 和 10000 之间的任意分段编号。分段编号在您正在上传的对象中唯一地识别分段及其位置。您选择的分段编号不必是连续序列(例如,它可以是 1、5 和 14)。如果您使用之前上传的分段的同一分段编号上传新分段,则之前上传的分段将被覆盖。

无论您何时上传分段,Amazon S3 都将在其响应中返回实体标签 (ETag) 标头。对于每个分段上传,您必须记录分段编号和 ETag 值。您必须在随后的请求中包括这些值以完成分段上传。

注意

启动分段上传并上传一个或多个段之后,您必须完成或停止分段上传,才能不再被收取上传的分段的存储费用。只有在完成或停止分段上传之后,Amazon S3 才会释放分段存储并停止向您收取分段存储费用。

停止分段上传后,无法再次使用该上传 ID 上传任何分段。如果有任何分段上传正在进行,则即使在您停止上传后,它们仍然可能会成功或失败。为了确保释放所有分段使用的所有存储,必须仅在完成所有分段的上传后才停止分段上传。

分段上传完成

完成分段上传时,Amazon S3 通过按升序的分段编号规范化分段来创建对象。如果在开始分段上传请求中提供了任何对象元数据,则 Amazon S3 会将该元数据与对象相关联。成功完成请求后,分段将不再存在。

完成分段上传请求必须包括上传 ID 以及分段编号和相应的 ETag 值的列表。Amazon S3 响应包括可唯一地识别组合对象数据的 ETag。此 ETag 无需成为对象数据的 MD5 哈希。

分段上传调用示例

对于此示例,假设您正在为一个 100 GB 的文件生成分段上传。在这种情况下,您应在整个过程中进行以下 API 调用。总共将有 1002 个 API 调用。

分段上传列表

您可以列出特定分段上传或所有正在进行的分段上传的分段。列出分段操作将返回您已为特定分段上传而上传的分段信息。对于每个列出分段请求,Amazon S3 将返回有关特定分段上传的分段信息,最多为 1000 个分段。如果分段上传中的分段超过 1000 个,您必须发送一系列列出分段请求以检索所有分段。请注意,返回的分段列表不包括未完成上传的分段。使用列出分段上传 操作,您可以获得正在进行的分段上传的列表。

正在进行的分段上传是已开始但还未完成或停止的上传。每个请求将返回最多 1000 个分段上传。如果正在进行的分段上传超过 1000 个,您必须发送其他请求才能检索剩余的分段上传。仅使用返回的列表进行验证。发送完成分段上传 请求时,请勿使用此列表的结果。相反,当上传分段和 Amazon S3 返回的相应 ETag 值时,请保留您自己的指定分段编号的列表。

使用分段上传操作的校验和

在将对象上传到 Amazon S3 时,可指定校验和算法以供 Amazon S3 使用。默认情况下,Amazon S3 使用 MD5 来验证数据完整性;但是,您可以指定要使用的其他校验和算法。使用 MD5 时,Amazon S3 会在上传完成后计算整个分段对象的校验和。此校验和不是整个对象的校验和,而是每个分段的校验和的校验和。

当您指示 Amazon S3 使用其他校验和时,Amazon S3 会计算每个分段的校验和值并存储这些值。您可以使用 API 或 SDK 通过 GetObjectHeadObject 来检索单个分段的校验和值。如果您想检索仍在进行的分段上传的各个分段的校验和值,可以使用 ListParts

重要

如果您结合其他校验和使用分段上传,则分段编号必须是连续的编号。使用其他校验和时,如果您尝试使用非连续分段编号完成分段上传请求,Amazon S3 将生成 HTTP 500 Internal Server Error 错误。

有关校验和如何处理分段对象的更多信息,请参阅检查对象完整性

并发分段上传操作

在分布式开发环境中,您的应用程序可以同时在同一对象上开始多个更新。您的应用程序可能会使用同一对象键开始多个分段上传。然后,对于其中每个上传,您的应用程序可以上传分段并将完成上传请求发送到 Amazon S3,以创建数据元。当桶启用了 S3 版本控制时,完成分段上传将始终创建一个新版本。对于未启用版本控制的桶,在开始分段上传和完成分段上传期间接收的某些其他请求可能会优先开始。

注意

在开始分段上传和完成分段上传期间接收的某些其他请求可能会优先开始。例如,如果在使用键开始分段上传之后,但在完成分段上传之前其他操作删除了该键,则完成分段上传响应可能表示在未看到对象的情况下即成功创建了对象。

分段上传和定价

开始分段上传后,Amazon S3 将保留所有分段,直到您完成或停止上传。在整个其生命周期内,您将支付有关此分段上传及其关联分段的所有存储、带宽和请求的费用。如果您停止分段上传,Amazon S3 将删除上传构件和已上传的任何分段,您将不再支付它们的费用。有关定价的更多信息,请参阅 Amazon S3 定价

注意

为了最大程度地降低存储成本,我们建议您配置生命周期规则,以便使用 AbortIncompleteMultipartUpload 操作在指定的天数后删除未完成的分段上传。有关创建生命周期规则以删除未完成的分段上传的更多信息,请参阅配置桶生命周期配置以删除未完成的分段上传

分段上传的 API 支持

这些库提供了易于上传分段对象的高级别抽象。但是,如果需要您的应用程序,您可以直接使用 REST API。Amazon Simple Storage Service API 参考的下面几节描述了适用于分段上传的 REST API。

AWS Command Line Interface 对于分段上传的支持

AWS Command Line Interface 中的以下主题介绍了适用于分段上传的操作。

AWS 软件开发工具包对于分段上传的支持

您可以使用 AWS 软件开发工具包分段上传对象。有关 API 操作支持的 AWS 软件开发工具包的列表,请参阅:

分段上传 API 和权限

您必须具有使用分段上传操作的所需权限。您可以使用访问控制列表(ACL)、桶策略或用户策略来授予个人执行这些操作的权限。下表列出了使用 ACL、桶策略或用户策略时,各种分段上传操作的所需权限。

操作 所需权限

创建分段上传

必须允许您对对象执行 s3:PutObject 操作,才能开始分段上传。

桶拥有者可以允许其他委托人执行 s3:PutObject 操作。

开始分段上传

必须允许您对对象执行 s3:PutObject 操作,才能开始分段上传。

桶拥有者可以允许其他委托人执行 s3:PutObject 操作。

启动程序

标识分段上传启动者的容器元素。如果发起者是 AWS 账户,此元素将提供与 Owner 元素相同的信息。如果发起方是 IAM 用户,此元素将提供用户 ARN 和显示名称。

Upload Part

必须允许您对对象执行 s3:PutObject 操作,才能上传分段。

桶拥有者必须允许发起者对对象执行 s3:PutObject 操作,以便发起者可以上传该对象的分段。

上传分段(复制)

必须允许您对对象执行 s3:PutObject 操作,才能上传分段。因为您正在上传现有对象的分段,因此必须允许您对源对象执行 s3:GetObject

桶拥有者必须允许发起者对对象执行 s3:PutObject 操作,发起者才能上传该对象的分段。

完成分段上传

必须允许您对对象执行 s3:PutObject 操作,才能完成分段上传。

桶拥有者必须允许发起者对对象执行 s3:PutObject 操作,以便发起者可以完成该对象的分段上传。

停止分段上传

必须允许您执行 s3:AbortMultipartUpload 操作,才能停止分段上传。

默认情况下,允许桶拥有者和分段上传的发起者执行此操作,作为 IAM 和桶策略的一部分。如果发起者是 IAM 用户,也允许该用户的 AWS 账户 停止此分段上传。使用 VPC 端点策略,分段上传的启动者不会自动获得执行 s3:AbortMultipartUpload 操作的权限。

除了这些默认情况之外,桶拥有者可以允许其他委托人对对象执行 s3:AbortMultipartUpload 操作。桶拥有者可以拒绝任何委托人,使其无法执行 s3:AbortMultipartUpload 操作。

列出分段

您必须得到可以执行 s3:ListMultipartUploadParts 操作的允许,才能在分段上传中列出分段。

在默认情况下,桶拥有者有权为任何针对桶的分段上传列出分段。分段上传的发起人有权为特定分段上传列出分段。如果分段上传的发起者是 IAM 用户,则控制该 IAM 用户的 AWS 账户 同样有权列出此次上传的分段。

除了这些默认情况之外,桶拥有者可以允许其他委托人对对象执行 s3:ListMultipartUploadParts 操作。桶拥有者也可以拒绝任何委托人,使其无法执行 s3:ListMultipartUploadParts 操作。

列出分段上传

您必须得到可以对桶执行 s3:ListBucketMultipartUploads 操作的允许,才能列出正在上传到该桶的分段上传。

除了默认情况之外,桶拥有者可以允许其他委托人对桶执行 s3:ListBucketMultipartUploads 操作。

AWS KMS 加密和解密相关权限

要使用具有 AWS Key Management Service (AWS KMS) KMS 密钥的加密执行分段上传,请求者必须有权对密钥执行 kms:Decryptkms:GenerateDataKey 操作。这些权限是必需的,因为 Amazon S3 必须在完成分段上传之前解密并读取加密的文件段中的数据。

有关更多信息,请参阅 AWS 知识中心 中的用 AWS KMS key 加密将大型文件上传到 Amazon S3

如果您的 IAM 用户或角色位于与 KMS 密钥相同的 AWS 账户 中,您必须在密钥策略中具有这些权限。如果您的 IAM 用户或角色属于与 KMS 密钥不同的账户,您必须在密钥策略和 IAM 用户或角色中具有这些权限。

有关 ACL 权限与访问策略中的权限之间关系的信息,请参阅 ACL 权限和访问策略权限的映射。有关 IAM 用户、角色和最佳实践的信息,请参阅《IAM 用户指南》中的 IAM 身份(用户、用户组和角色)