使用分段上传来上传和复制对象 - Amazon Simple Storage Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

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

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

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

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

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

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

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

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

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

注意

有关将 Amazon S3 Express One Zone 存储类与目录存储桶配合使用的更多信息,请参阅 目录存储桶和 S3 Express One Zone目录存储桶概述。有关将分段上传用于 S3 Express One Zone 和目录存储桶的更多信息,请参阅对目录桶使用分段上传

分段上传流程

分段上分为三个步骤:开始上传、上传对象分段,以及在上传所有分段后完成分段上传。在收到完成分段上传请求后,Amazon S3 会利用上传的分段创建对象,然后您可以像在您的存储桶中访问任何其他对象一样访问该对象。

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

分段上传开始

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

分段上传

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

当您上传某个分段时,Amazon S3 将在响应中返回此分段的实体标签(ETag)作为标头。对于每个分段上传,您必须记录分段编号和 ETag 值。您必须在随后的请求中包括这些值以完成分段上传。每个分段在上传时都有自己的 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 版本控制时,完成分段上传将始终创建一个新版本。当您在启用版本控制的存储桶中启动使用相同对象键的多个分段上传时,对象的当前版本将由最新(createdDate)开始的上传决定。例如,假设您在上午 10:00 启动对某个对象的 CreateMultipartUpload 请求。然后,您在上午 11:00 提交对同一对象的第二个 CreateMultipartUpload 请求。因为第二个请求是最新提交的,所以上午 11:00 的请求所上传的对象将是当前版本,即使第一个上传是在第二个上传之后完成的,也是如此。对于未启用版本控制的存储桶,在开始分段上传和完成分段上传期间接收的某些其他请求可能会优先开始。

注意

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

防止在分段上传期间上传具有相同键名称的对象

在对上传操作使用有条件写入来创建对象之前,您可以检查存储桶中是否存在该对象。这样可以防止覆盖现有数据。当上传时,有条件写入将验证存储桶中尚不存在具有相同键名称的现有对象。

可以将有条件写入用于 PutObjectCompleteMultipartUpload 请求。

有关有条件请求的更多信息,请参阅使用有条件请求向 S3 操作添加前提条件

分段上传和定价

开始分段上传后,Amazon S3 将保留所有分段,直到您完成或停止上传。在整个其生命周期内,您将支付有关此分段上传及其关联分段的所有存储、带宽和请求的费用。

这些分段根据上传分段时指定的存储类收费。这种情况的一个例外是上传到 S3 Glacier Flexible Retrieval 或 S3 Glacier Deep Archive 的分段。在上传完成之前,针对 S3 Glacier Flexible Retrieval 存储类的 PUT 请求的正在上传的分段采用 S3 Standard 存储费率按 S3 Glacier Flexible Retrieval 暂存存储计费。此外,CreateMultipartUpload 和 UploadPart 均按 S3 Standard 费率计费。只有 CompleteMultipartUpload 请求按照 S3 Glacier Flexible Retrieval 费率计费。同样,在上传完成之前,针对 S3 Glacier Deep Archive 存储类的 PUT 请求的正在上传的分段采用 S3 Standard 存储费率按 S3 Glacier Flexible Retrieval 暂存存储计费,而只有 CompleteMultipartUpload 请求按 S3 Glacier Deep Archive 费率计费。

如果您停止分段上传,Amazon S3 将删除上传构件和已上传的任何分段,您将不再支付它们的费用。无论指定的存储类如何,删除未完成的分段上传均不收取提前删除费用。有关定价的更多信息,请参阅 Amazon S3 定价

注意

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

分段上传的 API 支持

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

有关使用 Amazon Lambda 函数的分段上传演练,请参阅 Uploading large objects to Amazon S3 using multipart upload and transfer acceleration

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

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

Amazon SDK 对于分段上传的支持

您可以使用 Amazon SDK 分段上传对象。有关 API 操作支持的 Amazon SDK 的列表,请参阅:

分段上传 API 和权限

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

操作 所需权限

创建分段上传

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

存储桶拥有者可以允许其他主体执行 s3:PutObject 操作。

开始分段上传

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

存储桶拥有者可以允许其他主体执行 s3:PutObject 操作。

发起者

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

上传分段

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

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

上传分段(复制)

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

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

完成分段上传

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

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

停止分段上传

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

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

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

列出分段

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

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

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

列出分段上传

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

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

Amazon KMS 加密和解密相关权限

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

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

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