为同一账户拥有的源存储桶和目标存储桶配置复制 - Amazon Simple Storage Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

为同一账户拥有的源存储桶和目标存储桶配置复制

复制是在相同或跨不同 Amazon Web Services 区域 的存储桶自动、异步地复制对象。复制操作会将源存储桶中新创建的对象和对象更新复制到目标存储桶。有关更多信息,请参阅复制对象

配置复制时,需要向源存储桶添加复制规则。复制规则定义要复制的源存储桶对象和存储已复制对象的目标存储桶。您可以创建一条规则,以复制存储桶中的所有对象或具有特定键名前缀和/或一个或多个对象标签的对象子集。目标存储桶与源存储桶可以位于同一 Amazon Web Services 账户 中,也可以位于不同的账户中。

如果您指定要删除的对象版本 ID,Amazon S3 会在源存储桶中删除该对象版本。但不会将删除操作复制到目标存储桶中。换句话说,它不会从目标存储桶中删除同一对象版本。这会防止恶意删除数据。

当您将复制规则添加到存储桶后,默认情况下将启用复制规则,使该规则在您保存它后立即启动。

在此示例中,您为由同一 Amazon Web Services 账户 拥有的源存储桶和目标存储桶设置复制。提供了使用 Amazon S3 控制台、Amazon Command Line Interface (Amazon CLI) 以及 Amazon SDK for Java 和 Amazon SDK for .NET 的示例。

要在目标存储桶与源存储桶位于同一 Amazon Web Services 账户中时配置复制规则,请按照以下步骤操作。

如果目标存储桶与源存储桶位于不同的账户中,您必须向目标存储桶添加存储桶策略以便为源存储桶账户的所有者授予复制目标存储桶中的对象的权利。有关更多信息,请参阅在源存储桶和目标存储桶由不同的 Amazon Web Services 账户 拥有时授予权限

  1. 登录到 Amazon Web Services Management Console,然后通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/

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

  3. 存储桶列表中,请选择您想要的存储桶的名称。

  4. 选择管理选项卡,向下滚动到复制规则,然后选择创建复制规则

  5. 复制规则配置部分的复制规则名称下,输入规则的名称,以帮助以后识别该规则。该名称是必填项,并且它在存储桶内必须是唯一的。

  6. 状态下,已启用默认情况下处于选中状态。已启用的规则将在您保存它后立即开始工作。如果您想以后再启用该规则,请选择已禁用

  7. 如果存储桶具有现有的复制规则,系统会指示您为规则设置优先级。必须为规则设置优先级,以避免因在多个规则的范围内包含对象而引起冲突。如果规则重叠,Amazon S3 会使用规则优先级确定要应用哪个规则。数字越大,优先级越高。有关规则优先级的更多信息,请参阅 复制配置

  8. 源存储桶下,您可以通过以下选项设置复制源:

    • 要复制整个存储桶,请选择应用到存储桶中的所有对象

    • 要复制具有相同前缀的所有对象,请选择 Limit the scope of this rule using one or more filters (使用一个或多个筛选条件限制此规则的范围)。这会将复制限制为名称以您指定的前缀(例如 pictures)开头的所有对象。在前缀框中输入前缀。

      注意

      如果您输入的前缀是文件夹名称,则必须使用 /(正斜杠)作为最后一个字符(例如,pictures/)。

    • 要复制具有一个或多个对象标签的所有对象,请选择添加标签,然后在框中输入键值对。重复上述过程以添加其他标签。您可以组合前缀和标签。有关对象标签的更多信息,请参阅 使用标签对存储进行分类

    新的复制配置 XML 模式支持前缀和标签筛选以及规则优先级划分。有关新架构的更多信息,请参阅 向后兼容性。如需详细了解在用户界面后台工作的 Amazon S3 API 所使用的 XML,请参阅 复制配置。新架构被描述为复制配置 XML V2

  9. 目标下,选择您希望 Amazon S3 将对象复制到的存储桶。

    注意

    目标存储桶的数量仅限于给定分区中的 Amazon Web Services 区域 的数量。分区是一组区域。Amazon 目前有三个分区:aws(标准区域)、aws-cn(中国区域)和 aws-us-gov(Amazon GovCloud (US) 区域)。要请求提高目标存储桶限额,您可以使用服务限额

    • 要复制到您的账户中的一个或多个存储桶,请选取选择此账户中的存储桶,然后输入或浏览目标存储桶。

    • 要复制到其他 Amazon Web Services 账户中的一个或多个存储存储桶,请选择指定另一个账户中的存储存储桶,然后输入目标存储存储桶账户 ID 和存储桶名称。

      如果目标存储桶与源存储桶位于不同的账户中,您必须向目标存储桶添加存储桶策略以便为源存储桶账户的所有者授予复制对象的权限。有关更多信息,请参阅在源存储桶和目标存储桶由不同的 Amazon Web Services 账户 拥有时授予权限

      (可选)如果要帮助标准化目标存储桶中的新对象的所有权,请选择将对象所有权更改为目标存储桶拥有者。有关此选项的更多信息,请参阅 为您的存储桶控制对象所有权和禁用 ACL。

    注意

    如果未对目标存储桶启用版本控制,您将收到包含 Enable versioning(启用版本控制)按钮的警告。请选择此按钮可对存储桶启用版本控制。

  10. 设置 Amazon Identity and Access Management (IAM) 角色,Amazon S3 可以代入该角色以代表您复制对象。

    要设置 IAM 角色,请在 IAM 角色部分中,从 IAM 角色下拉列表中选择以下任一选项:

    • 我们强烈建议您选择 Create new role (创建新角色),让 Amazon S3 为您创建一个新的 IAM 角色。当您保存该规则后,将为 IAM 角色生成一个与您选择的源和目标存储桶匹配的新策略。

    • 您可以选择使用现有的 IAM 角色。在这种情况下,您必须选择一个角色,该角色会授予 Amazon S3 必要的权限以进行复制。如果该角色未按照您的复制规则授予 Amazon S3 足够的权限,复制会失败。

    重要

    将复制规则添加到存储桶时,您必须具有 iam:PassRole 权限才能传递授予 Amazon S3 复制权限的 IAM 角色。有关更多信息,请参阅《IAM 用户指南》中的向用户授予将角色传递给 Amazon Web Service的权限

  11. 要复制源存储桶中使用具有 Amazon Key Management Service(Amazon KMS)密钥的服务器端加密(SSE-KMS)进行加密的对象,请在加密下选择复制已使用 Amazon KMS 加密的对象。在用于加密目标对象的 Amazon KMS 密钥下,是您允许复制使用的源密钥。预设情况下,所有源 KMS 密钥都包含在内。要缩小 KMS 密钥选择范围,可以选择别名或密钥 ID。

    使用您未选择的 Amazon KMS keys 加密的对象不会进行复制。系统为您选择一个 KMS 密钥或一组 KMS 密钥,您可以自行选择 KMS 密钥。有关将 Amazon KMS 用于复制的信息,请参阅 复制使用服务器端加密(SSE-C、SSE-S3、SSE-KMS、DSSE-KMS)创建的对象

    重要

    在复制使用 Amazon KMS 加密的对象时,Amazon KMS 请求速率会在源区域中加倍并在目标区域中增加相同的量。之所以对 Amazon KMS 的调用率会增加,是因为数据是使用您为复制目标区域定义的 KMS 密钥进行重新加密的。对于每个区域的每个调用账户,Amazon KMS 设定了一个请求速率限额。有关限额默认值的信息,请参阅《Amazon Key Management Service 开发人员指南》中的 Amazon KMS 限额 – 每秒请求数:因情况而异

    如果您在复制期间的当前 Amazon S3 PUT 对象请求速率超过您账户的默认 Amazon KMS 速率限制的一半,则建议您请求提高您的 Amazon KMS 请求速率限额。要请求提高,请在联系我们处的 Amazon Web Services Support 中心内创建一个案例。例如,假设您当前的 PUT 对象请求速率为每秒 1000 个请求并且您使用 Amazon KMS 加密对象。在此情况下,建议您让 Amazon Web Services Support 将您在源区域和目标区域中的 Amazon KMS 速率限制提高到每秒 2500 个请求(如果不同),以确保不受 Amazon KMS 的限制。

    要查看源存储桶中的 PUT 对象请求速率,请查看 Amazon S3 的 Amazon CloudWatch 请求指标中的 PutRequests。有关查看 CloudWatch 指标的信息,请参阅 使用 S3 控制台

    如果选择复制使用 Amazon KMS 加密的对象,请执行以下操作:

    1. 用于加密目标对象的 Amazon KMS key 下,通过以下方式之一指定您的 KMS 密钥:

      • 要从可用的 KMS 密钥列表中进行选择,请选择从您的 Amazon KMS keys 密钥中进行选择,并从可用密钥的列表中选择您的 KMS 密钥

        Amazon 托管式密钥(aws/s3)和您的客户自主管理型密钥都显示在此列表中。有关客户自主管理型密钥的更多信息,请参阅《Amazon Key Management Service 开发人员指南》中的客户密钥和 Amazon 密钥

      • 要输入 KMS 密钥 Amazon 资源名称(ARN),请选择输入 Amazon KMS key ARN,然后在显示的字段中输入您的 KMS 密钥 ARN。这会加密目标存储桶中的副本。您可以在 IAM 控制台中的加密密钥下方找到您的 KMS 密钥的 ARN。

      • 要在 Amazon KMS 控制台中创建新的客户自主管理型密钥,请选择创建 KMS 密钥

        有关创建 Amazon KMS key 的更多信息,请参阅《Amazon Key Management Service 开发人员指南》中的创建密钥

      重要

      您只能使用与存储桶所在相同 Amazon Web Services 区域 中启用的 KMS 密钥。选择从您的 KMS 密钥中选择时,S3 控制台对于每个区域仅列出 100 个 KMS 密钥。如果您在同一区域中有超过 100 个 KMS 密钥,您只会在 S3 控制台中看到前 100 个 KMS 密钥。要使用控制台中未列出的 KMS 密钥,请选择输入 Amazon KMS key ARN,然后输入您的 KMS 密钥 ARN。

      在 Amazon S3 中使用 Amazon KMS key 进行服务器端加密时,您必须选择对称加密 KMS 密钥。Amazon S3 仅支持对称加密 KMS 密钥,而不支持非对称 KMS 密钥。有关更多信息,请参阅《Amazon Key Management Service 开发人员指南》中的确定对称和非对称 KMS 密钥

      有关创建 Amazon KMS key 的更多信息,请参阅 Amazon Key Management Service 开发人员指南中的创建密钥。有关将 Amazon KMS 与 Amazon S3 结合使用的更多信息,请参阅使用具有 Amazon KMS 密钥的服务器端加密(SSE-KMS)

  12. 目标存储类下,如果要将数据复制到目标中的特定存储类,请选择更改复制对象的存储类。然后选择要用于目标中的已复制对象的存储类。如果您不选择此选项,已复制对象的存储类将与原始对象的类相同。

  13. 设置其他复制选项时,您具有以下附加选项:

    注意

    使用 S3 RTC 或 S3 复制指标时,需要支付额外费用。

  14. 要完成,请选择 Save (保存)

  15. 在您保存规则之后,可以通过选择您的规则并选择 Edit rule (编辑规则) 来编辑、启用、禁用或删除您的规则。

要使用 Amazon CLI 在源存储桶和目标存储桶由同一 Amazon Web Services 账户 拥有时设置复制,请执行以下操作:

  • 创建源存储桶和目标存储桶

  • 对存储桶启用版本控制功能

  • 创建为 Amazon S3 授予复制对象权限的 IAM 角色

  • 将复制配置添加到源存储桶中

要验证您的设置,请对其进行测试。

当源存储桶和目标存储桶由同一 Amazon Web Services 账户 拥有时设置复制
  1. 为 Amazon CLI 设置凭证配置文件。在此示例中,我们使用配置文件名称 acctA。有关设置凭证配置文件的更多信息,请参阅《Amazon Command Line Interface 用户指南》中的命名配置文件

    重要

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

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

    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. 创建一个 destination 存储桶,并对其启用版本控制。以下代码在美国西部(俄勒冈州)(us-west-2)区域中创建一个 destination 存储桶。

    注意

    要在源存储桶和目标存储桶位于同一 Amazon Web Services 账户 时设置复制配置,请使用同一配置文件。此示例使用 acctA。要在两个存储桶由不同 Amazon Web Services 账户 拥有时对复制配置进行测试,您需要为每个存储桶指定不同的配置文件。在此示例中,我们对目标存储桶使用 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 replicationRole \ --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", "s3:GetObjectVersionTagging" ], "Resource":[ "arn:aws:s3:::source-bucket/*" ] }, { "Effect":"Allow", "Action":[ "s3:ListBucket", "s3:GetReplicationConfiguration" ], "Resource":[ "arn:aws:s3:::source-bucket" ] }, { "Effect":"Allow", "Action":[ "s3:ReplicateObject", "s3:ReplicateDelete", "s3:ReplicateTags" ], "Resource":"arn:aws:s3:::destination-bucket/*" } ] }
      2. 运行以下命令以创建策略并将其附加到角色。

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

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

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

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

      $ 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. 登录到 Amazon Web Services Management Console,然后通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/

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

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

      注意

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

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

      • 该 Amazon S3 已复制对象。

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

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

        
                                            显示复制状态和权限的对象属性屏幕截图。

以下代码示例分别使用 Amazon SDK for Java 和 Amazon SDK for .NET 向存储桶添加复制配置。

Java

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

import com.amazonaws.AmazonServiceException; import com.amazonaws.SdkClientException; import com.amazonaws.auth.profile.ProfileCredentialsProvider; import com.amazonaws.regions.Regions; import com.amazonaws.services.identitymanagement.AmazonIdentityManagement; import com.amazonaws.services.identitymanagement.AmazonIdentityManagementClientBuilder; import com.amazonaws.services.identitymanagement.model.CreateRoleRequest; import com.amazonaws.services.identitymanagement.model.PutRolePolicyRequest; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3Client; import com.amazonaws.services.s3.model.BucketReplicationConfiguration; import com.amazonaws.services.s3.model.BucketVersioningConfiguration; import com.amazonaws.services.s3.model.CreateBucketRequest; import com.amazonaws.services.s3.model.DeleteMarkerReplication; import com.amazonaws.services.s3.model.DeleteMarkerReplicationStatus; 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.SetBucketVersioningConfigurationRequest; import com.amazonaws.services.s3.model.StorageClass; import com.amazonaws.services.s3.model.replication.ReplicationFilter; import com.amazonaws.services.s3.model.replication.ReplicationFilterPredicate; import com.amazonaws.services.s3.model.replication.ReplicationPrefixPredicate; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class CrossRegionReplication { public static void main(String[] args) throws IOException { Regions clientRegion = Regions.DEFAULT_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:%s", accountId, roleName); String destinationBucketARN = "arn:aws:s3:::" + destBucketName; AmazonS3 s3Client = AmazonS3Client.builder() .withCredentials(new ProfileCredentialsProvider()) .withRegion(clientRegion) .build(); createBucket(s3Client, clientRegion, sourceBucketName); createBucket(s3Client, clientRegion, destBucketName); assignRole(roleName, clientRegion, sourceBucketName, destBucketName); try { // 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 ReplicationPrefixPredicate(prefix))) .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 priority: " + rule.getPriority()); 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(); } } private static void createBucket(AmazonS3 s3Client, Regions region, String bucketName) { CreateBucketRequest request = new CreateBucketRequest(bucketName, region.getName()); s3Client.createBucket(request); BucketVersioningConfiguration configuration = new BucketVersioningConfiguration() .withStatus(BucketVersioningConfiguration.ENABLED); SetBucketVersioningConfigurationRequest enableVersioningRequest = new SetBucketVersioningConfigurationRequest( bucketName, configuration); s3Client.setBucketVersioningConfiguration(enableVersioningRequest); } private static void assignRole(String roleName, Regions region, String sourceBucket, String destinationBucket) { AmazonIdentityManagement iamClient = AmazonIdentityManagementClientBuilder.standard() .withRegion(region) .withCredentials(new ProfileCredentialsProvider()) .build(); StringBuilder trustPolicy = new StringBuilder(); trustPolicy.append("{\\r\\n "); trustPolicy.append("\\\"Version\\\":\\\"2012-10-17\\\",\\r\\n "); trustPolicy.append("\\\"Statement\\\":[\\r\\n {\\r\\n "); trustPolicy.append("\\\"Effect\\\":\\\"Allow\\\",\\r\\n \\\"Principal\\\":{\\r\\n "); trustPolicy.append("\\\"Service\\\":\\\"s3.amazonaws.com\\\"\\r\\n },\\r\\n "); trustPolicy.append("\\\"Action\\\":\\\"sts:AssumeRole\\\"\\r\\n }\\r\\n ]\\r\\n}"); CreateRoleRequest createRoleRequest = new CreateRoleRequest() .withRoleName(roleName) .withAssumeRolePolicyDocument(trustPolicy.toString()); iamClient.createRole(createRoleRequest); StringBuilder permissionPolicy = new StringBuilder(); permissionPolicy.append( "{\\r\\n \\\"Version\\\":\\\"2012-10-17\\\",\\r\\n \\\"Statement\\\":[\\r\\n {\\r\\n "); permissionPolicy.append( "\\\"Effect\\\":\\\"Allow\\\",\\r\\n \\\"Action\\\":[\\r\\n "); permissionPolicy.append("\\\"s3:GetObjectVersionForReplication\\\",\\r\\n "); permissionPolicy.append( "\\\"s3:GetObjectVersionAcl\\\"\\r\\n ],\\r\\n \\\"Resource\\\":[\\r\\n "); permissionPolicy.append("\\\"arn:aws:s3:::"); permissionPolicy.append(sourceBucket); permissionPolicy.append("/*\\\"\\r\\n ]\\r\\n },\\r\\n {\\r\\n "); permissionPolicy.append( "\\\"Effect\\\":\\\"Allow\\\",\\r\\n \\\"Action\\\":[\\r\\n "); permissionPolicy.append( "\\\"s3:ListBucket\\\",\\r\\n \\\"s3:GetReplicationConfiguration\\\"\\r\\n "); permissionPolicy.append("],\\r\\n \\\"Resource\\\":[\\r\\n \\\"arn:aws:s3:::"); permissionPolicy.append(sourceBucket); permissionPolicy.append("\\r\\n "); permissionPolicy .append("]\\r\\n },\\r\\n {\\r\\n \\\"Effect\\\":\\\"Allow\\\",\\r\\n "); permissionPolicy.append( "\\\"Action\\\":[\\r\\n \\\"s3:ReplicateObject\\\",\\r\\n "); permissionPolicy .append("\\\"s3:ReplicateDelete\\\",\\r\\n \\\"s3:ReplicateTags\\\",\\r\\n "); permissionPolicy.append("\\\"s3:GetObjectVersionTagging\\\"\\r\\n\\r\\n ],\\r\\n "); permissionPolicy.append("\\\"Resource\\\":\\\"arn:aws:s3:::"); permissionPolicy.append(destinationBucket); permissionPolicy.append("/*\\\"\\r\\n }\\r\\n ]\\r\\n}"); PutRolePolicyRequest putRolePolicyRequest = new PutRolePolicyRequest() .withRoleName(roleName) .withPolicyDocument(permissionPolicy.toString()) .withPolicyName("crrRolePolicy"); iamClient.putRolePolicy(putRolePolicyRequest); } }
C#

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

using Amazon; 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); } } } }