

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 從啟用版本控制的儲存貯體擷取物件版本
<a name="RetrievingObjectVersions"></a>

在 Amazon S3 中使用版本控制是在相同儲存貯體中保留多個物件版本的一種方式。簡單 `GET` 要求會擷取物件的目前版本。下圖顯示 `GET` 如何傳回 `photo.gif` 物件的目前版本。

![\[顯示 GET 如何傳回物件目前版本的圖例。\]](http://docs.aws.amazon.com/zh_tw/AmazonS3/latest/userguide/images/versioning_GET_NoVersionID.png)


若要擷取特定版本，您必須指定其版本 ID。下圖顯示 `GET versionId` 要求如何擷取物件的指定版本 (不需要是目前版本)。

![\[顯示 GET versionId 請求如何擷取指定版本物件的圖例。\]](http://docs.aws.amazon.com/zh_tw/AmazonS3/latest/userguide/images/versioning_GET_Versioned.png)


您可以使用主控台、 AWS SDKs 或 REST API 擷取 Amazon S3 中的物件版本。

**注意**  
 若要存取超過 300 個版本的物件版本，您必須使用 AWS CLI 或物件的 URL。

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

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/) 開啟 Amazon S3 主控台。

1. 在 **Buckets** (儲存貯體) 清單中，選擇包含該物件的儲存貯體名稱。

1. 在 **Objects** (物件) 清單中，選擇物件的名稱。

1. 選擇 **Versions** (版本)。

   Amazon S3 會顯示該物件的所有版本。

1. 選取要擷取版本之 **Version ID (版本 ID)** 旁邊的核取方塊。

1. 選擇 **Actions** (動作)，選擇 **Download (下載)**，然後儲存物件。

您也可以在物件概觀面板中檢視、下載及刪除物件版本。如需詳細資訊，請參閱[在 Amazon S3 主控台中檢視物件屬性](view-object-properties.md)。

**重要**  
只有在刪除最新版 (目前版本) 的物件時，才能取消刪除物件。您無法取消刪除已刪除的舊版物件。如需詳細資訊，請參閱[使用 S3 版本控制保留多個版本的物件](Versioning.md)。

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

上傳物件到未使用版本控制和啟用版本控制的儲存貯體中的範例相同。但是，對於啟用版本控制的儲存貯體，Amazon S3 會指派一個版本號碼。否則，版本編號會是空值。

如需使用適用於 Java、.NET 和 PHP AWS SDKs 下載物件的範例，請參閱[下載物件](https://docs.aws.amazon.com/AmazonS3/latest/userguide/download-objects.html)。

如需使用適用於 .NET 和 Rust AWS SDKs 列出物件版本的範例，請參閱[列出 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_tw/AmazonS3/latest/userguide/images/versioning_COPY2.png)


隨後 `GET` 會擷取版本 88778877。

下圖顯示如何刪除將舊版本 (111111) 保留為目前物件之物件的目前版本 (121212)。有關刪除物件的詳細資訊，請參閱[刪除單一物件](https://docs.aws.amazon.com/AmazonS3/latest/userguide/delete-objects.html)。

![\[圖例顯示刪除目前版本的物件，並將舊版保留為目前物件。\]](http://docs.aws.amazon.com/zh_tw/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>

如需還原已刪除物件的更多指引，請參閱[如何擷取已啟用版本控制的儲存貯體中已刪除的 Amazon S3 物件？](https://repost.aws/knowledge-center/s3-undelete-configuration) AWS re:Post 知識中心的 。

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

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/) 開啟 Amazon S3 主控台。

1. 在 **Buckets** (儲存貯體) 清單中，選擇包含該物件的儲存貯體名稱。

1. 在 **Objects** (物件) 清單中，選擇物件的名稱。

1. 選擇 **Versions** (版本)。

   Amazon S3 會顯示該物件的所有版本。

1. 選取要擷取版本之 **Version ID (版本 ID)** 旁邊的核取方塊。

1. 選擇 **Actions** (動作)，選擇 **Download (下載)**，然後儲存物件。

您也可以在物件概觀面板中檢視、下載及刪除物件版本。如需詳細資訊，請參閱[在 Amazon S3 主控台中檢視物件屬性](view-object-properties.md)。

**重要**  
只有在刪除最新版 (目前版本) 的物件時，才能取消刪除物件。您無法取消刪除已刪除的舊版物件。如需詳細資訊，請參閱[使用 S3 版本控制保留多個版本的物件](Versioning.md)。

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

如需使用 AWS SDKs的詳細資訊，請參閱 [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}."
        )
```

------