Amazon Simple Storage Service
开发人员指南 (API 版本 2006-03-01)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

示例 1:当源存储桶和目标存储桶由相同 AWS 账户拥有时配置 CRR

在此示例中,您将设置跨区域复制 (CRR),其中源存储桶和目标存储桶由相同 AWS 账户拥有。提供了使用 Amazon S3 控制台、AWS Command Line Interface (AWS CLI) 以及 AWS SDK for Java 和 适用于 .NET 的 AWS 开发工具包 的若干示例。

主题

    当源存储桶和目标存储桶由相同 AWS 账户拥有时配置 CRR(控制台)

    有关分步说明,请参阅 Amazon Simple Storage Service 控制台用户指南 中的如何向 S3 存储桶添加跨区域复制 (CRR) 规则?本主题提供当两个存储桶由相同和不同 AWS 账户拥有时,如何设置复制配置的说明。

    当源存储桶和目标存储桶由相同 AWS 账户拥有时配置 CRR (AWS CLI)

    要使用 AWS CLI 在源存储桶和目标存储桶由相同 AWS 账户拥有时设置 CRR,您将需要创建源存储桶和目标存储桶,对这两个存储桶启用版本控制,创建一个 IAM 角色,该角色向 Amazon S3 授予复制对象及将复制配置添加到源存储桶的权限。要验证您的设置,请对其进行测试。

    当源存储桶和目标存储桶由相同 AWS 账户拥有时设置 CRR

    1. 为 AWS CLI 设置凭证配置文件。在此示例中,我们使用配置文件名称 acctA。有关设置凭证配置文件的信息,请参阅AWS Command Line Interface 用户指南中的命名配置文件

      重要

      用于本练习的配置文件必须具有必要的权限。例如,在复制配置中,指定 Amazon S3 可担任的 IAM 角色。仅当您所使用的配置文件具有 iam:PassRole 权限时,您才能执行此操作。有关更多信息,请参阅IAM 用户指南中的向用户授予将角色传递给 AWS 服务的权限。如果您使用管理员用户凭证创建命名配置文件,则可执行所有任务。

    2. 创建一个存储桶,并对其启用版本控制。以下代码在 美国东部(弗吉尼亚北部) (us-east-1) 区域中创建一个存储桶。

      aws s3api create-bucket \ --bucket source \ --region us-east-1 \ --profile acctA
      aws s3api put-bucket-versioning \ --bucket source \ --versioning-configuration Status=Enabled \ --profile acctA
    3. 创建一个目标存储桶,并对其启用版本控制。以下代码在 美国西部(俄勒冈) (us-west-2) 区域中创建一个目标存储桶。

      注意

      要在源存储桶和目标存储桶位于同一 AWS 账户时设置复制配置,请使用同一配置文件。在此示例中,我们使用的是 acctA。要在两个存储桶由不同 AWS 账户拥有时对复制配置进行测试,您将需要为每个存储桶指定不同的配置文件。在此示例中,我们对目标存储桶使用 acctB 配置文件。

      aws s3api create-bucket \ --bucket destination \ --region us-west-2 \ --create-bucket-configuration LocationConstraint=us-west-2 \ --profile acctA
      aws s3api put-bucket-versioning \ --bucket destination \ --versioning-configuration Status=Enabled \ --profile acctA
    4. 创建一个 IAM 角色。您将在稍后添加到存储桶的复制配置中指定此角色。Amazon S3 担任此角色以代表您复制对象。分两个步骤创建 IAM 角色:

      • 创建角色

      • 将权限策略附加到角色。

      1. 创建 IAM 角色。

        1. 复制以下信任策略,并将其保存到本地计算机上当前目录中一个名为 S3-role-trust-policy.json 的文件。此策略向 Amazon S3 服务委托人授予担任该角色的权限。

          { "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Principal":{ "Service":"s3.amazonaws.com" }, "Action":"sts:AssumeRole" } ] }
        2. 运行以下命令以创建角色:

          $ aws iam create-role \ --role-name crrRole \ --assume-role-policy-document file://s3-role-trust-policy.json \ --profile acctA
      2. 将权限策略附加到角色。

        1. 复制以下权限策略,并将其保存到本地计算机上当前目录中一个名为 S3-role-permissions-policy.json 的文件。此策略授予对各种 Amazon S3 存储桶和对象操作的权限。

          { "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "s3:GetObjectVersionForReplication", "s3:GetObjectVersionAcl" ], "Resource":[ "arn:aws-cn:s3:::source-bucket/*" ] }, { "Effect":"Allow", "Action":[ "s3:ListBucket", "s3:GetReplicationConfiguration" ], "Resource":[ "arn:aws-cn:s3:::source-bucket" ] }, { "Effect":"Allow", "Action":[ "s3:ReplicateObject", "s3:ReplicateDelete", "s3:ReplicateTags", "s3:GetObjectVersionTagging" ], "Resource":"arn:aws-cn:s3:::destination-bucket/*" } ] }
        2. 运行以下命令以创建策略并将其附加到角色:

          $ aws iam put-role-policy \ --role-name crrRole \ --policy-document file://s3-role-permissions-policy.json \ --policy-name crrRolePolicy \ --profile acctA
    5. 将复制配置添加到存储桶中。

      1. 尽管 Amazon S3 API 要求复制配置采用 XML 形式,但 AWS CLI 要求您以 JSON 形式指定复制配置。将以下 JSON 保存到计算机上本地目录中一个名为 replication.json 文件。

        { "Role": "IAM-role-ARN", "Rules": [ { "Status": "Enabled", "Priority": 1, "DeleteMarkerReplication": { "Status": "Disabled" }, "Filter" : { "Prefix": "Tax"}, "Destination": { "Bucket": "arn:aws-cn:s3:::destination-bucket" } } ] }
      2. 通过提供 destination-bucketIAM-role-ARN 的值,更新 JSON。保存更改。

      3. 运行以下命令以将复制配置添加到源存储桶中。请务必提供 source-bucket 名称。

        $ aws s3api put-bucket-replication \ --replication-configuration file://replication.json \ --bucket source \ --profile acctA

      要检索复制配置,请使用 get-bucket-replication 命令:

      $ aws s3api get-bucket-replication \ --bucket source \ --profile acctA
    6. 在 Amazon S3 控制台中测试该设置:

      1. 登录 AWS 管理控制台,并通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/

      2. 存储桶中,创建一个名为 Tax 的文件夹。

      3. 将示例对象添加到存储桶中的 Tax 文件夹。

        注意

        Amazon S3 复制对象所需的时间量取决于对象大小。有关如何查看复制状态的信息,请参阅跨区域复制状态信息

        目标存储桶中,确认以下几点:

        • Amazon S3 已复制对象。

        • 在对象 properties (属性) 中,Replication Status (复制状态) 已设置为 Replica(将其标识为副本对象)。

        • 在对象 properties (属性) 中,权限部分未显示权限。这意味着副本仍由存储桶拥有者拥有,而目标存储桶不具有对象副本的权限。您可以添加可选配置以指示 Amazon S3 更改副本所有权。有关示例,请参阅示例 3:当源存储桶和目标存储桶由不同 AWS 账户拥有时更改副本拥有者

          
                                            显示复制状态和权限的对象属性屏幕截图。
      4. 存储桶中更新对象的 ACL,并验证更改是否出现在目标存储桶中。

        有关说明,请参阅 Amazon Simple Storage Service 控制台用户指南 中的如何为对象设置权限?

    当源存储桶和目标存储桶由相同 AWS 账户拥有时配置 CRR(AWS 开发工具包)

    以下代码示例分别使用 AWS SDK for Java 和 适用于 .NET 的 AWS 开发工具包 向存储桶添加复制配置。

    JavaC#
    Java

    以下示例向存储桶添加复制配置,然后检索并验证该配置。有关创建和测试有效示例的说明,请参阅测试 Amazon S3 Java 代码示例

    import java.io.IOException; import java.util.HashMap; import java.util.Map; import com.amazonaws.AmazonServiceException; import com.amazonaws.SdkClientException; import com.amazonaws.auth.profile.ProfileCredentialsProvider; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3ClientBuilder; import com.amazonaws.services.s3.model.BucketReplicationConfiguration; import com.amazonaws.services.s3.model.ReplicationDestinationConfig; import com.amazonaws.services.s3.model.ReplicationRule; import com.amazonaws.services.s3.model.ReplicationRuleStatus; import com.amazonaws.services.s3.model.StorageClass; public class CrossRegionReplication { public static void main(String[] args) throws IOException { String clientRegion = "*** Client region ***"; String accountId = "*** Account ID ***"; String roleName = "*** Role name ***"; String sourceBucketName = "*** Source bucket name ***"; String destBucketName = "*** Destination bucket name ***"; String prefix = "Tax/"; String roleARN = String.format("arn:aws:iam::%s:role/%s", accountId, roleName); String destinationBucketARN = "arn:aws:s3:::" + destBucketName; try { AmazonS3 s3Client = AmazonS3ClientBuilder.standard() .withCredentials(new ProfileCredentialsProvider()) .withRegion(clientRegion) .build(); // Create the replication rule. List<ReplicationFilterPredicate> andOperands = new ArrayList<ReplicationFilterPredicate>(); andOperands.add(new ReplicationPrefixPredicate("prefix")); Map<String, ReplicationRule> replicationRules = new HashMap<String, ReplicationRule>(); replicationRules.put("ReplicationRule1", new ReplicationRule() .withPriority(0) .withStatus(ReplicationRuleStatus.Enabled) .withDeleteMarkerReplication(new DeleteMarkerReplication().withStatus(DeleteMarkerReplicationStatus.DISABLED)) .withFilter(new ReplicationFilter().withPredicate(new ReplicationAndOperator(andOperands))) .withDestinationConfig(new ReplicationDestinationConfig() .withBucketARN(destinationBucketARN) .withStorageClass(StorageClass.Standard))); // Save the replication rule to the source bucket. s3Client.setBucketReplicationConfiguration(sourceBucketName, new BucketReplicationConfiguration() .withRoleARN(roleARN) .withRules(replicationRules)); // Retrieve the replication configuration and verify that the configuration // matches the rule we just set. BucketReplicationConfiguration replicationConfig = s3Client.getBucketReplicationConfiguration(sourceBucketName); ReplicationRule rule = replicationConfig.getRule("ReplicationRule1"); System.out.println("Retrieved destination bucket ARN: " + rule.getDestinationConfig().getBucketARN()); System.out.println("Retrieved source-bucket replication rule prefix: " + rule.getPrefix()); System.out.println("Retrieved source-bucket replication rule status: " + rule.getStatus()); } 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(); } } }
    C#

    以下 适用于 .NET 的 AWS 开发工具包 代码示例向存储桶添加复制配置,然后检索该配置。要使用此代码,请为存储桶提供名称,并为 IAM 角色提供 Amazon 资源名称 (ARN)。有关如何创建和测试有效示例的说明,请参阅运行 Amazon S3 .NET 代码示例

    // Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: MIT-0 (For details, see https://github.com/awsdocs/amazon-s3-developer-guide/blob/master/LICENSE-SAMPLECODE.) using Amazon.S3; using Amazon.S3.Model; using System; using System.Threading.Tasks; namespace Amazon.DocSamples.S3 { class CrossRegionReplicationTest { private const string sourceBucket = "*** source bucket ***"; // Bucket ARN example - arn:aws:s3:::destinationbucket private const string destinationBucketArn = "*** destination bucket ARN ***"; private const string roleArn = "*** IAM Role ARN ***"; // Specify your bucket region (an example region is shown). private static readonly RegionEndpoint sourceBucketRegion = RegionEndpoint.USWest2; private static IAmazonS3 s3Client; public static void Main() { s3Client = new AmazonS3Client(sourceBucketRegion); EnableReplicationAsync().Wait(); } static async Task EnableReplicationAsync() { try { ReplicationConfiguration replConfig = new ReplicationConfiguration { Role = roleArn, Rules = { new ReplicationRule { Prefix = "Tax", Status = ReplicationRuleStatus.Enabled, Destination = new ReplicationDestination { BucketArn = destinationBucketArn } } } }; PutBucketReplicationRequest putRequest = new PutBucketReplicationRequest { BucketName = sourceBucket, Configuration = replConfig }; PutBucketReplicationResponse putResponse = await s3Client.PutBucketReplicationAsync(putRequest); // Verify configuration by retrieving it. await RetrieveReplicationConfigurationAsync(s3Client); } 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); } } private static async Task RetrieveReplicationConfigurationAsync(IAmazonS3 client) { // Retrieve the configuration. GetBucketReplicationRequest getRequest = new GetBucketReplicationRequest { BucketName = sourceBucket }; GetBucketReplicationResponse getResponse = await client.GetBucketReplicationAsync(getRequest); // Print. Console.WriteLine("Printing replication configuration information..."); Console.WriteLine("Role ARN: {0}", getResponse.Configuration.Role); foreach (var rule in getResponse.Configuration.Rules) { Console.WriteLine("ID: {0}", rule.Id); Console.WriteLine("Prefix: {0}", rule.Prefix); Console.WriteLine("Status: {0}", rule.Status); } } } }