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

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

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

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

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

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

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

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

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

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

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

分段上传流程

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

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

分段上传开始

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

分段上传

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

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

注意

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

分段上传完成

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

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

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

分段上传列表

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

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

并发分段上传操作

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

注意

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

分段上传和定价

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

分段上传的 API 支持

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

分段上传的 Amazon Command Line Interface 支持

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

分段上传的 Amazon 开发工具包支持

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

分段上传 API 和权限

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

操作 所需权限

创建分段上传

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

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

开始分段上传

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

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

启动程序

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

Upload Part

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

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

上传分段(复制)

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

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

完成分段上传

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

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

停止分段上传

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

默认情况下,允许存储桶拥有者和分段上传的发起者执行此操作。如果发起者是 IAM 用户,也允许该用户的 Amazon Web Services 账户 停止此分段上传。

除了这些默认情况之外,存储桶拥有者可以允许其他委托人对对象执行 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* 操作。这些权限是必需的,因为 Amazon S3 必须在完成分段上传之前解密并读取加密的文件段中的数据。

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

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

有关 ACL 权限与访问策略中的权限之间关系的信息,请参阅 ACL 权限和访问策略权限的映射。有关 IAM 用户的信息,请参阅使用用户和组