

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

# 在儲存貯體上啟用版本控制
<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.goskope.com.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
```

------