在儲存貯體上啟用版本控制 - Amazon Simple Storage Service

在儲存貯體上啟用版本控制

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

注意

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

如需 S3 版本控制的詳細資訊,請參閱「使用 S3 版本控制保留多個版本的物件」。如需有關使用已啟用版本控制儲存貯體中物件的資訊,請參閱使用已啟用版本控制之儲存貯體中的物件

若要進一步了解如何使用 S3 版本控制來保護資料,請參閱教學課程:使用 S3 版本控制、S3 物件鎖定和 S3 複寫,保護 Amazon S3 上的資料,以防意外刪除或發生應用程式錯誤

您建立的每個 S3 儲存貯體都會有相關聯的 versioning 子資源。(如需詳細資訊,請參閱「一般用途儲存貯體組態選項」。) 儲存貯體預設為未使用版本控制,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 的身分和存取管理」。

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

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

啟用或停用 S3 一般用途儲存貯體的版本控制
  1. 登入 AWS 管理主控台,並開啟位於 https://console.aws.amazon.com/s3/ 的 Amazon S3 主控台。

  2. 在左側導覽窗格中,選擇一般用途儲存貯體

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

  4. 選擇 Properties (屬性)。

  5. Bucket Versioning (儲存貯體版本控制) 底下,選擇 Edit (編輯)。

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

注意

您可以搭配版本控制來使用 AWS 多重要素驗證 (MFA)。搭配使用 MFA 與版本控制時,您必須提供 AWS 帳戶 的存取金鑰和來自該帳戶 MFA 裝置的有效碼,才能永久刪除物件版本,或是暫停或重新啟用版本控制。

若要使用 MFA 與版本控制搭配,請啟用 MFA Delete。但是,您無法使用 AWS 管理主控台 來啟用 MFA Delete。您必須使用 AWS Command Line Interface (AWS CLI) 或 API。如需詳細資訊,請參閱「設定 MFA Delete」。

下列範例啟用 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」。

如需使用 AWS CLI 啟用版本控制的詳細資訊,請參閱《AWS CLI 命令參考》中的 put-bucket-versioning

下列範例啟用儲存貯體上的版本控制,然後使用 適用於 Java 的 AWS SDK 和 適用於 .NET 的 AWS SDK 擷取版本控制狀態。如需有關使用其他 AWS SDK 的詳細資訊,請參閱 AWS 開發人員中心

.NET

如需設定及執行程式碼範例的資訊,請參閱《適用於 .NET 的 AWS SDK 開發人員指南》中的適用於 .NET 的 AWS SDK 入門

using System; using Amazon.S3; using Amazon.S3.Model; namespace s3.amazon.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開發人員指南》中的入門

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