本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
在儲存貯體上啟用版本控制
您可以使用 Amazon S3 版本控制在單一儲存貯體中保留物件的多個版本。本節提供如何使用主控台、REST API、 AWS SDKs和 AWS Command Line Interface () 在儲存貯體上啟用版本控制的範例AWS CLI。
第一次在儲存貯體上啟用版本控制後,變更最多可能需要 15 分鐘才能在 S3 系統中完全傳播。在此期間,啟用版本控制後建立或更新的物件GET
請求可能會導致HTTP 404 NoSuchKey
錯誤。建議您在啟用版本控制後等待 15 分鐘,再對儲存貯體中的物件執行任何寫入操作 (PUT
或 DELETE
)。此等待期間有助於避免物件可見性和版本追蹤的潛在問題。
如需 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 SDKs 啟用 S3 版本控制的詳細資訊。
請依照下列步驟,使用 AWS Management Console 在 S3 儲存貯體上啟用版本控制。
您可以搭配版本控制使用 AWS 多重要素驗證 (MFA)。當您搭配版本控制使用 MFA 時,您必須提供帳戶的 MFA 裝置中的 AWS 帳戶存取金鑰和有效程式碼,以永久刪除物件版本,或暫停或重新啟用版本控制。
若要使用 MFA 與版本控制搭配,請啟用 MFA Delete
。但是,您無法使用 AWS Management Console來啟用 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
下列範例會啟用儲存貯體上的 S3 版本控制和 多重要素驗證 (MFA) 刪除。
aws s3api put-bucket-versioning --bucket amzn-s3-demo-bucket1
--versioning-configuration Status=Enabled,MFADelete=Enabled --mfa "SERIAL 123456
"
使用 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 的 SDK 入門。 AWS
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