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

欢迎使用新的 Amazon S3 用户指南! Amazon S3 用户指南结合了以下三个已停用的指南中的信息和说明:Amazon S3 开发人员指南Amazon S3 控制台用户指南Amazon S3 入门指南

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

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

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

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

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

在此示例中,您为由相同 AWS 账户拥有的源存储桶和目标存储桶设置复制。提供了有关使用 Amazon S3 控制台、AWS 命令行界面 (AWS CLI)、适用于 Java 的 AWS 开发工具包和适用于 .NET 的 AWS 开发工具包的示例。

当目标存储桶与源存储桶位于同一 AWS 账户中时,可按照以下步骤来配置复制规则。

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

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

  2. Buckets (存储桶) 列表中,选择您想要的存储桶的名称。

  3. 选择 Management (管理),向下滚动到 Replication rules (复制规则),然后选择 Create replication rule (创建复制规则)

  4. Rule name (规则名称) 下,输入规则的名称以帮助稍后标识规则。该名称是必填项,并且它在存储桶内必须是唯一的。

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

    要设置 IAM 角色,请在 Replication rule configuration (复制规则配置) 部分的 IAM role (IAM 角色) 下,执行以下操作之一:

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

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

    重要

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

  6. Status (状态) 下,会看到 Enabled (已启用) 默认处于选中状态。已启用的规则将在您保存它后立即开始工作。如果您想之后启用该规则,请选择 Disabled

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

  8. Replication rule configuration (复制规则配置) 中的 Source bucket (源存储桶) 下,您可以通过以下选项设置复制源:

    • 要复制整个存储桶,请选择 This rule applies to all objects in the bucket (此规则将应用于存储桶中的所有对象)

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

      注意

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

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

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

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

    注意

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

    • 要复制到您的账户中的存储桶,请选择 Choose a bucket in this account (选择此账户中的存储桶),然后键入或浏览目标存储桶。

    • 要复制到其他 AWS 账户中的存储桶,请选择 Choose a bucket in another account (选择另一个账户中的存储桶),然后输入目标存储桶账户 ID 并和名称。

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

    注意

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

  10. 设置 Destination (目标) 时,您还有以下附加选项:

    • 如果要启用 Object Ownership (对象所有权) 以帮助标准化目标存储桶中的新对象的所有权,请选择 Change object ownership to the destination bucket owner (将对象所有权更改为目标存储桶拥有者)。有关此选项的更多信息,请参阅使用 S3 对象所有权控制已上传对象的所有权

    • 如果要将数据复制到目标存储桶中的特定存储类,请选择 Change the storage class for the replicated objects (更改已复制对象的存储类)。然后选择要用于目标中的已复制对象的存储类。如果您不选择此选项,已复制对象的存储类将与原始对象的类相同。

    • 如果要在复制配置中启用删除标记复制,请选择 Delete marker replication (删除标记复制)。有关更多信息,请参阅在存储桶之间复制删除标记

    • 如果要在复制配置中启用 Amazon S3 副本修改同步,请选择 Replica modification sync (副本修改同步)。有关更多信息,请参阅使用 Amazon S3 副本修改同步复制元数据更改

    • 如果要在复制配置中启用 S3 复制指标,请选择 Replication metrics and events (复制指标和事件)。有关更多信息,请参阅使用复制指标和 Amazon S3 事件通知监控进度

    • 如果要在复制配置中启用 S3 复制时间控制 (S3 RTC),请选择 S3 Replication Time Control (S3 复制时间控制)。有关此选项的更多信息,请参阅使用 S3 复制时间控制 (S3 RTC) 满足合规性要求

    注意

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

  11. 要复制源存储桶中使用 AWS Key Management Service (AWS KMS) 加密的对象,请在 Replication criteria (复制标准) 下方,选择 Replicate objects encrypted with AWS KMS (复制使用 AWS KMS 加密的对象)AWS KMS key for encrypting destination objects (用于加密目标对象的 AWS KMS 密钥) 下是您允许复制使用的源密钥。默认情况下,所有源 CMK 都包含在内。您可以选择缩小 CMK 选择的范围。

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

    重要

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

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

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

    如果您选择复制通过 AWS KMS 加密的对象,请输入 AWS KMS CMK 的 Amazon 资源名称 (ARN),以便用于加密目标存储桶中的副本。您可以在 IAM 控制台中的 Encryption keys (加密密钥) 下方找到您的 AWS KMS CMK 的 ARN。或者,您可以从下拉列表中选择一个 CMK 名称。

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

    重要

    Amazon S3 控制台只为每个 AWS 区域列出 100 个 AWS KMS CMK。如果您在同一区域中有超过 100 个 CMK,您只会在 S3 控制台中看到前 100 个 CMK。若要使用控制台中未列出的 KMS CMK,请选择自定义 KMS ARN,然后输入相应的 KMS CMK ARN。

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

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

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

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

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

    重要

    用于本练习的配置文件必须具有必要的权限。例如,在复制配置中,指定 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 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. 将复制配置添加到存储桶中。

    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:s3:::destination-bucket" } } ] }
    2. 通过提供 destination-bucketIAM-role-ARN 的值,更新 JSON。保存更改。

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

      $ 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 更改副本所有权。有关示例,请参阅当源存储桶和目标存储桶由不同账户拥有时更改副本所有权

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

    4. 存储桶中更新对象的 ACL,并验证更改是否出现在目标存储桶中。

      有关说明,请参阅配置 ACL

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

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:role/%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#

以下适用于 .NET 的 AWS 开发工具包代码示例向存储桶添加复制配置,然后检索该配置。要使用此代码,请为存储桶提供名称,并为 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); } } } }