

# 针对同一账户中的存储桶配置复制
<a name="replication-walkthrough1"></a>

实时复制是跨相同或不同 AWS 区域中的通用存储桶自动、异步复制对象。实时复制会将源存储桶中新创建的对象和对象更新复制到一个或多个目标存储桶。有关更多信息，请参阅 [在区域内和跨区域复制对象](replication.md)。

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

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

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

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

## 先决条件
<a name="replication-prerequisites"></a>

在使用以下过程之前，请确保您已设置了复制所需的权限，具体取决于源存储桶和目标存储桶是由相同的账户还是不同的账户拥有。有关更多信息，请参阅 [为实时复制设置权限](setting-repl-config-perm-overview.md)。

**注意**  
如果要复制加密的对象，还必须授予必要的 AWS Key Management Service（AWS KMS）密钥权限。有关更多信息，请参阅 [复制加密对象（SSE-S3、SSE-KMS、DSSE-KMS、SSE-C）](replication-config-for-kms-objects.md)。
要将对象锁定与复制功能结合使用，您必须在用于设置复制的 AWS Identity and Access Management（IAM）角色中，授予对源 S3 存储桶的两项额外的权限。这两项额外的权限是 `s3:GetObjectRetention` 和 `s3:GetObjectLegalHold`。如果角色已有 `s3:Get*` 权限声明，则该声明已满足要求。有关更多信息，请参阅 [将对象锁定与 S3 复制结合使用](object-lock-managing.md#object-lock-managing-replication)。

## 使用 S3 控制台
<a name="enable-replication"></a>

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

如果目标存储桶与源存储桶位于不同的账户中，您必须向目标存储桶添加存储桶策略以便为源存储桶账户的所有者授予复制目标存储桶中的对象的权利。有关更多信息，请参阅 [（可选）步骤 3：在源存储桶和目标存储桶由不同的 AWS 账户拥有时授予权限](setting-repl-config-perm-overview.md#setting-repl-config-crossacct)。

1. 登录到 AWS 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

1. 在左侧导航窗格中，选择**通用存储桶**。

1. 在存储桶列表中，选择您想要的存储桶的名称。

1. 选择**管理**选项卡，向下滚动到**复制规则**，然后选择**创建复制规则**。

    

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

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

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

1. 在**源存储桶**下，您可以通过以下选项设置复制源：
   + 要复制整个存储桶，请选择**应用到存储桶中的所有对象**。
   + 要复制具有相同前缀的所有对象，请选择 **Limit the scope of this rule using one or more filters (使用一个或多个筛选条件限制此规则的范围)**。这会将复制限制为名称以您指定的前缀（例如 `pictures`）开头的所有对象。在**前缀**框中输入前缀。
**注意**  
如果您输入的前缀是文件夹名称，则必须使用 **/**（正斜杠）作为最后一个字符（例如，`pictures/`）。
   + 要复制具有一个或多个对象标签的所有对象，请选择**添加标签**，然后在框中输入键值对。重复上述过程以添加其他标签。您可以组合前缀和标签。有关对象标签的更多信息，请参阅 [使用标签对对象进行分类](object-tagging.md)。

   新的复制配置 XML 模式支持前缀和标签筛选以及规则优先级划分。有关新架构的更多信息，请参阅 [向后兼容性注意事项](replication-add-config.md#replication-backward-compat-considerations)。如需详细了解在用户界面后台工作的 Amazon S3 API 所使用的 XML，请参阅 [复制配置文件元素](replication-add-config.md)。新架构被描述为*复制配置 XML V2*。

1. 在**目标**下，选择您希望 Amazon S3 将对象复制到的存储桶。
**注意**  
目标存储桶的数量仅限于给定分区中的 AWS 区域 的数量。分区是一组区域。AWS 目前有三个分区：`aws`（标准区域）、`aws-cn`（中国区域）和 `aws-us-gov`（AWS GovCloud (US) 区域）。要请求提高目标存储桶限额，您可以使用[服务限额](https://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html)。
   + 要复制到您的账户中的一个或多个存储桶，请选取**选择此账户中的存储桶**，然后输入或浏览目标存储桶。
   + 要复制到其他 AWS 账户中的一个或多个存储存储桶，请选择**指定另一个账户中的存储存储桶**，然后输入目标存储存储桶账户 ID 和存储桶名称。

     如果目标存储桶与源存储桶位于不同的账户中，您必须向目标存储桶添加存储桶策略以便为源存储桶账户的所有者授予复制对象的权限。有关更多信息，请参阅 [（可选）步骤 3：在源存储桶和目标存储桶由不同的 AWS 账户拥有时授予权限](setting-repl-config-perm-overview.md#setting-repl-config-crossacct)。

     （可选）如果要帮助标准化目标存储桶中的新对象的所有权，请选择**将对象所有权更改为目标存储桶拥有者**。有关此选项的更多信息，请参阅 [为您的存储桶控制对象所有权和禁用 ACL。](about-object-ownership.md)。
**注意**  
如果未对目标存储桶启用版本控制，您将收到包含 **Enable versioning（启用版本控制）**按钮的警告。请选择此按钮可对存储桶启用版本控制。

1. 设置 AWS 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 用户指南》**中的[向用户授予将角色传递给 AWS 服务的权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_passrole.html)。

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

   使用您未选择的 AWS KMS keys 加密的对象不会进行复制。系统为您选择一个 KMS 密钥或一组 KMS 密钥，您可以自行选择 KMS 密钥。有关将 AWS KMS 用于复制的信息，请参阅 [复制加密对象（SSE-S3、SSE-KMS、DSSE-KMS、SSE-C）](replication-config-for-kms-objects.md)。
**重要**  
在复制使用 AWS KMS 加密的对象时，AWS KMS 请求速率会在源区域中加倍并在目标区域中增加相同的量。之所以对 AWS KMS 的调用率会增加，是因为数据是使用您为复制目标区域定义的 KMS 密钥进行重新加密的。对于每个区域的每个调用账户，AWS KMS 设定了一个请求速率限额。有关限额默认值的信息，请参阅《AWS Key Management Service 开发人员指南》**中的 [AWS KMS 限额 – 每秒请求数：因情况而异](https://docs.aws.amazon.com/kms/latest/developerguide/limits.html#requests-per-second)。  
如果您在复制期间的当前 Amazon S3 `PUT` 对象请求速率超过您账户的默认 AWS KMS 速率限制的一半，则建议您请求提高您的 AWS KMS 请求速率限额。要请求提高，请在[联系我们](https://aws.amazon.com/contact-us/)处的 支持 中心内创建一个案例。例如，假设您当前的 `PUT` 对象请求速率为每秒 1000 个请求并且您使用 AWS KMS 加密对象。在此情况下，建议您让 支持 将您在源区域和目标区域中的 AWS KMS 速率限制提高到每秒 2500 个请求（如果不同），以确保不受 AWS KMS 的限制。  
要查看源存储桶中的 `PUT` 对象请求速率，请查看 Amazon S3 的 Amazon CloudWatch 请求指标中的 `PutRequests`。有关查看 CloudWatch 指标的信息，请参阅[使用 S3 控制台](configure-request-metrics-bucket.md#configure-metrics)

   如果选择复制使用 AWS KMS 加密的对象，请执行以下操作：

   1. 在**用于加密目标对象的 AWS KMS key** 下，通过以下方式之一指定您的 KMS 密钥：
     + 要从可用的 KMS 密钥列表中进行选择，请选择**从您的 AWS KMS keys 密钥中进行选择**，并从可用密钥的列表中选择您的 **KMS 密钥**。

       AWS 托管式密钥 (`aws/s3`) 和您的客户自主管理型密钥都显示在此列表中。有关客户自主管理型密钥的更多信息，请参阅《AWS Key Management Service 开发人员指南》**中的[客户密钥和 AWS 密钥](https://docs.aws.amazon.com//kms/latest/developerguide/concepts.html#key-mgmt)。
     + 要输入 KMS 密钥 Amazon 资源名称（ARN），请选择**输入 AWS KMS key ARN**，然后在显示的字段中输入您的 KMS 密钥 ARN。这会加密目标存储桶中的副本。您可以在 [IAM 控制台](https://console.aws.amazon.com/iam/)中的**加密密钥**下方找到您的 KMS 密钥的 ARN。
     + 要在 AWS KMS 控制台中创建新的客户自主管理型密钥，请选择**创建 KMS 密钥**。

       有关创建 AWS KMS key 的更多信息，请参阅《AWS Key Management Service 开发人员指南》**中的[创建密钥](https://docs.aws.amazon.com//kms/latest/developerguide/create-keys.html)。
**重要**  
您只能使用与存储桶所在相同 AWS 区域 中启用的 KMS 密钥。选择**从您的 KMS 密钥中选择**时，S3 控制台对于每个区域仅列出 100 个 KMS 密钥。如果您在同一区域中有超过 100 个 KMS 密钥，您只会在 S3 控制台中看到前 100 个 KMS 密钥。要使用控制台中未列出的 KMS 密钥，请选择**输入 AWS KMS key ARN**，然后输入您的 KMS 密钥 ARN。  
在 Amazon S3 中使用 AWS KMS key 进行服务器端加密时，您必须选择对称加密 KMS 密钥。Amazon S3 仅支持对称加密 KMS 密钥，而不支持非对称 KMS 密钥。有关更多信息，请参阅《AWS Key Management Service 开发人员指南》**中的[确定对称和非对称 KMS 密钥](https://docs.aws.amazon.com//kms/latest/developerguide/find-symm-asymm.html)。

     有关创建 AWS KMS key 的更多信息，请参阅 *AWS Key Management Service 开发人员指南*中的[创建密钥](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html)。有关将 AWS KMS 与 Amazon S3 结合使用的更多信息，请参阅[使用具有 AWS KMS 密钥的服务器端加密（SSE-KMS）](UsingKMSEncryption.md)。

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

1. 设置**其他复制选项**时，您具有以下附加选项：
   + 如果要在复制配置中启用 S3 Replication Time Control（S3 RTC），请选择**复制时间控制（RTC）**。有关此选项的更多信息，请参阅 [使用 S3 Replication Time Control 满足合规性要求](replication-time-control.md)。
   + 如果要在复制配置中启用 S3 复制指标，请选择 **Replication metrics and events**（复制指标和事件）。有关更多信息，请参阅 [使用指标、事件通知和状态监控复制](replication-metrics.md)。
   + 如果要在复制配置中启用删除标记复制，请选择 **Delete marker replication (删除标记复制)**。有关更多信息，请参阅 [在存储桶之间复制删除标记](delete-marker-replication.md)。
   + 如果要在复制配置中启用 Amazon S3 副本修改同步，请选择 **Replica modification sync (副本修改同步)**。有关更多信息，请参阅 [使用副本修改同步复制元数据更改](replication-for-metadata-changes.md)。
**注意**  
使用 S3 RTC 或 S3 复制指标时，需要支付额外费用。

1. 要完成，请选择 **Save (保存)**。

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

## 使用 AWS CLI
<a name="replication-ex1-cli"></a>

要使用 AWS CLI 在源存储桶和目标存储桶由同一 AWS 账户 拥有时设置复制，请执行以下操作：
+ 创建源存储桶和目标存储桶。
+ 对存储桶启用版本控制。
+ 创建 AWS Identity and Access Management（IAM）角色来向 Amazon S3 授予复制对象的权限。
+ 将复制配置添加到源存储桶。

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

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

1. 为 AWS CLI 设置凭证配置文件。此示例使用配置文件名称 `acctA`。有关设置凭证配置文件和使用命名配置文件的信息，请参阅《AWS Command Line Interface 用户指南》**中的 [Configuration and credential file settings](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html)。
**重要**  
用于此示例的配置文件必须具有必要的权限。例如，在复制配置中，指定 Amazon S3 可担任的 IAM 角色。仅当您使用的配置文件具有 `iam:PassRole` 权限时，才能执行此操作。有关更多信息，请参阅《IAM 用户指南》**中的[向用户授予权限以将角色传递给 AWS 服务](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_passrole.html)。如果您使用管理员凭证创建命名配置文件，则可执行所有任务。

1. 使用以下 AWS CLI 命令创建一个源存储桶，并对其启用版本控制。要使用这些命令，请将 *`user input placeholders`* 替换为您自己的信息。

   以下 `create-bucket` 命令在美国东部（弗吉尼亚州北部）(`us-east-1`) 区域中创建一个名为 `amzn-s3-demo-source-bucket` 的源存储桶。

   

   ```
   aws s3api create-bucket \
   --bucket amzn-s3-demo-source-bucket \
   --region us-east-1 \
   --profile acctA
   ```

   以下 `put-bucket-versioning` 命令对于 `amzn-s3-demo-source-bucket` 存储桶启用 S3 版本控制：

   ```
   aws s3api put-bucket-versioning \
   --bucket amzn-s3-demo-source-bucket \
   --versioning-configuration Status=Enabled \
   --profile acctA
   ```

1. 使用以下 AWS CLI 命令创建一个目标存储桶，并对其启用版本控制。要使用这些命令，请将 *`user input placeholders`* 替换为您自己的信息。
**注意**  
要在源存储桶和目标存储桶位于同一 AWS 账户中时设置复制配置，请对源存储桶和目标存储桶使用相同的配置文件。此示例使用 `acctA`。  
要在这些存储桶由不同 AWS 账户拥有时对复制配置进行测试，请为每个账户指定不同的配置文件。例如，对目标存储桶使用 `acctB` 配置文件。

   

   以下 `create-bucket` 命令在美国西部（俄勒冈州）(`us-west-2`) 区域中创建一个名为 `amzn-s3-demo-destination-bucket` 的目标存储桶。

   ```
   aws s3api create-bucket \
   --bucket amzn-s3-demo-destination-bucket \
   --region us-west-2 \
   --create-bucket-configuration LocationConstraint=us-west-2 \
   --profile acctA
   ```

   以下 `put-bucket-versioning` 命令对于 `amzn-s3-demo-destination-bucket` 存储桶启用 S3 版本控制：

   ```
   aws s3api put-bucket-versioning \
   --bucket amzn-s3-demo-destination-bucket \
   --versioning-configuration Status=Enabled \
   --profile acctA
   ```

1. 创建一个 IAM 角色。您将在稍后添加到源存储桶的复制配置中指定此角色。Amazon S3 担任此角色以代表您复制对象。分两个步骤创建 IAM 角色：
   + 创建角色。
   + 将权限策略附加到角色。

   1. 创建 IAM 角色。

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

------
#### [ JSON ]

****  

         ```
         {
            "Version":"2012-10-17",		 	 	 
            "Statement":[
               {
                  "Effect":"Allow",
                  "Principal":{
                     "Service":"s3.amazonaws.com"
                  },
                  "Action":"sts:AssumeRole"
               }
            ]
         }
         ```

------

      1. 运行以下命令以创建角色。

         ```
         $ aws iam create-role \
         --role-name replicationRole \
         --assume-role-policy-document file://s3-role-trust-policy.json  \
         --profile acctA
         ```

   1. 将权限策略附加到角色。

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

------
#### [ JSON ]

****  

         ```
         {
            "Version":"2012-10-17",		 	 	 
            "Statement":[
               {
                  "Effect":"Allow",
                  "Action":[
                     "s3:GetObjectVersionForReplication",
                     "s3:GetObjectVersionAcl",
                     "s3:GetObjectVersionTagging"
                  ],
                  "Resource":[
                     "arn:aws:s3:::amzn-s3-demo-source-bucket/*"
                  ]
               },
               {
                  "Effect":"Allow",
                  "Action":[
                     "s3:ListBucket",
                     "s3:GetReplicationConfiguration"
                  ],
                  "Resource":[
                     "arn:aws:s3:::amzn-s3-demo-source-bucket"
                  ]
               },
               {
                  "Effect":"Allow",
                  "Action":[
                     "s3:ReplicateObject",
                     "s3:ReplicateDelete",
                     "s3:ReplicateTags"
                  ],
                  "Resource":"arn:aws:s3:::amzn-s3-demo-destination-bucket/*"
               }
            ]
         }
         ```

------
**注意**  
如果要复制加密的对象，还必须授予必要的 AWS Key Management Service（AWS KMS）密钥权限。有关更多信息，请参阅 [复制加密对象（SSE-S3、SSE-KMS、DSSE-KMS、SSE-C）](replication-config-for-kms-objects.md)。
要将对象锁定与复制功能结合使用，您必须在用于设置复制的 AWS Identity and Access Management（IAM）角色中，授予对源 S3 存储桶的两项额外的权限。这两项额外的权限是 `s3:GetObjectRetention` 和 `s3:GetObjectLegalHold`。如果角色已有 `s3:Get*` 权限声明，则该声明已满足要求。有关更多信息，请参阅 [将对象锁定与 S3 复制结合使用](object-lock-managing.md#object-lock-managing-replication)。

      1. 运行以下命令以创建策略并将其附加到角色。将 *`user input placeholders`* 替换为您自己的信息。

         ```
         $ aws iam put-role-policy \
         --role-name replicationRole \
         --policy-document file://s3-role-permissions-policy.json \
         --policy-name replicationRolePolicy \
         --profile acctA
         ```

1. 将复制配置添加到源存储桶。

   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:::amzn-s3-demo-destination-bucket"
            }
          }
        ]
      }
      ```

   1. 通过使用您自己的信息替换 `amzn-s3-demo-destination-bucket` 和 `IAM-role-ARN` 的值来更新 JSON。保存更改。

   1. 运行以下 `put-bucket-replication` 命令来将复制配置添加到源存储桶。请务必提供源存储桶名称：

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

   要检索复制配置，请使用 `get-bucket-replication` 命令：

   ```
   $ aws s3api get-bucket-replication \
   --bucket amzn-s3-demo-source-bucket \
   --profile acctA
   ```

1. 通过执行以下步骤，在 Amazon S3 控制台中测试设置：

   1. 登录到 AWS 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

   1. 在左侧导航窗格中，选择**存储桶**。在**通用存储桶**列表中，选择源存储桶。

   1. 在源存储桶中，创建一个名为 的文件夹`Tax` 

   1. 将示例对象添加到源存储桶中的 `Tax` 文件夹。
**注意**  
Amazon S3 复制对象所需的时间量取决于对象的大小。有关如何查看复制状态的信息，请参阅[获取复制状态信息](replication-status.md)。

      在目标存储桶中，确认以下几点：
      + 该 Amazon S3 已复制对象。
      + 这些对象是副本。在对象的**属性**选项卡上，向下滚动至**对象管理概述**部分。在**管理配置**下，查看**复制状态**下的值。确保此值设置为 `REPLICA`。
      + 副本归源存储桶账户拥有。可以在对象的**权限**选项卡上验证对象所有权。

        如果源存储桶和目标存储桶由不同的账户拥有，则可以添加可选配置，来指示 Amazon S3 将副本所有权更改为目标账户。有关示例，请参阅[如何更改副本拥有者](replication-change-owner.md#replication-walkthrough-3)。

## 使用 AWS SDK
<a name="replication-ex1-sdk"></a>

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

**注意**  
如果要复制加密的对象，还必须授予必要的 AWS Key Management Service（AWS KMS）密钥权限。有关更多信息，请参阅 [复制加密对象（SSE-S3、SSE-KMS、DSSE-KMS、SSE-C）](replication-config-for-kms-objects.md)。
要将对象锁定与复制功能结合使用，您必须在用于设置复制的 AWS Identity and Access Management（IAM）角色中，授予对源 S3 存储桶的两项额外的权限。这两项额外的权限是 `s3:GetObjectRetention` 和 `s3:GetObjectLegalHold`。如果角色已有 `s3:Get*` 权限声明，则该声明已满足要求。有关更多信息，请参阅 [将对象锁定与 S3 复制结合使用](object-lock-managing.md#object-lock-managing-replication)。

------
#### [ Java ]

要向存储桶添加复制配置，然后使用适用于 Java 的 AWS SDK 检索和验证配置，可以使用 S3Client 以编程方式管理复制设置。

有关如何使用适用于 Java 的 AWS SDK 配置复制的示例，请参阅《Amazon S3 API Reference》**中的 [Set replication configuration on a bucket](https://docs.aws.amazon.com/AmazonS3/latest/API/s3_example_s3_PutBucketReplication_section.html)。

------
#### [ C\$1 ]

以下 适用于 .NET 的 AWS SDK 代码示例向存储桶添加复制配置，然后检索该配置。要使用此代码，请为存储桶提供名称，并为 IAM 角色提供 Amazon 资源名称（ARN）。有关设置和运行代码示例的信息，请参阅《适用于 .NET 的 AWS SDK 开发人员指南》**中的 [Getting Started with the 适用于 .NET 的 AWS SDK](https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/net-dg-config.html)。

```
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);
            }
        }
    }
}
```

------