

# S3 版本控制的工作原理
<a name="versioning-workflows"></a>

您可以使用 S3 版本控制将对象的多个版本保存在一个存储桶中，以便您能够还原意外删除或覆盖的对象。例如，如果您将 S3 版本控制应用于存储桶，则会发生以下变化：
+ 如果删除对象（而不是永久移除此对象），则 Amazon S3 会插入删除标记，它将成为当前对象版本。然后，您可以恢复以前的版本。有关更多信息，请参阅 [从启用了版本控制的存储桶中删除对象版本](DeletingObjectVersions.md)。
+ 如果覆盖对象，则 Amazon S3 会在存储桶中添加新的对象版本。之前的版本保留在存储桶中，成为非当前版本。您可以还原以前的版本。

**注意**  
对于存储和传输的每个对象版本，都适用正常 Amazon S3 费率。对象的每个版本都是完整的对象；它与以前的版本没有什么区别。因此，如果您存储了三个版本的对象，则会收取您三个对象的费用。

您创建的每个 S3 存储桶都具有关联的 *versioning* 子资源。（有关更多信息，请参阅 [通用存储桶配置选项](UsingBucket.md#bucket-config-options-intro)。） 默认情况下，您的存储桶*不受版本控制*，且对子资源进行版本控制会存储空的版本控制配置，如下所示。

```
<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`。

**注意**  
当您首次对存储桶启用版本控制时，可能只需很短的时间即可完全传播更改。当此更改传播时，在对启用版本控制后创建或更新的对象发出请求时，您可能会遇到间歇性 `HTTP 404 NoSuchKey` 错误。我们建议您在启用版本控制后等待 15 分钟，然后再对存储桶中的对象发出写入操作（`PUT` 或 `DELETE`）。

存储桶拥有者和所有获得授权的 AWS Identity and Access Management（IAM）用户都可以启用版本控制。创建存储桶的存储桶拥有者为 AWS 账户。有关权限的更多信息，请参阅 [Amazon S3 的身份和访问管理](security-iam.md)。

有关使用 AWS 管理控制台、AWS Command Line Interface（AWS CLI）或 REST API 启用和禁用 S3 版本控制的更多信息，请参阅[在存储桶上启用版本控制](manage-versioning-examples.md)。

**Topics**
+ [版本 ID](#version-ids)
+ [版本控制工作流程](#versioning-workflows-examples)

## 版本 ID
<a name="version-ids"></a>

如果您为存储桶启用版本控制，Amazon S3 会自动为要存储的对象生成唯一版本 ID。例如，在一个存储桶中，您可以拥有两个具有相同键（对象名称）的对象，但版本 ID 不同，例如 `photo.gif`（版本 111111）和 `photo.gif`（版本 121212）。

![\[图中描述了一个启用了版本控制的存储桶，该存储桶有两个具有相同键但版本 ID 不同的对象。\]](http://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/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。



## 版本控制工作流程
<a name="versioning-workflows-examples"></a>

当您在启用版本控制的存储桶中通过 `PUT` 放入对象时，不会覆盖非当前版本。如下图所示，当将 `photo.gif` 的新版本 `PUT` 到一个已经包含同名对象的存储桶中时，会发生以下行为：
+ 原始对象（ID = 111111）保留在存储桶中。
+ Amazon S3 生成一个新的版本 ID（121212），并将这个较新版本的对象添加到存储桶中。

![\[描述在 PUT 对象（位于已启用版本控制的存储桶中）时 S3 版本控制的工作原理的图。\]](http://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/images/versioning_PUT_versionEnabled3.png)


使用此功能，如果对象被意外覆盖或删除，则可以检索对象的先前版本。

当 `DELETE` 对象时，所有版本都将保留在存储桶中，而 Amazon S3 将插入删除标记，如下图所示。

![\[图中显示了删除标记插入。\]](http://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/images/versioning_DELETE_versioningEnabled.png)


删除标记将成为对象的当前版本。默认情况下，`GET` 请求将检索最新存储的版本。在当前版本为删除标记时，执行 `GET Object` 请求将返回 `404 Not Found` 错误，如下图所示。

![\[图中显示了对删除标记的 GetObject 调用返回 404（未找到）错误。\]](http://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/images/versioning_DELETE_NoObjectFound.png)


但是，您可以通过指定对象版本 ID，通过 `GET` 获取非当前版本的对象。在下图中，`GET` 特定对象版本 111111。即使该对象版本不是当前版本，Amazon S3 也会返回它。

有关更多信息，请参阅 [从启用了版本控制的存储桶中检索对象版本](RetrievingObjectVersions.md)。

![\[描述在启用版本控制的存储桶中 GET 非当前版本时 S3 版本控制的工作原理的图。\]](http://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/images/versioning_GET_Versioned3.png)


您可以通过指定要删除的版本来永久删除对象。只有 Amazon S3 存储桶的拥有者或者授权的 IAM 用户才能永久删除某个版本。如果您的 `DELETE` 操作指定了 `versionId`，则会永久删除该对象版本，Amazon S3 不会插入删除标记。

![\[图中显示了 DELETE versionId 如何永久删除特定对象版本。\]](http://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/images/versioning_DELETE_versioningEnabled2.png)


您可以通过配置存储桶来启用多重身份验证（MFA）删除，从而提升安全性。对存储桶启用 MFA 删除时，存储桶拥有者必须在任何请求中包含两种形式的身份验证，以删除版本或更改存储桶的版本控制状态。有关更多信息，请参阅 [配置 MFA 删除](MultiFactorAuthenticationDelete.md)。

### 何时为对象创建新版本？
<a name="versioning-workflows-new-versions"></a>

仅当您 `PUT` 新对象时，才会创建对象的新版本。请注意，某些操作（如 `CopyObject`）通过实现 `PUT` 操作来发挥作用。

某些修改当前对象的操作不会创建新版本，因为它们没有 `PUT` 新对象。这包括更改对象上的标签等操作。

**重要**  
如果您注意到，在对存储桶启用 S3 版本控制后，Amazon S3 对该存储桶的 `PUT` 或 `DELETE` 对象请求收到的 HTTP 503（服务不可用）响应数量显著增加，那么该存储桶中可能有一个或多个对象有数以百万计的版本。有关更多信息，请参阅[版本控制故障排除](troubleshooting-versioning.md)的“S3 版本控制”一节。