在存储桶上启用版本控制 - Amazon Simple Storage Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

在存储桶上启用版本控制

您可以使用 S3 版本控制在一个存储桶中保留对象的多个版本。本部分提供了如何使用控制台、REST API、Amazon SDK 和 Amazon Command Line Interface(Amazon CLI)在存储桶上启用版本控制的示例。

注意

首次在存储桶上启用版本控制后,更改可能需要长达 15 分钟才能在 S3 系统中完全传播。在此期间,对启用版本控制后创建或更新的对象的 GET 请求可能会导致 HTTP 404 NoSuchKey 错误。我们建议在启用版本控制后等待 15 分钟,然后再对存储桶中的对象执行任何写入操作(PUTDELETE)。此等待期有助于避免在对象可见性和版本跟踪方面可能出现的问题。

有关 S3 版本控制的更多信息,请参阅使用 S3 版本控制保留对象的多个版本。有关使用已启用版本控制的存储桶中的对象的信息,请参阅 使用启用版本控制的存储桶中的对象

要了解有关如何使用 S3 版本控制保护数据的更多信息,请参阅教程:使用 S3 版本控制、S3 对象锁定和 S3 复制保护 Amazon S3 上的数据免遭意外删除或应用程序错误

您创建的每个 S3 存储桶都具有关联的 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

存储桶拥有者和所有授权用户都可以启用版本控制。存储桶拥有者是创建存储存储桶的 Amazon Web Services 账户(根账户)。有关许可的更多信息,请参阅Amazon S3 的身份和访问管理

以下部分提供了有关使用控制台、Amazon CLI 和 Amazon SDK 启用 S3 版本控制的更多详细信息。

请按照以下步骤使用 Amazon Web Services 管理控制台 在 S3 存储桶上启用版本控制。

在 S3 通用存储桶上启用或禁用版本控制
  1. 登录到 Amazon Web Services 管理控制台,然后通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/

  2. 在左侧导航窗格中,选择通用存储桶

  3. 在存储桶列表中,选择要为其启用版本控制的存储桶的名称。

  4. 请选择属性

  5. 存储桶版本控制下,请选择编辑

  6. 请选择 Suspend (暂停)Enable (启用),然后选择 Save changes (保存更改)

注意

您可以将 Amazon Multi-Factor Authentication (MFA) 与版本控制结合使用。将 MFA 与版本控制结合使用时,您必须提供 Amazon Web Services 账户的访问密钥和账户 MFA 设备中的有效代码,才能永久删除对象版本或暂停或重新激活版本控制。

要将 MFA 与版本控制结合使用,请启用 MFA Delete。但是,您无法使用 Amazon Web Services 管理控制台 启用 MFA Delete。您必须使用 Amazon Command Line Interface (Amazon CLI) 或 API。有关更多信息,请参阅 配置 MFA 删除

以下示例在 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 删除需要获得批准的物理或虚拟身份验证设备。有关在 Amazon S3 中使用 MFA 删除的更多信息,请参阅配置 MFA 删除

有关使用 Amazon CLI 启用版本控制的更多信息,请参阅《Amazon CLI 命令参考》中的 put-bucket-versioning

以下示例在存储桶上启用版本控制,然后使用 适用于 Java 的 Amazon SDK 和 适用于 .NET 的 Amazon SDK 检索版本控制状态。有关使用其他 Amazon SDK 的信息,请参阅 Amazon 开发人员中心

.NET

有关设置和运行代码示例的信息,请参阅《适用于 .NET 的 Amazon SDK 开发人员指南》中的适用于 .NET 的 Amazon 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 的 Amazon 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()); } } }