

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

# 使用 S3 版本控制保留多個版本的物件
<a name="Versioning"></a>

在 Amazon S3 中使用版本控制是在相同儲存貯體中保留多個物件版本的一種方式。您可以使用 S3 版本控制功能來保留、擷取和恢復在儲存貯體中所存放每個物件的各個版本。透過版本控制，您就可以更輕鬆地復原失誤的使用者動作和故障的應用程式。啟用儲存貯體的版本控制後，如果 Amazon S3 同時接收對同一物件的多個寫入要求，則會存放所有物件。

啟用版本控制的儲存貯體可讓您復原意外刪除或覆寫的物件。例如，如果您刪除某個物件，Amazon S3 會將刪除標記插入到該物件，而不是永久移除它。刪除標記會成為物件的目前版本。如果您覆寫物件，則會在儲存貯體中產生新的物件版本。您一律可以還原舊版本。如需詳細資訊，請參閱「[刪除啟用版本控制功能之儲存貯體中的物件](DeletingObjectVersions.md)」。

儲存貯體預設停用 S3 版本控制，您必須明確啟用它。如需詳細資訊，請參閱「[在儲存貯體上啟用版本控制](manage-versioning-examples.md)」。

**注意**  
SOAP API 不支援 S3 版本控制。HTTP 上的 SOAP 支援已淘汰，但仍可透過 HTTPS 取得。SOAP 不支援新的 Amazon S3 功能。
標準 Amazon S3 費率適用於所存放和傳送物件的每個版本。物件的每個版本都是整個物件，而不只是與舊版本的差異。因此，如果您的所存放物件有三個版本，則會向您收取三個物件的費用。

## 未使用版本控制、已啟用版本控制和暫停版本控制的儲存貯體
<a name="versioning-states"></a>

儲存貯體可以是以下三種狀態之一：
+ 未進行版本控制 (預設)
+ 已啟用版本控制
+ 已暫停版本控制

您可以在儲存貯體層級啟用和暫停版本控制。儲存貯體的版本控制一旦啟用，就無法再回復為未使用版本控制狀態。不過，您可以*暫停*儲存貯體的版本控制。

版本控制狀態會套用至該儲存貯體中的所有 (絕不會是一些) 物件。當您在儲存貯體中啟用版本控制時，所有新物件都會進行版本控制，並提供唯一的版本 ID。在啟用版本控制時已存在於儲存貯體中的物件，之後將*始終*進行版本控制，並在未來要求修改時提供唯一的版本 ID。注意下列事項：
+ 在您設定版本控制狀態擁有版本 ID `null` 前，先儲存物件於儲存貯體中。當您啟用版本控制時，儲存貯體中的現有物件不會變更。Amazon S3 在未來請求中如何處理物件的方式會改變。如需詳細資訊，請參閱「[使用已啟用版本控制之儲存貯體中的物件](manage-objects-versioned-bucket.md)」。
+ 儲存貯體擁有者 (或任何具有適當許可的使用者) 可以暫停版本控制，以停止產生物件版本。當您暫停版本控制時，儲存貯體中的現有物件不會變更。Amazon S3 在未來請求中如何處理物件的方式會改變。如需詳細資訊，請參閱「[使用暫停版本控制之儲存貯體中的物件](VersionSuspendedBehavior.md)」。

## 搭配使用 S3 版本控制與 S3 生命週期
<a name="versioning-lifecycle"></a>

若要自訂您的資料保留方法及控制儲存體成本，請將物件版本控制搭配 S3 生命週期使用。如需詳細資訊，請參閱[管理物件的生命週期](object-lifecycle-mgmt.md)。如需有關使用 AWS 管理主控台、、 AWS CLI AWS SDKs 或 REST API 建立 S3 生命週期組態的資訊，請參閱 [設定儲存貯體的 S3 生命週期組態](how-to-set-lifecycle-configuration-intro.md)。

**重要**  
如果您在未使用版本控制的儲存貯體中有物件過期生命週期組態，而且想要在啟用版本控制時保持相同的永久刪除行為，您必須新增非目前的過期組態。非目前的過期生命週期組態，會管理啟用版本控制之儲存貯體中非目前物件版本的刪除。(已啟用版本控制的儲存貯體會維持一個目前的物件版本，以及零或多個非目前的物件版本。) 如需詳細資訊，請參閱[設定儲存貯體的 S3 生命週期組態](how-to-set-lifecycle-configuration-intro.md)。

如需使用 S3 版本控制的相關資訊，請參閱下列主題。

**Topics**
+ [未使用版本控制、已啟用版本控制和暫停版本控制的儲存貯體](#versioning-states)
+ [搭配使用 S3 版本控制與 S3 生命週期](#versioning-lifecycle)
+ [S3 版本控制的運作方式](versioning-workflows.md)
+ [在儲存貯體上啟用版本控制](manage-versioning-examples.md)
+ [設定 MFA Delete](MultiFactorAuthenticationDelete.md)
+ [使用已啟用版本控制之儲存貯體中的物件](manage-objects-versioned-bucket.md)
+ [使用暫停版本控制之儲存貯體中的物件](VersionSuspendedBehavior.md)
+ [針對版本控制進行疑難排解](troubleshooting-versioning.md)

# S3 版本控制的運作方式
<a name="versioning-workflows"></a>

您可以使用 S3 版本控制將物件的多個版本保留在一個儲存貯體中，以便可以還原意外刪除或覆寫的物件。例如，如果您將 S3 版本控制套用至儲存貯體，則會發生下列變更：
+ 如果您刪除物件，而不是永久移除物件，Amazon S3 會插入刪除標記，這會變成目前物件版本。然後，您可以還原先前的版本。如需詳細資訊，請參閱[刪除啟用版本控制功能之儲存貯體中的物件](DeletingObjectVersions.md)。
+ 如果您覆寫物件，則 Amazon S3 會在儲存貯體中新增物件版本。先前的版本會保留在儲存貯體中，並成為非目前版本。您可以還原先前的版本。

**注意**  
標準 Amazon S3 費率適用於所存放和傳送物件的每個版本。物件的每個版本都是整個物件，而不是與舊版本的差異。因此，如果您的所存放物件有三個版本，則會向您收取三個物件的費用。

您建立的每個 S3 儲存貯體都會有相關聯的 *versioning* 子資源。(如需詳細資訊，請參閱「[一般用途儲存貯體組態選項](UsingBucket.md#bucket-config-options-intro)」。) 儲存貯體預設為*未使用版本控制*，versioning 子資源會存放空的版本控制組態，如下所示。

```
<VersioningConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> 
</VersioningConfiguration>
```

若要啟用版本控制，您可以使用包含 `Enabled` 狀態的版本控制組態，將要求傳送給 Amazon S3。

```
<VersioningConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> 
  <Status>Enabled</Status> 
</VersioningConfiguration>
```

若要暫停版本控制，您必須將狀態值設為 `Suspended`。

**注意**  
您第一次在儲存貯體上啟用版本控制時，可能需要很短的時間來完全傳播變更。當系統正在傳播此變更時，您可能會在啟用版本控制後，在對已建立或已更新之物件發出請求時遇到間歇性 `HTTP 404 NoSuchKey` 錯誤。我們建議您在啟用版本控制之後等待 15 分鐘，然後再對儲存貯體中的物件發出寫入作業 (`PUT` 或 `DELETE`)。

儲存貯體擁有者和所有 authorized 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_tw/AmazonS3/latest/userguide/images/versioning_Enabled.png)


無論是否啟用 S3 版本控制，每個物件都有版本 ID。若尚未啟用 S3 版本控制，則 Amazon S3 會將版本 ID 的值設定為 `null`。如果啟用了 S3 版本控制，Amazon S3 會為物件指派一個版本 ID 值。此值會將該物件與相同金鑰的其他版本區分開來。

當您啟用現有儲存貯體的 S3 版本控制時，已存放在儲存貯體上的物件會保持不變。其版本 ID (`null`)、內容和許可都會保持不變。在啟用 S3 版本控制之後，新增至儲存貯體的每個物件都會取得版本 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_tw/AmazonS3/latest/userguide/images/versioning_PUT_versionEnabled3.png)


使用此功能時，如果物件遭到意外覆寫或刪除，您可以擷取物件的先前版本。

當您 `DELETE` 物件時，所有版本都會保留在儲存貯體中，且 Amazon S3 會插入刪除標記，如下圖所示。

![\[顯示刪除標記插入的圖例。\]](http://docs.aws.amazon.com/zh_tw/AmazonS3/latest/userguide/images/versioning_DELETE_versioningEnabled.png)


刪除標記會成為物件的目前版本。根據預設，`GET` 要求會擷取最近存放的版本。當目前版本為刪除標記時執行 `GET Object` 請求，會傳回 `404 Not Found` 錯誤，如下圖所示。

![\[圖中顯示對刪除標記的 GetObject 呼叫傳回 404 (找不到) 錯誤。\]](http://docs.aws.amazon.com/zh_tw/AmazonS3/latest/userguide/images/versioning_DELETE_NoObjectFound.png)


但您可以藉由指定物件的版本 ID，來 `GET` 非目前版本的物件。在下圖中，您將 `GET` 特定的物件版本：111111。即使該物件版本並非目前的版本，Amazon S3 也會傳回該物件版本。

如需詳細資訊，請參閱[從啟用版本控制的儲存貯體擷取物件版本](RetrievingObjectVersions.md)。

![\[此圖表說明在您 GET 已啟用版本控制之儲存貯體中的非目前版本時，S3 版本控制如何運作。\]](http://docs.aws.amazon.com/zh_tw/AmazonS3/latest/userguide/images/versioning_GET_Versioned3.png)


您可以指定要刪除的版本，來永久刪除物件。只有 Amazon S3 儲存貯體的擁有者或經授權的 IAM 使用者才能永久刪除某個版本。如果您的 `DELETE` 操作指定 `versionId`，則會永久刪除該物件版本，且 Amazon S3 不會插入刪除標記。

![\[圖表顯示 DELETE versionId 如何永久刪除特定物件版本。\]](http://docs.aws.amazon.com/zh_tw/AmazonS3/latest/userguide/images/versioning_DELETE_versioningEnabled2.png)


您可以將儲存貯體設定為啟用多重要素驗證 (MFA) 刪除，來提升安全性。當您針對儲存貯體啟用 MFA 刪除時，儲存貯體擁有者必須在任一請求中包含兩種身分驗證形式，才能刪除版本或變更儲存貯體的版本控制狀態。如需詳細資訊，請參閱[設定 MFA Delete](MultiFactorAuthenticationDelete.md)。

### 何時建立物件的新版本？
<a name="versioning-workflows-new-versions"></a>

只有在 `PUT` 新物件時才會建立物件的新版本。請注意，某些動作 (例如 `CopyObject`) 透過實作 `PUT` 操作來運作。

執行修改目前物件的某些動作不會建立新版本，因為它們不會 `PUT` 新物件。這包含變更物件上的標籤等動作。

**重要**  
當發現 Amazon S3 對啟用了 S3 版本控制之儲存貯體發出 `PUT` 或 `DELETE` 物件請求之後，接收 HTTP 503 (無法使用服務) 回應的數目明顯增加時，表示該儲存貯體中有一或多個物件可能擁有數百萬個版本。如需詳細資訊，請參閱 S3 版本控制區段中的 [針對版本控制進行疑難排解](troubleshooting-versioning.md)。

# 在儲存貯體上啟用版本控制
<a name="manage-versioning-examples"></a>

您可以使用 Amazon S3 版本控制在單一儲存貯體中保留物件的多個版本。本節提供如何使用主控台、REST API、 AWS SDKs和 AWS Command Line Interface () 在儲存貯體上啟用版本控制的範例AWS CLI。

**注意**  
第一次在儲存貯體上啟用版本控制後，可能需要長達 15 分鐘才能在 S3 系統中完全傳播更動內容。在此期間，啟用版本控制後建立或更新的物件 `GET` 請求，可能會導致 `HTTP 404 NoSuchKey` 錯誤。我們建議在啟用版本控制後等待 15 分鐘，然後再對儲存貯體中的物件執行任何寫入操作 (`PUT` 或 `DELETE`)。此等待期間有助於避免物件可見性和版本追蹤的潛在問題。

如需 S3 版本控制的詳細資訊，請參閱「[使用 S3 版本控制保留多個版本的物件](Versioning.md)」。如需有關使用已啟用版本控制儲存貯體中物件的資訊，請參閱[使用已啟用版本控制之儲存貯體中的物件](manage-objects-versioned-bucket.md)。

若要進一步了解如何使用 S3 版本控制來保護資料，請參閱[教學課程：使用 S3 版本控制、S3 物件鎖定和 S3 複寫，保護 Amazon S3 上的資料，以防意外刪除或發生應用程式錯誤](https://aws.amazon.com/getting-started/hands-on/protect-data-on-amazon-s3/?ref=docs_gateway/amazons3/manage-versioning-examples.html)。

您建立的每個 S3 儲存貯體都會有相關聯的 *versioning* 子資源。(如需詳細資訊，請參閱「[一般用途儲存貯體組態選項](UsingBucket.md#bucket-config-options-intro)」。) 儲存貯體預設為*未使用版本控制*，versioning 子資源會存放空的版本控制組態，如下所示。

```
<VersioningConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> 
</VersioningConfiguration>
```

若要啟用版本控制，您可以使用包含狀態的版本控制組態，將要求傳送給 Amazon S3。

```
<VersioningConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> 
  <Status>Enabled</Status> 
</VersioningConfiguration>
```

若要暫停版本控制，您必須將狀態值設為 `Suspended`。

儲存貯體擁有者和所有已獲授權的使用者都可以啟用版本控制。儲存貯體擁有者是建立儲存貯 AWS 帳戶 體的 （根帳戶）。如需許可的詳細資訊，請參閱「[Amazon S3 的身分和存取管理](security-iam.md)」。

下列各節提供使用 主控台、 AWS CLI和 AWS SDKs 啟用 S3 版本控制的詳細資訊。

## 使用 S3 主控台
<a name="enable-versioning"></a>

請依照下列步驟，使用 AWS 管理主控台 在 S3 儲存貯體上啟用版本控制。

**啟用或停用 S3 一般用途儲存貯體的版本控制**

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

1. 在左側導覽窗格中，選擇**一般用途儲存貯體**。

1. 在儲存貯體清單中，選擇要啟用版本控制的儲存貯體名稱。

1. 選擇 **Properties** (屬性)。

1. 在 **Bucket Versioning** (儲存貯體版本控制) 底下，選擇 **Edit** (編輯)。

1. 選擇 **Suspend** (暫停) 或 **Enable** (啟用)，然後選擇 **Save changes** (儲存變更)。

**注意**  
您可以使用 AWS 多重要素驗證 (MFA) 搭配版本控制。當您搭配版本控制使用 MFA 時，您必須提供帳戶的 MFA 裝置中的 AWS 帳戶存取金鑰和有效代碼，以永久刪除物件版本，或暫停或重新啟用版本控制。  
若要使用 MFA 與版本控制搭配，請啟用 `MFA Delete`。但是，您無法使用 AWS 管理主控台來啟用 `MFA Delete`。您必須使用 AWS Command Line Interface (AWS CLI) 或 API。如需詳細資訊，請參閱[設定 MFA Delete](MultiFactorAuthenticationDelete.md)。

## 使用 AWS CLI
<a name="manage-versioning-examples-cli"></a>

下列範例啟用 S3 一般用途儲存貯體上的版本控制。

```
aws s3api put-bucket-versioning --bucket amzn-s3-demo-bucket1 --versioning-configuration Status=Enabled
```

下列範例會啟用實體 MFA 裝置的儲存貯體上的 S3 版本控制和多重要素驗證 (MFA) 刪除。對於實體 MFA 裝置，在 `--mfa` 參數中傳遞 MFA 裝置序號、空格字元和身分驗證裝置上顯示值的串連。

```
aws s3api put-bucket-versioning --bucket amzn-s3-demo-bucket1 --versioning-configuration Status=Enabled,MFADelete=Enabled --mfa "SerialNumber 123456"
```

下列範例會啟用虛擬 MFA 裝置的儲存貯體上的 S3 版本控制和多重要素驗證 (MFA) 刪除。對於虛擬 MFA 裝置，在 `--mfa` 參數中傳遞 MFA 裝置 ARN 的串連、空格字元，以及身分驗證裝置上顯示的值。

```
aws s3api put-bucket-versioning --bucket amzn-s3-demo-bucket1 --versioning-configuration Status=Enabled,MFADelete=Enabled --mfa "arn:aws:iam::account-id:mfa/root-account-mfa-device 123789"
```

**注意**  
使用 MFA Delete 需要已核准的實體或虛擬身分驗證裝置。如需在 Amazon S3 中使用 MFA Delete 的詳細資訊，請參閱「[設定 MFA Delete](MultiFactorAuthenticationDelete.md)」。

如需使用 啟用版本控制的詳細資訊 AWS CLI，請參閱《 *AWS CLI 命令參考*》中的 [put-bucket-versioning](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/put-bucket-versioning.html)。

## 使用 AWS SDKs
<a name="manage-versioning-examples-sdk"></a>

下列範例會在儲存貯體上啟用版本控制，然後使用 適用於 Java 的 AWS SDK 和 擷取版本控制狀態 適用於 .NET 的 AWS SDK。如需有關使用其他 AWS SDK 的詳細資訊，請參閱 [AWS 開發人員中心](https://aws.amazon.com/code/)。

------
#### [ .NET ]

如需有關設定和執行程式碼範例的資訊，請參閱《[適用於 .NET 的 AWS SDK 開發人員指南》中的適用於 .NET 的 SDK 入門](https://docs.aws.amazon.com/sdk-for-net/latest/developer-guide/net-dg-setup.html)。 *AWS *

```
using System;
using Amazon.S3;
using Amazon.S3.Model;

namespace s3.amazon.com.rproxy.govskope.ca.docsamples
{
    class BucketVersioningConfiguration
    {
        static string bucketName = "*** bucket name ***";

        public static void Main(string[] args)
        {
            using (var client = new AmazonS3Client(Amazon.RegionEndpoint.USEast1))
            {
                try
                {
                    EnableVersioningOnBucket(client);
                    string bucketVersioningStatus = RetrieveBucketVersioningConfiguration(client);
                }
                catch (AmazonS3Exception amazonS3Exception)
                {
                    if (amazonS3Exception.ErrorCode != null &&
                        (amazonS3Exception.ErrorCode.Equals("InvalidAccessKeyId")
                        ||
                        amazonS3Exception.ErrorCode.Equals("InvalidSecurity")))
                    {
                        Console.WriteLine("Check the provided AWS Credentials.");
                        Console.WriteLine(
                        "To sign up for service, go to http://aws.amazon.com/s3");
                    }
                    else
                    {
                        Console.WriteLine(
                         "Error occurred. Message:'{0}' when listing objects",
                         amazonS3Exception.Message);
                    }
                }
            }

            Console.WriteLine("Press any key to continue...");
            Console.ReadKey();
        }

        static void EnableVersioningOnBucket(IAmazonS3 client)
        {

                PutBucketVersioningRequest request = new PutBucketVersioningRequest
                {
                    BucketName = bucketName,
                    VersioningConfig = new S3BucketVersioningConfig 
                    {
                        Status = VersionStatus.Enabled
                    }
                };

                PutBucketVersioningResponse response = client.PutBucketVersioning(request);
        }


        static string RetrieveBucketVersioningConfiguration(IAmazonS3 client)
        {
                GetBucketVersioningRequest request = new GetBucketVersioningRequest
                {
                    BucketName = bucketName
                };
 
                GetBucketVersioningResponse response = client.GetBucketVersioning(request);
                return response.VersioningConfig.Status;
            }
    }
}
```

------
#### [ Java ]

如需如何建立和測試工作範例的說明，請參閱《 適用於 Java 的 AWS SDK 開發人員指南》中的[入門](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/getting-started.html)。

```
import java.io.IOException;

import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.regions.Region;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.model.AmazonS3Exception;
import com.amazonaws.services.s3.model.BucketVersioningConfiguration;
import com.amazonaws.services.s3.model.SetBucketVersioningConfigurationRequest;

public class BucketVersioningConfigurationExample {
    public static String bucketName = "*** bucket name ***"; 
    public static AmazonS3Client s3Client;

    public static void main(String[] args) throws IOException {
        s3Client = new AmazonS3Client(new ProfileCredentialsProvider());
        s3Client.setRegion(Region.getRegion(Regions.US_EAST_1));
        try {

            // 1. Enable versioning on the bucket.
        	BucketVersioningConfiguration configuration = 
        			new BucketVersioningConfiguration().withStatus("Enabled");
            
			SetBucketVersioningConfigurationRequest setBucketVersioningConfigurationRequest = 
					new SetBucketVersioningConfigurationRequest(bucketName,configuration);
			
			s3Client.setBucketVersioningConfiguration(setBucketVersioningConfigurationRequest);
			
			// 2. Get bucket versioning configuration information.
			BucketVersioningConfiguration conf = s3Client.getBucketVersioningConfiguration(bucketName);
			 System.out.println("bucket versioning configuration status:    " + conf.getStatus());

        } catch (AmazonS3Exception amazonS3Exception) {
            System.out.format("An Amazon S3 error occurred. Exception: %s", amazonS3Exception.toString());
        } catch (Exception ex) {
            System.out.format("Exception: %s", ex.toString());
        }        
    }
}
```

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

以下 Python 程式碼範例會建立 Amazon S3 儲存貯體，使其能夠進行版本控制，並設定一個在 7 天後讓最新物件到期的生命週期。

```
def create_versioned_bucket(bucket_name, prefix):
    """
    Creates an Amazon S3 bucket, enables it for versioning, and configures a lifecycle
    that expires noncurrent object versions after 7 days.

    Adding a lifecycle configuration to a versioned bucket is a best practice.
    It helps prevent objects in the bucket from accumulating a large number of
    noncurrent versions, which can slow down request performance.

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

    :param bucket_name: The name of the bucket to create.
    :param prefix: Identifies which objects are automatically expired under the
                   configured lifecycle rules.
    :return: The newly created bucket.
    """
    try:
        bucket = s3.create_bucket(
            Bucket=bucket_name,
            CreateBucketConfiguration={
                "LocationConstraint": s3.meta.client.meta.region_name
            },
        )
        logger.info("Created bucket %s.", bucket.name)
    except ClientError as error:
        if error.response["Error"]["Code"] == "BucketAlreadyOwnedByYou":
            logger.warning("Bucket %s already exists! Using it.", bucket_name)
            bucket = s3.Bucket(bucket_name)
        else:
            logger.exception("Couldn't create bucket %s.", bucket_name)
            raise

    try:
        bucket.Versioning().enable()
        logger.info("Enabled versioning on bucket %s.", bucket.name)
    except ClientError:
        logger.exception("Couldn't enable versioning on bucket %s.", bucket.name)
        raise

    try:
        expiration = 7
        bucket.LifecycleConfiguration().put(
            LifecycleConfiguration={
                "Rules": [
                    {
                        "Status": "Enabled",
                        "Prefix": prefix,
                        "NoncurrentVersionExpiration": {"NoncurrentDays": expiration},
                    }
                ]
            }
        )
        logger.info(
            "Configured lifecycle to expire noncurrent versions after %s days "
            "on bucket %s.",
            expiration,
            bucket.name,
        )
    except ClientError as error:
        logger.warning(
            "Couldn't configure lifecycle on bucket %s because %s. "
            "Continuing anyway.",
            bucket.name,
            error,
        )

    return bucket
```

------

# 設定 MFA Delete
<a name="MultiFactorAuthenticationDelete"></a>

在 Amazon S3 儲存貯體中使用 S3 版本控制時，您可以選擇將儲存貯體設定為啟用 *MFA (多重因素認證) Delete*，來增加額外的安全性。當您這樣做時，儲存貯體擁有者必須在任一要求中包含兩種身分驗證形式，才能刪除版本或變更儲存貯體的版本控制狀態。

MFA Delete 會要求額外的身分驗證，才能進行下列任一操作：
+ 變更儲存貯體的版本控制狀態
+ 永久刪除物件版本

MFA Delete 要求同時使用兩種形式的身分驗證：
+ 安全憑證
+ 核准的身分驗證設備上顯示的有效序號、空格和六位代碼組合。

因此，MFA Delete 可提供額外的安全性，例如在安全憑證洩露時。在某個使用者執行刪除動作時，MFA Delete 會要求啟動刪除動作的使用者證明其擁有實體 MFA 裝置和 MFA 代碼，從而為刪除動作新增另一層阻力和安全性，協助防止意外刪除儲存貯體。

若要識別已啟用 MFA 刪除的儲存貯體，您可以使用 Amazon S3 Storage Lens 指標。S3 Storage Lens 是一種雲端儲存體分析功能，您可以用來了解整個組織使用物件儲存體的情況及其活動情形。如需詳細資訊，請參閱[使用 S3 Storage Lens 評估儲存活動和用量](https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage_lens?icmpid=docs_s3_user_guide_MultiFactorAuthenticationDelete.html)。如需完整的指標清單，請參閱 [S3 Storage Lens 指標詞彙表](https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage_lens_metrics_glossary.html?icmpid=docs_s3_user_guide_MultiFactorAuthenticationDelete.html)。

儲存貯體擁有者、建立儲存貯體 AWS 帳戶 的 （根帳戶），以及所有授權使用者可以啟用版本控制。但只有儲存貯體擁有者 (根帳戶) 才能啟用 MFA Delete。如需詳細資訊，請參閱 AWS 安全部落格上的[安全存取 AWS 使用 MFA](https://aws.amazon.com/blogs/security/securing-access-to-aws-using-mfa-part-3/)。

**注意**  
若要使用 MFA Delete 搭配額版本控制，請啟用 `MFA Delete`。但是，您無法使用 AWS 管理主控台啟用 `MFA Delete`。您必須使用 AWS Command Line Interface (AWS CLI) 或 API。  
如需使用 MFA Delete 搭配版本控制的範例，請參閱 [在儲存貯體上啟用版本控制](manage-versioning-examples.md) 主題中的範例一節。  
您無法搭配使用 MFA 刪除與生命週期組態。如需生命週期組態以及它們如何與其他組態互動的詳細資訊，請參閱 [S3 生命週期如何與其他儲存貯體組態互動](lifecycle-and-other-bucket-config.md)。

若要啟用或停用 MFA Delete，您可以使用用來設定儲存貯體版本控制的相同 API。Amazon S3 會在存放儲存貯體版本控制狀態的相同 *versioning* 子資源中存放 MFA Delete 組態。

```
<VersioningConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> 
  <Status>VersioningState</Status>
  <MfaDelete>MfaDeleteState</MfaDelete>  
</VersioningConfiguration>
```

若要使用 MFA Delete，您可以使用硬體或虛擬 MFA 裝置來產生身分驗證碼。下列範例顯示硬體裝置上所顯示的已產生身分驗證碼。

![\[硬體裝置上所顯示之已產生身分驗證碼的範例。\]](http://docs.aws.amazon.com/zh_tw/AmazonS3/latest/userguide/images/MFADevice.png)


MFA Delete 與 MFA 保護的 API 存取功能針對不同情境提供保護。您可以在儲存貯體上設定 MFA Delete，確保無法意外刪除儲存貯體中的資料。存取機密 Amazon S3 資源時，可以使用 MFA 保護的 API 存取來強制另一個身分驗證因素 (MFA 碼)。您可能需要透過使用 MFA 所建立的暫時性憑證，才能完成任何對這些 Amazon S3 資源的操作。如需範例，請參閱 [需要 MFA](example-bucket-policies.md#example-bucket-policies-MFA)。

如需購買及啟用身分驗證裝置的詳細資訊，請參閱 [Multi-Factor Authentication](https://aws.amazon.com/iam/details/mfa/)。

## 啟用 S3 版本控制和設定 MFA Delete
<a name="enable-versioning-mfa-delete"></a>

### 使用 AWS CLI
<a name="enable-versioning-mfa-delete-cli"></a>

序號是可唯一識別 MFA 裝置的號碼。對於實體 MFA 裝置，這是裝置隨附的唯一序號。對於虛擬 MFA 裝置，序號是裝置 ARN。若要使用下列命令，請以您自己的資訊取代*使用者輸入預留位置*。

下列範例會啟用實體 MFA 裝置的儲存貯體上的 S3 版本控制和多重要素驗證 (MFA) 刪除。對於實體 MFA 裝置，在 `--mfa` 參數中傳遞 MFA 裝置序號、空格字元和身分驗證裝置上顯示值的串連。

```
aws s3api put-bucket-versioning --bucket amzn-s3-demo-bucket1 --versioning-configuration Status=Enabled,MFADelete=Enabled --mfa "SerialNumber 123456"
```

下列範例會啟用虛擬 MFA 裝置的儲存貯體上的 S3 版本控制和多重要素驗證 (MFA) 刪除。對於虛擬 MFA 裝置，在 `--mfa` 參數中傳遞 MFA 裝置 ARN 的串連、空格字元，以及身分驗證裝置上顯示的值。

```
aws s3api put-bucket-versioning --bucket amzn-s3-demo-bucket1 --versioning-configuration Status=Enabled,MFADelete=Enabled --mfa "arn:aws:iam::account-id:mfa/root-account-mfa-device 123789"
```

如需詳細資訊，請參閱 AWS rePost 文章[如何為 Amazon S3 儲存貯體開啟 MFA 刪除？](https://repost.aws/knowledge-center/s3-bucket-mfa-delete)。

### 使用 REST API
<a name="enable-versioning-mfa-delete-rest-api"></a>

如需使用 Amazon S3 REST API 指定 MFA Delete 的詳細資訊，請參閱 [PutBucketVersioning](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketVersioning.html)《Amazon Simple Storage Service API 參考》**。

# 使用已啟用版本控制之儲存貯體中的物件
<a name="manage-objects-versioned-bucket"></a>

設定版本控制狀態之前 Amazon S3 儲存貯體中所存放的物件版本 ID 為 `null`。當您啟用版本控制時，儲存貯體中的現有物件不會變更。Amazon S3 在未來請求中如何處理物件的方式會改變。

**轉移物件版本**  
您可以定義物件的生命週期組態規則，而這些物件具有定義良好的生命週期可在物件生命週期的特定時間將物件版本轉移至 S3 Glacier Flexible Retrieval 儲存體類別。如需詳細資訊，請參閱[管理物件的生命週期](object-lifecycle-mgmt.md)。

本節主題說明啟用版本控制之儲存貯體中的各種物件操作。如需版本控制的詳細資訊，請參閱「[使用 S3 版本控制保留多個版本的物件](Versioning.md)」。

**Topics**
+ [將物件新增至啟用版本控制的儲存貯體](AddingObjectstoVersioningEnabledBuckets.md)
+ [列出已啟用版本控制之儲存貯體中的物件](list-obj-version-enabled-bucket.md)
+ [從啟用版本控制的儲存貯體擷取物件版本](RetrievingObjectVersions.md)
+ [刪除啟用版本控制功能之儲存貯體中的物件](DeletingObjectVersions.md)
+ [設定已使用版本控制物件的許可](VersionedObjectPermissionsandACLs.md)

# 將物件新增至啟用版本控制的儲存貯體
<a name="AddingObjectstoVersioningEnabledBuckets"></a>

當您在儲存貯體上啟用版本控制後，Amazon S3 便會自動將唯一的版本 ID 新增至儲存貯體中存放的每個物件 (使用 `PUT`、`POST` 或 `CopyObject`)。

下圖顯示將物件新增至啟用版本控制的儲存貯體時，Amazon S3 會將唯一的版本 ID 新增至物件。

![\[圖例顯示將物件新增至啟用版本控制的儲存貯體時，新增至物件的唯一版本 ID。\]](http://docs.aws.amazon.com/zh_tw/AmazonS3/latest/userguide/images/versioning_PUT_versionEnabled.png)


**注意**  
Amazon S3 所指派的版本 ID 值是 URL 安全 (可加入 URI 中)。

如需版本控制的詳細資訊，請參閱「[使用 S3 版本控制保留多個版本的物件](Versioning.md)」。您可以使用主控台、 AWS SDKs 和 REST API，將物件版本新增至已啟用版本控制的儲存貯體。

## 使用主控台
<a name="add-obj-versioning-enabled-bucket-console"></a>

如需說明，請參閱「[上傳物件](upload-objects.md)」。

## 使用 AWS SDKs
<a name="add-obj-versioning-enabled-bucket-sdk"></a>

如需使用適用於 Java、.NET 和 PHP AWS SDKs 上傳物件的範例，請參閱 [上傳物件](upload-objects.md)。在非版本控制與已啟用版本控制的儲存貯體中上傳物件的範例相同；但是，如果是已啟用版本控制的儲存貯體，Amazon S3 會指派版本編號。否則，版本編號會是空值。

如需使用 AWS SDKs的詳細資訊，請參閱 [AWS 開發人員中心](https://aws.amazon.com/code/)。

## 使用 REST API
<a name="add-obj-versioning-enabled-bucket-rest"></a>

**將物件新增至啟用版本控制的儲存貯體**

1. 使用 `PutBucketVersioning` 要求啟用儲存貯體的版本控制。

   如需詳細資訊，請參閱《Amazon Simple Storage Service API 參考》**中的 [https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTVersioningStatus.html](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTVersioningStatus.html)。

1. 傳送 `PUT`、`POST` 或 `CopyObject` 要求，以將物件存放至儲存貯體。

將物件新增至已啟用版本控制的儲存貯體時，Amazon S3 會在 `x-amz-version-id` 回應標頭中傳回物件的版本 ID，如下例所示。

```
1. x-amz-version-id: 3/L4kqtJlcpXroDTDmJ+rmSpXd3dIbrHY
```

# 列出已啟用版本控制之儲存貯體中的物件
<a name="list-obj-version-enabled-bucket"></a>

本節提供列出已啟用版本控制之儲存貯體中物件版本的範例。Amazon S3 會將物件版本資訊存放至與儲存貯體有關聯的 *versions* 子資源。如需詳細資訊，請參閱[一般用途儲存貯體組態選項](UsingBucket.md#bucket-config-options-intro)。若要列出已啟用版本控制之儲存貯體，您需要 `ListBucketVersions` 許可。

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

請依照下列步驟使用 Amazon S3 主控台查看某個物件的不同版本。

**查看物件的多個版本**

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

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

1. 若要查看儲存貯體中的物件版本清單，請選擇 **Show versions** (顯示版本) 切換開關。

   針對每個物件版本，主控台會顯示唯一版本 ID、物件版本建立日期與時間，以及其他屬性。(設定版本控制狀態之前儲存貯體中所存放的物件會有 **null** 的版本 ID。)

   若只要列出物件而不顯示版本，請選擇 **List versions** (列出版本) 切換開關。

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

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

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

## 使用 AWS SDKs
<a name="list-obj-version-enabled-bucket-sdk-examples"></a>

本節中的範例會示範如何從已啟用版本控制之儲存貯體中，擷取物件清單。除非您指定較小的數值，否則每個請求最多可回傳 1,000 個版本。如果儲存貯體含有比限制數量更多的版本，則您需要傳送一連串可擷取所有版本清單的要求。在「頁面」中傳回結果的過程稱為*分頁*。

為了解說分頁運作方式，這些範例會限制每一個物件版本的回應。在擷取結果的第一頁，每個範例都會檢查以確定是否截斷了版本清單。如果是，則該範例則會繼續擷取頁面，直到擷取到所有版本。

**注意**  
以下範例還適用於尚未啟用版本控制的儲存貯體，或者尚沒有獨立版本的物件。在這些情況下，Amazon S3 會傳回版本 ID 為 `null` 的物件清單。

 如需使用 AWS SDKs的詳細資訊，請參閱 [AWS 開發人員中心](https://aws.amazon.com/code/)。

------
#### [ Java ]

如需建立和測試工作範例的說明，請參閱《 適用於 Java 的 AWS SDK 開發人員指南》中的[入門](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/getting-started.html)。

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.SdkClientException;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.ListVersionsRequest;
import com.amazonaws.services.s3.model.S3VersionSummary;
import com.amazonaws.services.s3.model.VersionListing;

public class ListKeysVersioningEnabledBucket {

    public static void main(String[] args) {
        Regions clientRegion = Regions.DEFAULT_REGION;
        String bucketName = "*** Bucket name ***";

        try {
            AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                    .withCredentials(new ProfileCredentialsProvider())
                    .withRegion(clientRegion)
                    .build();

            // Retrieve the list of versions. If the bucket contains more versions
            // than the specified maximum number of results, Amazon S3 returns
            // one page of results per request.
            ListVersionsRequest request = new ListVersionsRequest()
                    .withBucketName(bucketName)
                    .withMaxResults(2);
            VersionListing versionListing = s3Client.listVersions(request);
            int numVersions = 0, numPages = 0;
            while (true) {
                numPages++;
                for (S3VersionSummary objectSummary : versionListing.getVersionSummaries()) {
                    System.out.printf("Retrieved object %s, version %s\n",
                            objectSummary.getKey(),
                            objectSummary.getVersionId());
                    numVersions++;
                }
                // Check whether there are more pages of versions to retrieve. If
                // there are, retrieve them. Otherwise, exit the loop.
                if (versionListing.isTruncated()) {
                    versionListing = s3Client.listNextBatchOfVersions(versionListing);
                } else {
                    break;
                }
            }
            System.out.println(numVersions + " object versions retrieved in " + numPages + " pages");
        } catch (AmazonServiceException e) {
            // The call was transmitted successfully, but Amazon S3 couldn't process
            // it, so it returned an error response.
            e.printStackTrace();
        } catch (SdkClientException e) {
            // Amazon S3 couldn't be contacted for a response, or the client
            // couldn't parse the response from Amazon S3.
            e.printStackTrace();
        }
    }
}
```

------
#### [ .NET ]

如需有關設定和執行程式碼範例的資訊，請參閱《[適用於 .NET 的 AWS SDK 開發人員指南》中的適用於 .NET 的 SDK 入門](https://docs.aws.amazon.com/sdk-for-net/latest/developer-guide/net-dg-setup.html)。 *AWS *

```
using Amazon;
using Amazon.S3;
using Amazon.S3.Model;
using System;
using System.Threading.Tasks;

namespace Amazon.DocSamples.S3
{
    class ListObjectsVersioningEnabledBucketTest
    {
        static string bucketName = "*** bucket name ***";
        // Specify your bucket region (an example region is shown).
        private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USWest2;
        private static IAmazonS3 s3Client;

        public static void Main(string[] args)
        {
            s3Client = new AmazonS3Client(bucketRegion);
            GetObjectListWithAllVersionsAsync().Wait();
        }

        static async Task GetObjectListWithAllVersionsAsync()
        {
            try
            {
                ListVersionsRequest request = new ListVersionsRequest()
                {
                    BucketName = bucketName,
                    // You can optionally specify key name prefix in the request
                    // if you want list of object versions of a specific object.

                    // For this example we limit response to return list of 2 versions.
                    MaxKeys = 2
                };
                do
                {
                    ListVersionsResponse response = await s3Client.ListVersionsAsync(request); 
                    // Process response.
                    foreach (S3ObjectVersion entry in response.Versions)
                    {
                        Console.WriteLine("key = {0} size = {1}",
                            entry.Key, entry.Size);
                    }

                    // If response is truncated, set the marker to get the next 
                    // set of keys.
                    if (response.IsTruncated)
                    {
                        request.KeyMarker = response.NextKeyMarker;
                        request.VersionIdMarker = response.NextVersionIdMarker;
                    }
                    else
                    {
                        request = null;
                    }
                } while (request != null);
            }
            catch (AmazonS3Exception e)
            {
                Console.WriteLine("Error encountered on server. Message:'{0}' when writing an object", e.Message);
            }
            catch (Exception e)
            {
                Console.WriteLine("Unknown encountered on server. Message:'{0}' when writing an object", e.Message);
            }
        }
    }
}
```

------

## 使用 REST API
<a name="ListingtheObjectsinaVersioningEnabledBucket"></a>

**Example — 列出儲存貯體中的所有物件版本**  
若要列出儲存貯體中物件的所有版本，請在 `versions` 要求中使用 `GET Bucket` 子資源。Amazon S3 最多能擷取 1,000 個物件，每個物件版本完全算為一個物件。因此，如果儲存貯體包含兩個金鑰 (例如，`photo.gif` 與 `picture.jpg`)，而且第一個金鑰有 990 個版本，第二個金鑰有 400 個版本，單一要求將會擷取 `photo.gif` 的全部 990 個版本，並且只會擷取 `picture.jpg` 的最新 10 個版本。  
Amazon S3 會依存放順序來傳回物件版本，而最近存放的物件會先傳回。  
在 `GET Bucket` 要求中，包含 `versions` 子資源。  

```
1. GET /?versions HTTP/1.1
2. Host: bucketName.s3.amazonaws.com
3. Date: Wed, 28 Oct 2009 22:32:00 +0000
4. Authorization: AWS AKIAIOSFODNN7EXAMPLE:0RQf4/cRonhpaBX5sCYVf1bNRuU=
```

**Example — 擷取索引鍵的所有版本**  
 若要擷取物件版本子集，您可以使用 `GET Bucket` 的請求參數。如需詳細資訊，請參閱[https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html)。  

1. 將 `prefix` 參數設為您想要擷取之物件的索引鍵。

1. 使用 `GET Bucket` 子資源與 `versions` 來傳送 `prefix` 要求。

   `GET /?versions&prefix=objectName HTTP/1.1`

**Example — 使用字首擷取物件**  
下列範例會擷取其金鑰或開頭為 `myObject` 的物件。  

```
1. GET /?versions&prefix=myObject 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=
```
您可以使用其他要求參數來擷取物件之所有版本的子集。如需詳細資訊，請參閱《Amazon Simple Storage Service API 參考》**中的 [https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html)。

**Example — 在截斷回應時擷取其他物件清單**  
如果可在 `GET` 要求中傳回的物件數目超過 `max-keys` 的值，則回應會包含 `<isTruncated>true</isTruncated>`，並包含滿足要求但未傳回的第一個金鑰 (在 `NextKeyMarker` 中) 與第一個版本 ID (在 `NextVersionIdMarker` 中)。您可以使用這些傳回的值作為後續要求中的開始位置，以擷取可滿足 `GET` 要求的其他物件。  
使用下列程序可從儲存貯體中擷取可滿足原始 `GET Bucket versions` 要求的其他物件。如需 `key-marker`、`version-id-marker`、`NextKeyMarker` 和 `NextVersionIdMarker` 的詳細資訊，請參閱《Amazon Simple Storage Service API 參考》**中的 [https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html)。  
以下是滿足原始 `GET` 請求的其他回應：  
+ 將 `key-marker` 的值設為前一個回應的 `NextKeyMarker` 中所傳回的金鑰。
+ 將 `version-id-marker` 的值設為前一個回應的 `NextVersionIdMarker` 中所傳回的版本 ID。
+ 使用 `GET Bucket versions` 與 `key-marker` 來傳送 `version-id-marker` 要求。

**Example — 擷取開頭為所指定索引鍵與版本 ID 的物件**  

```
1. GET /?versions&key-marker=myObject&version-id-marker=298459348571 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=
```

## 使用 AWS CLI
<a name="list-obj-version-enabled-bucket-cli"></a>

以下命令會傳回有關儲存貯體中所有版本的物件的中繼資料。

```
aws s3api list-object-versions --bucket amzn-s3-demo-bucket1
```

如需 `list-object-versions` 的詳細資訊，請參閱《AWS CLI 命令參考》**中的 [https://docs.aws.amazon.com/cli/latest/reference/s3api/list-object-versions.html](https://docs.aws.amazon.com/cli/latest/reference/s3api/list-object-versions.html)。

# 從啟用版本控制的儲存貯體擷取物件版本
<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}."
        )
```

------

# 刪除啟用版本控制功能之儲存貯體中的物件
<a name="DeletingObjectVersions"></a>

您可以隨時從 Amazon S3 儲存貯體中刪除物件版本。針對明確定義生命週期的物件，您還可以定義生命週期組態規則，以要求 Amazon S3 讓目前物件版本過期，或永久移除非目前的物件版本。當儲存貯體已啟用版本控制或暫停版本控制時，生命週期組態動作的運作方式如下所示：
+ 此 `Expiration` 動作會套用至目前物件版本。Amazon S3 並不會刪除目前物件版本，而是新增*刪除標記*，將目前版本保留為非目前版本，這之後會成為目前版本。
+ `NoncurrentVersionExpiration` 動作會套用至非目前物件版本，而 Amazon S3 會永久移除這些物件版本。您無法復原永久移除的物件。

如需 S3 生命週期的詳細資訊，請參閱 [管理物件的生命週期](object-lifecycle-mgmt.md) 和 [S3 生命週期組態範例](lifecycle-configuration-examples.md)。

若要查看您的儲存貯體有多少個目前和非目前物件版本，您可以使用 Amazon S3 Storage Lens 指標。S3 Storage Lens 是一種雲端儲存體分析功能，您可以用來了解整個組織使用物件儲存體的情況及其活動情形。如需詳細資訊，請參閱[使用 S3 Storage Lens 最佳化儲存成本](https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage-lens-optimize-storage.html?icmpid=docs_s3_user_guide_DeletingObjectVersions.html)。如需完整的指標清單，請參閱 [S3 Storage Lens 指標詞彙表](https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage_lens_metrics_glossary.html?icmpid=docs_s3_user_guide_replication.html)。

**注意**  
 標準 Amazon S3 費率適用於所存放和傳送物件的每個版本，包含非目前物件版本。如需詳細資訊，請參閱 [Simple Storage Service (Amazon S3) 定價](https://aws.amazon.com/s3/pricing/)。

## 刪除要求使用案例
<a name="delete-request-use-cases"></a>

`DELETE` 要求的使用案例如下：
+ 啟用版本控制時，簡單 `DELETE` 無法永久刪除物件。(簡單 `DELETE` 請求是指未指定版本 ID 的請求。) 相反地，Amazon S3 會在儲存貯體中插入刪除標記，而該刪除標記會成為具有新 ID 的目前物件版本。

  當您嘗試其目前版本為刪除標記的 `GET` 物件時，Amazon S3 的行為就如同已刪除物件 (即使尚未清除也是一樣) 並傳回 404 錯誤。如需詳細資訊，請參閱[使用刪除標記](DeleteMarker.md)。

  下圖顯示簡單 `DELETE` 不會實際移除指定的物件。相反地，Amazon S3 會插入刪除標記。  
![\[顯示刪除標記插入的圖例。\]](http://docs.aws.amazon.com/zh_tw/AmazonS3/latest/userguide/images/versioning_DELETE_versioningEnabled.png)
+ 若要永久刪除已使用版本控制的物件，您必須使用 `DELETE Object versionId`。

  下圖顯示刪除所指定的物件版本會永久移除該物件。  
![\[圖表顯示 DELETE Object versionId 如何永久刪除特定物件版本。\]](http://docs.aws.amazon.com/zh_tw/AmazonS3/latest/userguide/images/versioning_DELETE_versioningEnabled2.png)

## 刪除物件版本
<a name="delete-object-version"></a>

您可以使用主控台、 AWS SDKs、REST API 或 刪除 Amazon S3 中的物件版本 AWS Command Line Interface。

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

1. 登入 AWS 管理主控台 ，並在 [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. 選擇 **Delete** (刪除)。

1. 在 **Permanently delete objects? (永久刪除物件？)** 中輸入 **permanently delete**。
**警告**  
永久刪除物件版本的動作無法復原。

1. 選擇 **Delete objects** (刪除物件)。

   Amazon S3 刪除物件版本。

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

如需使用適用於 Java、.NET 和 PHP AWS SDKs 刪除物件的範例，請參閱 [刪除 Amazon S3 物件](DeletingObjects.md)。從未使用版本控制和啟用版本控制的儲存貯體中刪除物件的範例相同。但是，對於啟用版本控制的儲存貯體，Amazon S3 會指派一個版本號碼。否則，版本編號會是空值。

如需使用 AWS SDKs的詳細資訊，請參閱 [AWS 開發人員中心](https://aws.amazon.com/code/)。

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

下列 Python 程式碼範例會透過刪除其所有版本，永久刪除已建立版本的物件。

```
def permanently_delete_object(bucket, object_key):
    """
    Permanently deletes a versioned object by deleting all of its versions.

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

    :param bucket: The bucket that contains the object.
    :param object_key: The object to delete.
    """
    try:
        bucket.object_versions.filter(Prefix=object_key).delete()
        logger.info("Permanently deleted all versions of object %s.", object_key)
    except ClientError:
        logger.exception("Couldn't delete all versions of %s.", object_key)
        raise
```

------

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

**刪除物件的特定版本**
+ 在 `DELETE` 中，指定版本 ID。

**Example — 刪除特定版本**  
下列範例會刪除 `photo.gif` 的 `UIORUnfnd89493jJFJ` 版本。  

```
1. DELETE /photo.gif?versionId=UIORUnfnd89493jJFJ HTTP/1.1 
2. Host: bucket.s3.amazonaws.com
3. Date: Wed, 12 Oct 2009 17:50:00 GMT
4. Authorization: AWS AKIAIOSFODNN7EXAMPLE:xQE0diMbLRepdf3YB+FIEXAMPLE=
5. Content-Type: text/plain
6. Content-Length: 0
```

### 使用 AWS CLI
<a name="delete-obj-version-enabled-bucket-cli"></a>

下列命令會將名為 test.txt 的物件從名為 `amzn-s3-demo-bucket1` 的儲存貯體中刪除。若要移除特定版本的物件，您必須是儲存貯體擁有者，且必須使用版本 ID 子資源。

```
aws s3api delete-object --bucket amzn-s3-demo-bucket1 --key test.txt --version-id versionID
```

如需 `delete-object` 的詳細資訊，請參閱《AWS CLI 命令參考》**中的 [https://docs.aws.amazon.com/cli/latest/reference/s3api/delete-object.html](https://docs.aws.amazon.com/cli/latest/reference/s3api/delete-object.html)。

如需刪除物件版本的詳細資訊，請參閱下列主題：
+ [使用刪除標記](DeleteMarker.md)
+ [移除刪除標記，使舊版本成為目前版本](ManagingDelMarkers.md#RemDelMarker)
+ [刪除已啟用 MFA Delete 之儲存貯體中的物件](UsingMFADelete.md)

# 使用刪除標記
<a name="DeleteMarker"></a>

Amazon S3 中的*刪除標記*是簡單 `DELETE` 請求中所指定版本控制物件的預留位置 (或標記)。簡單 `DELETE` 請求是指未指定版本 ID 的請求。因為物件位在已啟用版本控制的儲存貯體中，所以未刪除物件。不過，刪除標記會讓 Amazon S3 顯示如同該物件已刪除的狀態。您可以在刪除標記上使用 Amazon S3 API `DELETE` 呼叫。若要這樣做，您必須使用具有適當許可的 AWS Identity and Access Management (IAM) 使用者或角色提出`DELETE`請求。

刪除標記就像任何其他物件一樣，會有*金鑰名稱* (或*金鑰*) 與版本 ID。不過，刪除標記與其他物件的差異如下：
+ 刪除標記沒有任何相關聯的資料。
+ 刪除標記不會與存取控制清單 (ACL) 值相關聯。
+ 如果您發出刪除標記的 `GET` 請求，`GET` 請求不會擷取任何內容，因為刪除標記沒有資料。具體來說，當您的 `GET` 請求未指定 `versionId` 時，您會收到 404（找不到）錯誤。

刪除標記會累算在 Amazon S3 中因儲存而收取的最低費用中。刪除標記的儲存大小等於刪除標記的金鑰名稱大小。金鑰名稱是一連串的 Unicode 字元。金鑰名稱的 UTF-8 編碼會將 1 到 4 個位元組的儲存空間新增至名稱中每個字元的儲存貯體。刪除標記會存放在 S3 標準儲存類別中。

如果您想要了解您有多少個刪除標記以及存放它們的儲存類別，則可以使用 Amazon S3 Storage Lens。如需詳細資訊，請參閱[使用 Amazon S3 Storage Lens 監控您的儲存活動和用量](storage_lens.md)及[Amazon S3 Storage Lens 指標詞彙表](storage_lens_metrics_glossary.md)。

如需金鑰名稱的詳細資訊，請參閱「[命名 Amazon S3 物件](object-keys.md)」。如需刪除刪除標記的資訊，請參閱「[管理刪除標記](ManagingDelMarkers.md)」。

只有 Amazon S3 才能建立刪除標記，而且只要您對啟用或暫停版本控制的儲存貯體中的物件傳送 `DeleteObject` 要求，就會這麼做。`DELETE` 請求中所指定的物件實際上並不會刪除。相反地，刪除標記會成為物件的目前版本 物件的金鑰名稱 (或金鑰) 會成為刪除標記的金鑰。

如果您未在請求中指定 `versionId` 而取得物件，且其目前版本是刪除標記，則 Amazon S3 會回應以下內容：
+ 404 (找不到) 錯誤
+ 回應標頭 `x-amz-delete-marker: true`

如果您在請求中指定 `versionId` 而取得物件，且指定的版本是刪除標記，則 Amazon S3 會回應以下內容：
+ 405 (不允許的方法) 錯誤
+ 回應標頭 `x-amz-delete-marker: true`
+ 回應標頭 `Last-Modified: timestamp` (僅在使用 [HeadObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html) or [GetObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html) API 操作時)

`x-amz-delete-marker: true` 回應標頭會告訴您所存取的物件是刪除標記。此回應標頭永遠不會傳回 `false`，因為當值為 `false` 時，物件的目前或指定版本不是刪除標記。

`Last-Modified` 回應標頭會提供刪除標記的建立時間。

下圖顯示目前版本為刪除標記的物件上的 `GetObject` API 呼叫回應 404 (找不到) 錯誤，且回應標頭包含 `x-amz-delete-marker: true` 的情形。

![\[圖中顯示對刪除標記的 GetObject 呼叫傳回 404 (找不到) 錯誤。\]](http://docs.aws.amazon.com/zh_tw/AmazonS3/latest/userguide/images/versioning_DELETE_NoObjectFound.png)


如果您在請求中指定 `versionId` 來對物件進行 `GetObject` 呼叫，且指定的版本是刪除標記，Amazon S3 會回應 405 (方法不允許) 錯誤，且回應標頭包含 `x-amz-delete-marker: true` 和 `Last-Modified: timestamp`。

![\[顯示對刪除標記的 GetObject 呼叫傳回 405 (不允許的方法) 錯誤的圖例。\]](http://docs.aws.amazon.com/zh_tw/AmazonS3/latest/userguide/images/versioning_DELETE_NoObjectFound_405.png)


即使已覆寫，刪除標記仍會保留在您的物件版本中。列出刪除標記 (以及其他版本的物件) 的唯一方式是使用 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectVersions.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectVersions.html) 請求。您可以在 AWS 管理主控台 中提出此請求，方法是列出一般用途儲存貯體中的物件，然後選取**顯示版本**。如需詳細資訊，請參閱[列出已啟用版本控制之儲存貯體中的物件](list-obj-version-enabled-bucket.md)。

下圖顯示 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html) 或 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjects.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjects.html) 請求不會傳回其目前版本是刪除標記的物件。

![\[圖例顯示 ListObjectsV2 或 ListObjects 呼叫不傳回任何刪除標記的情形。\]](http://docs.aws.amazon.com/zh_tw/AmazonS3/latest/userguide/images/versioning_GETBucketwithDeleteMarkers.png)


# 管理刪除標記
<a name="ManagingDelMarkers"></a>

## 設定生命週期以自動清除過期的刪除標記
<a name="LifecycleDelMarker"></a>

過期的物件刪除標記是刪除所有物件版本的標記，且僅保留單一刪除標記。如果生命週期組態設定為刪除目前版本，或明確設定 `ExpiredObjectDeleteMarker` 動作，則 Amazon S3 會移除過期物件的刪除標記。如需範例，請參閱 [移除已啟用版本控制之儲存貯體中的過期物件刪除標記](lifecycle-configuration-examples.md#lifecycle-config-conceptual-ex7)。

## 移除刪除標記，使舊版本成為目前版本
<a name="RemDelMarker"></a>

當您在已啟用版本控制的儲存貯體中刪除物件時，所有版本都會保留在儲存貯體中，而 Amazon S3 會為該物件建立刪除標記。若要取消刪除物件，您必須刪除此刪除標記。如需版本控制與刪除標記的詳細資訊，請參閱「[使用 S3 版本控制保留多個版本的物件](Versioning.md)」。

若要對刪除標記永久刪除，您必須在 `DeleteObject versionId` 要求中包含其版本 ID。下圖顯示 `DeleteObject versionId` 要求如何永久移除刪除標記。

![\[顯示使用其版本 ID 刪除刪除標記的圖例。\]](http://docs.aws.amazon.com/zh_tw/AmazonS3/latest/userguide/images/versioning_DELETE_deleteMarkerVersioned.png)


移除刪除標記的效果是簡單的 `GET` 請求現在會擷取物件的目前版本 ID (121212)。

**注意**  
如果您使用 `DeleteObject` 請求，其中目前版本為刪除標記 (不指定刪除標記的版本 ID)，則 Amazon S3 不會刪去刪除標記，而是 `PUTs` 另一個刪除標記。

若要刪除具有 `NULL` 版本 ID 的刪除標記，必須在 `DeleteObject` 請求中作為版本 ID 傳遞 `NULL`。下圖顯示了如何作出沒有版本 ID 的簡單 `DeleteObject` 請求，其中目前版本為刪除標記，不會刪除任何內容，而是添加一個具有唯一版本 ID (7498372) 的額外刪除標記。

![\[顯示使用 NULL 版本 ID 刪除刪除標記的圖例。\]](http://docs.aws.amazon.com/zh_tw/AmazonS3/latest/userguide/images/versioning_DELETE_deleteMarker.png)


## 使用 S3 主控台
<a name="undelete-objects"></a>

使用下列步驟，從 S3 儲存貯體中復原不是資料夾的已刪除物件，包括這些資料夾內的物件。

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

1. 在 **Buckets** (儲存貯體) 清單中，選擇您所需的儲存貯體名稱。

1. 若要查看儲存貯體中的物件**版本**清單，請選擇 **List versions** (列出版本) 切換開關。您將可以查看已刪除物件的刪除標記。

   

1. 若要取消刪除物件，您必須刪除刪除標記。選取**刪除標記**旁的核取方塊以復原物件，然後選擇 **Delete** (刪除)。

1. 在 **Delete objects (刪除物件)** 頁面上確認刪除。

   1. 對於 **Permanently delete objects?** (永久刪除物件？)，輸入 **permanently delete**。

   1. 選擇 **Delete objects** (刪除物件)。

**注意**  
您無法使用 Amazon S3 主控台來取消刪除資料夾。您必須使用 AWS CLI 或 SDK。例如，請參閱 AWS 知識中心的[如何擷取在已啟用版本控制的儲存貯體中刪除的 Amazon S3 物件？](https://aws.amazon.com/premiumsupport/knowledge-center/s3-undelete-configuration/)。

## 使用 REST API
<a name="delete-marker-rest-api"></a>

**永久移除刪除標記**

1. 將 `versionId` 設為您想要移除之刪除標記的版本 ID。

1. 傳送 `DELETE Object versionId` 要求。

**Example — 移除刪除標記**  
下列範例會移除 `photo.gif` 版本 4857693 的刪除標記。  

```
1. DELETE /photo.gif?versionId=4857693 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=
```

當您刪去刪除標記時，Amazon S3 在回應中會包含下列各項：

```
1. 204 NoContent 
2. x-amz-version-id: versionID 
3. x-amz-delete-marker: true
```

## 使用 AWS SDKs
<a name="remove-delete-marker-examples-sdk"></a>

如需使用 AWS SDKs的詳細資訊，請參閱 [AWS開發人員中心](https://aws.amazon.com/code/)。

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

下列 Python 程式碼範例示範如何從物件移除刪除標記，從而使最新的非目前版本成為物件的目前版本。

```
def revive_object(bucket, object_key):
    """
    Revives a versioned object that was deleted by removing the object's active
    delete marker.
    A versioned object presents as deleted when its latest version is a delete marker.
    By removing the delete marker, we make the previous version the latest version
    and the object then presents as *not* deleted.

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

    :param bucket: The bucket that contains the object.
    :param object_key: The object to revive.
    """
    # Get the latest version for the object.
    response = s3.meta.client.list_object_versions(
        Bucket=bucket.name, Prefix=object_key, MaxKeys=1
    )

    if "DeleteMarkers" in response:
        latest_version = response["DeleteMarkers"][0]
        if latest_version["IsLatest"]:
            logger.info(
                "Object %s was indeed deleted on %s. Let's revive it.",
                object_key,
                latest_version["LastModified"],
            )
            obj = bucket.Object(object_key)
            obj.Version(latest_version["VersionId"]).delete()
            logger.info(
                "Revived %s, active version is now %s  with body '%s'",
                object_key,
                obj.version_id,
                obj.get()["Body"].read(),
            )
        else:
            logger.warning(
                "Delete marker is not the latest version for %s!", object_key
            )
    elif "Versions" in response:
        logger.warning("Got an active version for %s, nothing to do.", object_key)
    else:
        logger.error("Couldn't get any version info for %s.", object_key)
```

------

# 刪除已啟用 MFA Delete 之儲存貯體中的物件
<a name="UsingMFADelete"></a>

當您設定 MFA Delete，只有根使用者可以永久刪除物件版本，或變更 S3 儲存貯體上的版本控制組態。您必須使用 MFA 裝置來驗證根使用者，以執行刪除動作。

如果儲存貯體的版本控制組態已啟用 MFA Delete，則儲存貯體擁有者必須在要求中包含 `x-amz-mfa` 要求標頭，才能永久刪除物件版本或變更儲存貯體的版本控制狀態。包含 `x-amz-mfa` 的要求必須使用 HTTPS。

標頭的值是身分驗證裝置序號、空格與其上所顯示之身分驗證碼的組合。如果您未包含此要求標頭，則要求會失敗。

使用 時， AWS CLI 包含與 `mfa` 參數值相同的資訊。

如需身分驗證裝置的詳細資訊，請參閱 [Multi-factor Authentication](https://aws.amazon.com/iam/details/mfa/)。

如需啟用 MFA Delete 的詳細資訊，請參閱「[設定 MFA Delete](MultiFactorAuthenticationDelete.md)」。

**注意**  
透過 AWS 管理主控台無法刪除已啟用 MFA Delete 之已啟用版本控制的儲存貯體中的物件。

## 使用 AWS CLI
<a name="MFADeleteCLI"></a>

若要刪除已啟用版本控制且已啟用 MFA Delete 的儲存貯體中的物件，請使用下列命令。當您使用下列範例命令時，請以您自己的資訊取代 `user input placeholders`。

```
 aws s3api delete-object --bucket amzn-s3-demo-bucket --key OBJECT-KEY --version-id "VERSION ID" --mfa "MFA_DEVICE_SERIAL_NUMBER MFA_DEVICE_CODE"						
```

## 使用 REST API
<a name="MFADeleteAPI"></a>

下列範例刪除 `my-image.jpg` (具有指定版本)，而其位於已設定啟用 MFA Delete 的儲存貯體中。

如需詳細資訊，請參閱《Amazon Simple Storage Service API 參考》中的 [https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectDELETE.html](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectDELETE.html)。

```
1. DELETE /my-image.jpg?versionId=3HL4kqCxf3vjVBH40Nrjfkd HTTPS/1.1
2. Host: bucketName.s3.amazonaws.com
3. x-amz-mfa: 20899872 301749
4. Date: Wed, 28 Oct 2009 22:32:00 GMT
5. Authorization: AWS AKIAIOSFODNN7EXAMPLE:0RQf4/cRonhpaBX5sCYVf1bNRuU=
```

# 設定已使用版本控制物件的許可
<a name="VersionedObjectPermissionsandACLs"></a>

Amazon S3 中物件的許可在版本層級進行設定。每個版本都有自己的物件擁有者。 AWS 帳戶 建立物件版本的 是擁有者。因此，您可以為相同物件的不同版本設定不同的許可。要做到這一點，您必須在 `PUT Object versionId acl` 要求中指定您想要設定其許可之物件的版本 ID。如需使用 ACL 的詳細說明與指示，請參閱「[Amazon S3 的身分和存取管理](security-iam.md)」。

**Example — 設定物件版本的許可**  
下列請求會將正式使用者 ID 為 *b4bf1b36f9716f094c3079dcf5ac9982d4f2847de46204d47448bc557fb5ac2a* 的承授者許可設定為金鑰 、`my-image.jpg`、版本 ID、 `FULL_CONTROL`上的 `3HL4kqtJvjVBH40Nrjfkd`。  

```
 1. PUT /my-image.jpg?acl&versionId=3HL4kqtJvjVBH40Nrjfkd 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=
 5. Content-Length: 124
 6.  
 7. <AccessControlPolicy>
 8.   <Owner>
 9.     <ID>75cc57f09aa0c8caeab4f8c24e99d10f8e7faeebf76c078efc7c6caea54ba06a</ID>
10.   </Owner>
11.   <AccessControlList>
12.     <Grant>
13.       <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CanonicalUser">
14.         <ID>a9a7b886d6fd24a52fe8ca5bef65f89a64e0193f23000e241bf9b1c61be666e9</ID>
15.       </Grantee>
16.       <Permission>FULL_CONTROL</Permission>
17.     </Grant>
18.   </AccessControlList>
19.   </AccessControlPolicy>
```

同樣地，若要取得特定物件版本的許可，您必須在 `GET Object versionId acl` 要求中指定其版本 ID。您需要包含版本 ID；因為，根據預設，`GET Object acl` 會傳回物件之目前版本的許可。

**Example — 擷取所指定物件版本的許可**  
在下列範例中，Amazon S3 傳回金鑰 `my-image.jpg` 版本 ID 為 `DVBH40Nr8X8gUMLUo` 的許可。  

```
1. GET /my-image.jpg?versionId=DVBH40Nr8X8gUMLUo&acl 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
```

如需詳細資訊，請參閱《Amazon Simple Storage Service API 參考》**中的 [https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectGETacl.html](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectGETacl.html)。

# 使用暫停版本控制之儲存貯體中的物件
<a name="VersionSuspendedBehavior"></a>

在 Amazon S3 中，您可以暫停版本控制，以停止產生儲存貯體中相同物件的新版本。在您只希望在儲存貯體中保留一個物件版本時，您可能會這樣做。或者，可能因為您不想產生多個版本的費用。

當您暫停版本控制時，儲存貯體中的現有物件不會變更。Amazon S3 在未來請求中如何處理物件的方式會改變。本節主題說明暫停版本控制之儲存貯體中的各種物件操作，包括新增、擷取和刪除物件。

如需 S3 版本控制的詳細資訊，請參閱「[使用 S3 版本控制保留多個版本的物件](Versioning.md)」。如需擷取物件版本的詳細資訊，請參閱[從啟用版本控制的儲存貯體擷取物件版本](RetrievingObjectVersions.md)。

**Topics**
+ [將物件新增至暫停版本控制的儲存貯體](AddingObjectstoVersionSuspendedBuckets.md)
+ [從暫停版本控制的儲存貯體中擷取物件](RetrievingObjectsfromVersioningSuspendedBuckets.md)
+ [刪除暫停版本控制之儲存貯體中的物件](DeletingObjectsfromVersioningSuspendedBuckets.md)

# 將物件新增至暫停版本控制的儲存貯體
<a name="AddingObjectstoVersionSuspendedBuckets"></a>

您可以在 Amazon S3 中將物件新增至已暫停版本控制的儲存貯體，以建立含 null 版本 ID 的物件，或覆寫任何具有相符版本 ID 的物件版本。

當您在儲存貯體上暫停版本控制後，Amazon S3 便會自動將 `null` 版本 ID 新增至此後儲存貯體中存放的每個後續物件 (使用 `PUT`、`POST` 或 `CopyObject`)。

下圖顯示將物件新增至暫停版本控制的儲存貯體時，Amazon S3 如何將版本 ID `null` 新增至物件。

![\[Amazon S3 將 null 的版本 ID 新增至物件圖形。\]](http://docs.aws.amazon.com/zh_tw/AmazonS3/latest/userguide/images/versioning_PUT_versionSuspended.png)


如果 null 版本已在儲存貯體中，而且您新增另一個具有相同金鑰的物件，則新增的物件會覆寫原始 null 版本。

如果儲存貯體中具有已啟用版本控制的物件，則您 `PUT` 的版本會變成物件的目前版本。下圖顯示如何將物件新增至包含已使用版本控制之物件的儲存貯體而不會覆寫已在儲存貯體中的物件。

在此情況下，111111 版本已在儲存貯體中。Amazon S3 會將 null 版本 ID 連接至所新增的物件，並將物件存放在儲存貯體中。不會覆寫 111111 版本。

![\[Amazon S3 將 null 的版本 ID 新增至物件，而不覆寫 111111 版圖形。\]](http://docs.aws.amazon.com/zh_tw/AmazonS3/latest/userguide/images/versioning_PUT_versionSuspended3.png)


如果儲存貯體中已有 null 版本，則會覆寫 null 版本，如下圖所示。

![\[Amazon S3 將 null 的版本 ID 新增至物件，同時覆寫原始內容圖形。\]](http://docs.aws.amazon.com/zh_tw/AmazonS3/latest/userguide/images/versioning_PUT_versionSuspended4.png)


雖然 `PUT` 前後之 null 版本的鍵與版本 ID (`null`) 相同，但是一開始存放在儲存貯體中 null 版本的內容會取代為 `PUT` 到儲存貯體中的物件內容。

# 從暫停版本控制的儲存貯體中擷取物件
<a name="RetrievingObjectsfromVersioningSuspendedBuckets"></a>

不論是否已啟用儲存貯體的版本控制，`GET Object` 要求都會傳回物件的目前版本。下圖顯示簡單 `GET` 如何傳回物件的目前版本。

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


# 刪除暫停版本控制之儲存貯體中的物件
<a name="DeletingObjectsfromVersioningSuspendedBuckets"></a>

您可以刪除暫停版本控制之儲存貯體中的物件，以移除具有 null 版本 ID 的物件。

如果某個儲存貯體的版本控制處於暫停狀態，則 `DELETE` 要求：
+ 只能移除版本 ID 為 `null` 的物件。
+ 如果儲存貯體中沒有物件的 null 版本，則不會移除任何項目。
+ 將刪除標記插入至儲存貯體。

如果儲存貯體版本控制已暫停，操作會移除具有 null `versionId` 的物件。如果版本 ID 存在，Amazon S3 會插入刪除標記，該標記會成為物件的目前版本。下圖顯示簡單的 `DELETE` 如何移除 null 版本，而且 Amazon S3 會在其位置插入刪除標記，而非 `null` 版本 ID。

![\[圖例顯示可移除具有 NULL 版本 ID 之物件的簡單刪除作業。\]](http://docs.aws.amazon.com/zh_tw/AmazonS3/latest/userguide/images/versioning_DELETE_versioningSuspended.png)


若要永久刪除具有 `versionId` 的物件，您必須在請求中包含物件的 `versionId`。因為刪除標記不包含任何內容，所以在刪除標記取代版本時，您將遺失該 `null` 版本的內容。

下圖顯示沒有 null 版本的儲存貯體。在此情況下，`DELETE` 不會移除任何項目。相反地，Amazon S3 只會插入刪除標記。

![\[顯示刪除標記插入的圖例。\]](http://docs.aws.amazon.com/zh_tw/AmazonS3/latest/userguide/images/versioning_DELETE_versioningSuspendedNoNull.png)


即使在暫停版本控制的儲存貯體中，儲存貯體擁有者也可以透過在`DELETE`請求中包含版本 ID 來永久刪除指定的版本，除非已明確拒絕`DELETE`請求的許可。例如，若要拒絕刪除任何具有`null`版本 ID 的物件，您必須明確拒絕 `s3:DeleteObject`和 `s3:DeleteObjectVersions`許可。

下圖顯示刪除所指定的物件版本會永久移除該物件版本。只有儲存貯體擁有者才能刪除所指定的物件版本。

![\[顯示使用指定版本 ID 永久刪除物件的圖例。\]](http://docs.aws.amazon.com/zh_tw/AmazonS3/latest/userguide/images/versioning_DELETE_versioningEnabled2.png)


# 針對版本控制進行疑難排解
<a name="troubleshooting-versioning"></a>

下列主題可協助您針對一些常見的 Amazon S3 版本控制問題進行疑難排解。

**Topics**
+ [我想要復原已啟用版本控制的儲存貯體中意外刪除的物件](#recover-objects)
+ [我想永久刪除版本控制的物件](#delete-objects-permanent)
+ [啟用儲存貯體版本控制後，我遭遇效能降低](#performance-degradation)

## 我想要復原已啟用版本控制的儲存貯體中意外刪除的物件
<a name="recover-objects"></a>

一般而言，從 S3 儲存貯體刪除物件版本時，沒有方法可供 Amazon S3 復原它們。不過，如果您已在 S3 儲存貯體上啟用 S3 版本控制，則未指定版本 ID 的 `DELETE` 請求將無法永久刪除物件。相反地，刪除標記會新增為預留位置。此刪除標記會成為物件的目前版本。

若要驗證已刪除的物件是永久刪除還是暫時刪除 (其位置有刪除標記)，請執行下列動作：

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

1. 在左側導覽窗格中，選擇 **Buckets** (儲存貯體)。

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

1. 在**物件**清單中，開啟搜尋列右側的**顯示版本**切換，然後在搜尋列中搜尋已刪除的物件。只在儲存貯體上先前已啟用版本控制時，才能使用此切換。

   您也可以使用 [S3 清查來搜尋已刪除的物件](storage-inventory.md#storage-inventory-contents)。

1. 如果您在切換**顯示版本**或建立清查報告之後找不到物件，也找不到物件的[刪除標記](DeleteMarker.md)，則刪除是永久的，而且無法復原該物件。



您也可以從 AWS Command Line Interface () 使用 `HeadObject` API 操作來驗證已刪除物件的狀態AWS CLI。若要這樣做，請使用下列 `head-object` 命令，並以您自己的資訊取代 `user input placeholders`。

`aws s3api head-object --bucket amzn-s3-demo-bucket --key index.html`

如果在目前版本為刪除標記的已版本控制物件上執行 `head-object` 命令，您將會收到 404 找不到錯誤訊息。例如：

呼叫 HeadObject 操作時發生錯誤 (404)：找不到

如果您在已版本控制的物件上執行 `head-object` 命令，並提供物件的版本 ID，Amazon S3 會擷取物件的中繼資料，確認該物件仍然存在且不會永久刪除。

`aws s3api head-object --bucket amzn-s3-demo-bucket --key index.html --version-id versionID`

```
{
"AcceptRanges": "bytes",
"ContentType": "text/html",
"LastModified": "Thu, 16 Apr 2015 18:19:14 GMT",
"ContentLength": 77,
"VersionId": "Zg5HyL7m.eZU9iM7AVlJkrqAiE.0UG4q",
"ETag": "\"30a6ec7e1a9ad79c203d05a589c8b400\"",
"Metadata": {}
}
```

如果找到物件且最新版本是刪除標記，則該物件的先前版本仍然存在。由於刪除標記是物件的目前版本，您可以將刪除標記刪除，來復原物件。

在您永久移除刪除標記之後，物件的第二個最新版本會變成物件的目前版本，使您的物件再次可用。如需如何復原物件的視覺描述，請參閱[移除刪除標記](ManagingDelMarkers.md#RemDelMarker)。

若要移除特定版本的物件，您必須是儲存貯體擁有者。若要對刪除標記永久刪除，您必須在 `DeleteObject` 要求中包含其版本 ID。若要將刪除標記刪除，請使用下列命令，並以您自己的資訊取代 `user input placeholders`。

****  
`aws s3api delete-object --bucket amzn-s3-demo-bucket --key index.html --version-id versionID`

如需 `delete-object` 命令的詳細資訊，請參閱《AWS CLI 命令參考》**中的 [https://docs.aws.amazon.com//cli/latest/reference/s3api/delete-object.html](https://docs.aws.amazon.com//cli/latest/reference/s3api/delete-object.html)。如需永久將刪除標記刪除的詳細資訊，請參閱 [管理刪除標記](ManagingDelMarkers.md)。

## 我想永久刪除版本控制的物件
<a name="delete-objects-permanent"></a>

在已啟用版本控制的儲存貯體中，沒有版本 ID 的 `DELETE` 請求無法永久刪除物件。相反地，這類請求會插入刪除標記。

若要永久刪除已版本控制的物件，您可以從下列方法中選擇：
+ 建立 S3 生命週期規則以永久刪除非目前版本。若要永久刪除非現行版本，請選取**永久刪除物件的非現行版本**，然後在**物件變成非現行版本後的天數**中輸入天數。您可以選擇指定要保留的較新版本數目，方法是在**要保留的較新版本數目**下方輸入值。如需建立此規則的詳細資訊，請參閱[設定 S3 生命週期組態](how-to-set-lifecycle-configuration-intro.md)。
+ 透過在 `DELETE` 請求中包含版本 ID 來刪除指定的版本。如需詳細資訊，請參閱[如何永久刪除已版本控制的物件](DeletingObjectVersions.md#delete-request-use-cases)。
+ 建立生命週期規則以結束目前版本。若要結束物件的目前版本，請選取**讓物件的目前版本過期**，然後在**物件建立後的天數**中輸入天數。如需建立此生命週期規則的詳細資訊，請參閱[設定 S3 生命週期組態](how-to-set-lifecycle-configuration-intro.md)。
+ 若要永久刪除所有已版本控制的物件並刪除標記，請建立兩個生命週期規則：一個讓目前版本過期，並永久刪除非目前版本的物件，另一個則用於刪除過期的物件刪除標記。

在已啟用版本控制的儲存貯體中，未指定版本 ID 的 `DELETE` 請求只能移除版本 ID 為 `NULL` 的物件。如果物件是在啟用版本控制時上載，則未指定版本 ID 的 `DELETE` 請求會建立該物件的刪除標記。

**注意**  
對於啟用 S3 物件鎖定的儲存貯體，具有受保護`DELETE`物件版本 ID 的物件請求會導致 403 拒絕存取錯誤。沒有版本 ID 的 `DELETE` 物件請求會將刪除標記新增為具有 200 OK 回應之物件的最新版本。無法永久刪除受「物件鎖定」保護的物件，直到移除其保留期和法務保存。如需詳細資訊，請參閱[S3 物件鎖定的運作方式](object-lock.md#object-lock-overview)。

## 啟用儲存貯體版本控制後，我遭遇效能降低
<a name="performance-degradation"></a>

如果刪除標記或已版本控制的物件太多，以及如果未遵循最佳實務，則已啟用版本控制的儲存貯體可能會降低效能。

**刪除標記過多**  
在您於儲存貯體上啟用版本控制之後，對物件所做的 `DELETE` 請求 (沒有版本 ID) 會使用唯一的版本 ID 來建立刪除標記。具有**讓物件的目前版本過期**規則的生命週期組態會將具有唯一版本 ID 的刪除標記新增至每個物件。過多的刪除標記可能會降低儲存貯體中的效能。

儲存貯體上的版本控制暫停時，Amazon S3 會在新建立的物件上，將版本 ID 標記為 `NULL`。在暫停版本控制的儲存貯體中，過期動作會指示 Amazon S3 建立刪除標記，並以 `NULL` 作為版本 ID。在暫停版本控制的儲存貯體中，會針對任何刪除請求建立 `NULL` 刪除標記。當刪除所有物件版本，僅保留單一刪除標記時，這些 `NULL` 刪除標記也稱為過期的物件刪除標記。如果累積了太多 `NULL` 刪除標記，則儲存貯體中的效能會降低。

**已版本控制的物件太多**  
如果已啟用版本控制的儲存貯體包含具有數百萬個版本的物件，則可能會增加 503 服務無法使用錯誤。當注意到針對已啟用 S3 版本控制之儲存貯體的 `PUT` 或 `DELETE` 物件請求，接收 HTTP 503 無法使用服務回應的數目明顯增加時，您可能在儲存貯體中具有一或多個含數百萬個版本的物件。當您的物件具有數百萬個版本時，Amazon S3 便會自動對儲存貯體的請求限流。限流請求可保護儲存貯體免於過多的請求流量，這可能會潛在地阻礙對同一個儲存貯體發出其他請求。

若要判斷哪些物件具有數百萬個版本，請使用「S3 清查」。「S3 清查」會產生一份報告，提供儲存貯體中物件的一般檔案清單。如需詳細資訊，請參閱[使用 S3 庫存清單編目和分析資料](storage-inventory.md)。

若要驗證儲存貯體中是否有大量已版本控制的物件，請使用 S3 Storage Lens 指標來檢視**目前版本物件計數**、**非目前版本物件計數**和**刪除標記物件計數**。如需 Storage Lens 指標的詳細資訊，請參閱 [Amazon S3 Storage Lens 指標詞彙表](storage_lens_metrics_glossary.md)。

如果應用程式一再覆寫同一個物件，導致物件可能產生數百萬個版本，Amazon S3 團隊建議客戶展開調查，以判斷應用程式是否正常運作。例如，一週內每分鐘覆寫相同物件的應用程式可以建立超過一萬個版本。我們建議每個物件儲存不超過十萬個版本。如果您有使用案例需要一或多個物件的數百萬個版本，請聯絡 AWS 支援 團隊以協助您判斷更好的解決方案。

**最佳實務**  
為了防止版本控制相關的效能降低問題，建議您採用下列最佳實務：
+ 啟用生命週期規則，使物件的先前版本過期。例如，您可以建立生命週期規則，在物件變成非目前版本的 30 天後使非目前版本過期。如果您不想要刪除所有的非目前版本，也可以保留多個非目前版本。如需詳細資訊，請參閱[設定 S3 生命週期組態](how-to-set-lifecycle-configuration-intro.md)。
+ 啟用生命週期規則，以刪除儲存貯體中沒有關聯資料物件的過期物件刪除標記。如需詳細資訊，請參閱[移除過期的物件刪除標記](lifecycle-configuration-examples.md#lifecycle-config-conceptual-ex7)。

如需其他 Amazon S3 效能最佳化最佳實務，請參閱[最佳實務設計模式](optimizing-performance.md)。