S3 版本控制的工作原理
您可以使用 S3 版本控制将对象的多个版本保存在一个存储桶中,以便您能够还原意外删除或覆盖的对象。例如,如果您将 S3 版本控制应用于存储桶,则会发生以下变化:
-
如果删除对象(而不是永久移除此对象),则 Amazon S3 会插入删除标记,它将成为当前对象版本。然后,您可以恢复以前的版本。有关更多信息,请参阅 从启用了版本控制的存储桶中删除对象版本。
-
如果覆盖对象,则 Amazon S3 会在存储桶中添加新的对象版本。之前的版本保留在存储桶中,成为非当前版本。您可以还原以前的版本。
注意
对于存储和传输的每个对象版本,都适用正常 Amazon S3 费率。对象的每个版本都是完整的对象;它与以前的版本没有什么区别。因此,如果您存储了三个版本的对象,则会收取您三个对象的费用。
您创建的每个 S3 存储桶都具有关联的 versioning 子资源。(有关更多信息,请参阅 存储桶配置选项。) 默认情况下,您的存储桶不受版本控制,且对子资源进行版本控制会存储空的版本控制配置,如下所示。
<VersioningConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> </VersioningConfiguration>
要启用版本控制,您可以向 Amazon S3 发送请求,在请求中指定包含 Enabled
状态的版本控制配置。
<VersioningConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> <Status>Enabled</Status> </VersioningConfiguration>
要暂停版本控制,请将状态值设置为 Suspended
。
注意
当您首次对存储桶启用版本控制时,可能只需很短的时间即可完全传播更改。我们建议您在启用版本控制后等待 15 分钟,然后再对存储桶中的对象发出写入操作(PUT
或 DELETE
)。
存储桶拥有者和所有获得授权的 Amazon Identity and Access Management(IAM)用户都可以启用版本控制。创建存储桶的存储桶拥有者为 Amazon Web Services 账户。有关权限的更多信息,请参阅Amazon S3 的身份和访问管理。
有关使用 Amazon Web Services Management Console、Amazon Command Line Interface(Amazon CLI)或 REST API 启用和禁用 S3 版本控制的更多信息,请参阅在存储桶上启用版本控制。
版本 ID
如果您为存储桶启用版本控制,Amazon S3 会自动为要存储的对象生成唯一版本 ID。例如,在一个存储桶中,您可以拥有两个具有相同键(对象名称)的对象,但版本 ID 不同,例如 photo.gif
(版本 111111)和 photo.gif
(版本 121212)。
![图中描述了一个启用了版本控制的存储桶,该存储桶有两个具有相同键但版本 ID 不同的对象。](images/versioning_Enabled.png)
无论 S3 版本控制是否启用,每个对象都有一个版本 ID。如果未启用 S3 版本控制,Amazon S3 将版本 ID 的值设置为 null
。如果您启用 S3 版本控制,Amazon S3 会为对象分配版本 ID 值。此值将该对象与同一个键的其他版本区分开来。
在现有存储桶上启用 S3 版本控制时,已存储在存储桶中的对象将保持不变。版本 ID(null
)、内容和权限保持不变。启用 S3 版本控制后,添加到存储桶的每个对象都会获得一个版本 ID,该 ID 将此版本与同一个键的其他版本区分开来。
Amazon S3 仅生成版本 ID,不能编辑它们。版本 ID 是 Unicode、UTF-8 编码、URL 就绪、不透明的字符串,长度不超过 1,024 字节。以下是示例:
3sL4kqtJlcpXroDTDmJ+rmSpXd3dIbrHY+MTRCxf3vjVBH40Nr8X8gdRQBpUMLUo
注意
为简单起见,本主题中的其他示例使用更短的 ID。
版本控制工作流程
当您在启用版本控制的存储桶中通过 PUT
放入对象时,不会覆盖非当前版本。如下图所示,当将 photo.gif
的新版本 PUT
到一个已经包含同名对象的存储桶中时,会发生以下行为:
-
原始对象(ID = 111111)保留在存储桶中。
-
Amazon S3 生成一个新的版本 ID(121212),并将这个较新版本的对象添加到存储桶中。
![描述在 PUT 对象(位于已启用版本控制的存储桶中)时 S3 版本控制的工作原理的图。](images/versioning_PUT_versionEnabled3.png)
使用此功能,如果对象被意外覆盖或删除,则可以检索对象的先前版本。
当 DELETE
对象时,所有版本都将保留在存储桶中,而 Amazon S3 将插入删除标记,如下图所示。
![图中显示了删除标记插入。](images/versioning_DELETE_versioningEnabled.png)
删除标记将成为对象的当前版本。默认情况下,GET
请求将检索最新存储的版本。在当前版本为删除标记时,执行 GET Object
请求将返回 404 Not Found
错误,如下图所示。
![图中显示了对删除标记的 GetObject 调用返回 404(未找到)错误。](images/versioning_DELETE_NoObjectFound.png)
但是,您可以通过指定对象版本 ID,通过 GET
获取非当前版本的对象。在下图中,GET
特定对象版本 111111。即使该对象版本不是当前版本,Amazon S3 也会返回它。
有关更多信息,请参阅 从启用了版本控制的存储桶中检索对象版本。
![描述在启用版本控制的存储桶中 GET 非当前版本时 S3 版本控制的工作原理的图。](images/versioning_GET_Versioned3.png)
您可以通过指定要删除的版本来永久删除对象。只有 Amazon S3 存储桶的拥有者或者授权的 IAM 用户才能永久删除某个版本。如果您的 DELETE
操作指定了 versionId
,则会永久删除该对象版本,Amazon S3 不会插入删除标记。
![图中显示了 DELETE versionId 如何永久删除特定对象版本。](images/versioning_DELETE_versioningEnabled2.png)
您可以通过配置存储桶来启用多重身份验证(MFA)删除,从而提升安全性。对存储桶启用 MFA 删除时,存储桶拥有者必须在任何请求中包含两种形式的身份验证,以删除版本或更改存储桶的版本控制状态。有关更多信息,请参阅 配置 MFA 删除。
何时为对象创建新版本?
仅当您 PUT
新对象时,才会创建对象的新版本。请注意,某些操作(如 CopyObject
)通过实现 PUT
操作来发挥作用。
某些修改当前对象的操作不会创建新版本,因为它们没有 PUT
新对象。这包括更改对象上的标签等操作。
重要
如果您注意到,在对存储桶启用 S3 版本控制后,Amazon S3 对该存储桶的 PUT
或 DELETE
对象请求收到的 HTTP 503(服务不可用)响应数量显著增加,那么该存储桶中可能有一个或多个对象有数以百万计的版本。有关更多信息,请参阅故障排除的“S3 版本控制”一节。