

# 从启用了版本控制的存储桶中检索对象版本
<a name="RetrievingObjectVersions"></a>

Amazon S3 中的版本控制是在相同的存储桶中保留对象的多个变量的方法。简单 `GET` 请求将检索对象的当前版本。下图显示 `GET` 如何返回 `photo.gif` 对象的当前版本。

![\[图中显示了 GET 如何返回对象的当前版本。\]](http://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/images/versioning_GET_NoVersionID.png)


要检索特定版本，您需要指定其版本 ID。下图显示 `GET versionId` 请求检索对象的指定版本 (不一定是当前版本)。

![\[图中显示了 GET versionId 请求如何检索对象的指定版本。\]](http://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/images/versioning_GET_Versioned.png)


您可以使用控制台、AWS SDK 或 REST API 在 Amazon S3 中检索对象版本。

**注意**  
 要访问早于 300 个版本的对象版本，必须使用 AWS CLI 或对象的 URL。

## 使用 S3 控制台
<a name="retrieving-object-versions"></a>

1. 登录到 AWS 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

1. 在**存储桶**列表中，请选择包含对象的存储桶的名称。

1. 在 **Objects**（对象）列表中，请选择对象的名称。

1. 请选择 **Versions**（版本）。

   Amazon S3 显示了对象的所有版本。

1. 选中要检索的版本的 **Version ID**（版本 ID）旁的复选框。

1. 依次选择 **Actions**（操作）、**Download**（下载），然后保存对象。

您也可以在对象概述面板中查看、下载和删除对象版本。有关更多信息，请参阅 [在 Amazon S3 控制台中查看对象属性](view-object-properties.md)。

**重要**  
仅当对象已作为最新 (当前) 版本删除时，您才能取消删除它。您无法取消删除已删除对象的早期版本。有关更多信息，请参阅 [使用 S3 版本控制保留对象的多个版本](Versioning.md)。

## 使用 AWS SDK
<a name="retrieve-obj-version-sdks"></a>

在不受版本控制和启用了版本控制的存储桶中上传对象的示例是相同的。但是，对于启用了版本控制的存储桶，Amazon S3 会分配版本号。否则，版本号为空。

有关使用适用于 Java、.NET 和 PHP 的 AWS SDK 下载对象的示例，请参阅[下载对象](https://docs.aws.amazon.com/AmazonS3/latest/userguide/download-objects.html)。

有关使用适用于 .NET 和 Rust 的 AWS SDK 列出对象版本的示例，请参阅[列出 Amazon S3 存储桶中对象的版本](https://docs.aws.amazon.com/code-library/latest/ug/s3_example_s3_ListObjectVersions_section.html)。

## 使用 REST API
<a name="retrieve-obj-version-rest"></a>

**检索特定对象版本的步骤**

1. 将 `versionId` 设置为您要检索的对象的版本 ID。

1. 发送 `GET Object versionId` 请求。

**Example — 检索受版本控制的对象**  
以下请求将检索 `L4kqtJlcpXroDTDmpUMLUo` 的版本 `my-image.jpg`。  

```
1. GET /my-image.jpg?versionId=L4kqtJlcpXroDTDmpUMLUo HTTP/1.1
2. Host: bucket.s3.amazonaws.com
3. Date: Wed, 28 Oct 2009 22:32:00 GMT
4. Authorization: AWS AKIAIOSFODNN7EXAMPLE:0RQf4/cRonhpaBX5sCYVf1bNRuU=
```

您可以仅检索对象的元数据（而不是内容）。有关信息，请参阅 [检索对象版本的元数据](RetMetaOfObjVersion.md)。

有关还原早期对象版本的信息，请参阅 [还原早期版本](RestoringPreviousVersions.md)。

# 检索对象版本的元数据
<a name="RetMetaOfObjVersion"></a>

如果您仅想检索对象的元数据 (而不是其内容)，您可以使用 `HEAD` 操作。默认情况下，您将获得最新版本的元数据。要检索特定对象版本的元数据，需要指定其版本 ID。

**检索对象版本的元数据的步骤**

1. 将 `versionId` 设置为您要检索其元数据的对象的版本 ID。

1. 发送 `HEAD Object versionId` 请求。

**Example — 检索受版本控制的对象的元数据**  
以下请求将检索 `my-image.jpg` 的版本 `3HL4kqCxf3vjVBH40Nrjfkd` 的元数据。  

```
1. HEAD /my-image.jpg?versionId=3HL4kqCxf3vjVBH40Nrjfkd HTTP/1.1
2. Host: bucket.s3.amazonaws.com
3. Date: Wed, 28 Oct 2009 22:32:00 GMT
4. Authorization: AWS AKIAIOSFODNN7EXAMPLE:0RQf4/cRonhpaBX5sCYVf1bNRuU=
```

以下显示了示例响应。

```
 1. HTTP/1.1 200 OK
 2. x-amz-id-2: ef8yU9AS1ed4OpIszj7UDNEHGran
 3. x-amz-request-id: 318BC8BC143432E5
 4. x-amz-version-id: 3HL4kqtJlcpXroDTDmjVBH40Nrjfkd
 5. Date: Wed, 28 Oct 2009 22:32:00 GMT
 6. Last-Modified: Sun, 1 Jan 2006 12:00:00 GMT
 7. ETag: "fba9dede5f27731c9771645a39863328"
 8. Content-Length: 434234
 9. Content-Type: text/plain
10. Connection: close
11. Server: AmazonS3
```

# 还原早期版本
<a name="RestoringPreviousVersions"></a>

您可以使用版本控制来检索对象的早期版本。有两种方法可执行该操作：
+ 将对象的早期版本复制到同一存储桶中。

  复制的对象将成为该对象的当前版本，且所有对象版本都保留。
+ 永久删除对象的当前版本。

  当您删除当前对象版本时，实际上会将先前版本转换为该对象的当前版本。

由于所有对象版本都保留，所以您可以通过将对象的特定版本复制到同一存储桶，使任何较早版本成为当前版本。在下图中，源对象（ID = 111111）已复制到同一存储桶中。Amazon S3 将提供一个新 ID (88778877)，且它将成为该对象的当前版本。因此，该存储桶同时具有原始对象版本（111111）及其副本（88778877）。有关获取先前版本，然后将其上传以使其成为当前版本的更多信息，请参阅[从启用了版本控制的存储桶中检索对象版本](https://docs.aws.amazon.com/AmazonS3/latest/userguide/RetrievingObjectVersions.html)和[上传对象](https://docs.aws.amazon.com/AmazonS3/latest/userguide/upload-objects.html)。

![\[图中显示了将对象的特定版本复制到同一个存储桶中以使其成为当前版本。\]](http://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/images/versioning_COPY2.png)


随后，`GET` 将检索版本 88778877。

下图显示了如何删除对象的当前版本 (121212)，该操作保留早期版本 (111111) 作为当前版本。有关删除对象的更多信息，请参阅[删除单个对象](https://docs.aws.amazon.com/AmazonS3/latest/userguide/delete-objects.html)。

![\[图中显示了删除对象的当前版本会将早期版本保留为当前版本。\]](http://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/images/versioning_COPY_delete2.png)


随后，`GET` 将检索版本 111111。

**注意**  
要批量还原对象版本，可以[使用 `CopyObject` 操作](https://docs.aws.amazon.com/AmazonS3/latest/userguide/batch-ops-copy-object.html)。`CopyObject` 操作会复制清单中指定的每个对象。但请注意，不必以对象在清单中出现的相同顺序复制这些对象。对于受版本控制的存储桶，如果保留当前/非当前版本顺序很重要，您应首先复制所有非当前版本。然后，在第一个任务完成后，在后续任务中复制当前版本。

## 还原以前的对象版本
<a name="restoring-obj-version-version-enabled-bucket-examples"></a>

有关如何还原已删除对象的更多指导，请参阅 AWS re:Post 知识中心中的[如何检索在启用版本控制的存储桶中删除的 Amazon S3 对象？](https://repost.aws/knowledge-center/s3-undelete-configuration)

### 使用 S3 控制台
<a name="retrieving-object-versions"></a>

1. 登录到 AWS 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

1. 在**存储桶**列表中，请选择包含对象的存储桶的名称。

1. 在 **Objects**（对象）列表中，请选择对象的名称。

1. 请选择 **Versions**（版本）。

   Amazon S3 显示了对象的所有版本。

1. 选中要检索的版本的 **Version ID**（版本 ID）旁的复选框。

1. 依次选择 **Actions**（操作）、**Download**（下载），然后保存对象。

您也可以在对象概述面板中查看、下载和删除对象版本。有关更多信息，请参阅 [在 Amazon S3 控制台中查看对象属性](view-object-properties.md)。

**重要**  
仅当对象已作为最新 (当前) 版本删除时，您才能取消删除它。您无法取消删除已删除对象的早期版本。有关更多信息，请参阅 [使用 S3 版本控制保留对象的多个版本](Versioning.md)。

### 使用 AWS SDK
<a name="restoring-obj-version-version-enabled-bucket-sdks"></a>

有关使用其他 AWS SDK 的信息，请参阅 [AWS 开发人员中心](https://aws.amazon.com/code/)。

------
#### [ Python ]

以下 Python 代码示例通过删除指定回滚版本之后的所有版本，来还原版本控制对象的以前版本。

```
def rollback_object(bucket, object_key, version_id):
    """
    Rolls back an object to an earlier version by deleting all versions that
    occurred after the specified rollback version.

    Usage is shown in the usage_demo_single_object function at the end of this module.

    :param bucket: The bucket that holds the object to roll back.
    :param object_key: The object to roll back.
    :param version_id: The version ID to roll back to.
    """
    # Versions must be sorted by last_modified date because delete markers are
    # at the end of the list even when they are interspersed in time.
    versions = sorted(
        bucket.object_versions.filter(Prefix=object_key),
        key=attrgetter("last_modified"),
        reverse=True,
    )

    logger.debug(
        "Got versions:\n%s",
        "\n".join(
            [
                f"\t{version.version_id}, last modified {version.last_modified}"
                for version in versions
            ]
        ),
    )

    if version_id in [ver.version_id for ver in versions]:
        print(f"Rolling back to version {version_id}")
        for version in versions:
            if version.version_id != version_id:
                version.delete()
                print(f"Deleted version {version.version_id}")
            else:
                break

        print(f"Active version is now {bucket.Object(object_key).version_id}")
    else:
        raise KeyError(
            f"{version_id} was not found in the list of versions for " f"{object_key}."
        )
```

------