

# 复制加密对象（SSE-S3、SSE-KMS、DSSE-KMS、SSE-C）
<a name="replication-config-for-kms-objects"></a>

**重要**  
Amazon S3 现在将具有 Amazon S3 托管密钥的服务器端加密（SSE-S3）作为 Amazon S3 中每个存储桶的基本加密级别。从 2023 年 1 月 5 日起，上传到 Amazon S3 的所有新对象都将自动加密，不会产生额外费用，也不会影响性能。S3 存储桶默认加密配置和上传的新对象的自动加密状态可在 CloudTrail 日志、S3 清单、S3 Storage Lens 存储统计管理工具和 Amazon S3 控制台中查看，并可用作 AWS CLI 和 AWS SDK 中的附加 Amazon S3 API 响应标头。有关更多信息，请参阅[默认加密常见问题解答](https://docs.aws.amazon.com/AmazonS3/latest/userguide/default-encryption-faq.html)。

在复制已使用服务器端加密进行加密的对象时，有一些特殊注意事项。Amazon S3 支持以下服务器端加密类型：
+ 具有 Amazon S3 托管密钥的服务器端加密（SSE-S3）
+ 具有 AWS Key Management Service（AWS KMS）密钥的服务器端加密（SSE-KMS）
+ 具有 AWS KMS 密钥的双层服务器端加密（DSSE-KMS）
+ 具有客户提供密钥的服务器端加密（SSE-C）

有关服务器端加密的更多信息，请参阅 [使用服务器端加密保护数据](serv-side-encryption.md)。

本主题介绍指示 Amazon S3 复制已使用服务器端加密进行加密的对象所需的权限。本主题还提供了您可以添加的其他配置元素以及授予复制加密对象所需权限的示例 AWS Identity and Access Management（IAM）策略。

有关带分步说明的示例，请参阅[为加密对象启用复制](#replication-walkthrough-4)。有关创建复制配置的信息，请参阅[在区域内和跨区域复制对象](replication.md)。

**注意**  
您可以在 Amazon S3 中使用多区域 AWS KMS keys。但是，Amazon S3 目前将多区域密钥视为单区域密钥，且不使用密钥的多区域特征。有关更多信息，请参阅《AWS Key Management Service 开发人员指南》**中的 [Using multi-Region keys](https://docs.aws.amazon.com/kms/latest/developerguide/multi-region-keys-overview.html)。

**Topics**
+ [默认存储桶加密如何影响复制](#replication-default-encryption)
+ [复制使用 SSE-C 加密的对象](#replicationSSEC)
+ [复制使用 SSE-S3、SSE-KMS 或 DSSE-KMS 加密的对象](#replications)
+ [为加密对象启用复制](#replication-walkthrough-4)

## 默认存储桶加密如何影响复制
<a name="replication-default-encryption"></a>

在为复制目标存储桶启用默认加密后，将应用以下加密行为：
+ 如果未对源存储桶中的对象进行加密，则将使用目标存储桶的默认加密设置对目标存储桶中的副本对象进行加密。因此，源对象的实体标签（ETag）与副本对象的 ETag 不同。如果您有使用 ETag 的应用程序，则必须更新这些应用程序以弥补这种差异。
+ 如果使用具有 Amazon S3 托管密钥的服务器端加密（SSE-S3）、具有 AWS Key Management Service（AWS KMS）密钥的服务器端加密（SSE-KMS）或具有 AWS KMS 密钥的双层服务器端加密（DSSE-KMS）来加密源存储桶中的对象，则目标存储桶中的副本对象使用与源对象相同类型的加密。不会使用目标存储桶的默认加密设置。

## 复制使用 SSE-C 加密的对象
<a name="replicationSSEC"></a>

使用具有客户提供密钥的服务器端加密（SSE-C），您可以管理您自己的专有加密密钥。使用 SSE-C，您可以管理密钥，而 Amazon S3 管理加密和解密过程。您必须在请求中提供加密密钥，但无需编写任何代码即可执行对象加密或解密。在上传对象时，Amazon S3 将使用您提供的密钥加密对象。然后，Amazon S3 将该密钥从内存中清除。在检索对象时，必须提供相同的加密密钥作为您请求的一部分。有关更多信息，请参阅 [使用具有客户提供的密钥的服务器端加密（SSE-C）](ServerSideEncryptionCustomerKeys.md)。

S3 复制支持使用 SSE-C 加密的对象。您可以在 Amazon S3 控制台中或使用 AWS SDK 配置 SSE-C 对象复制，方法与为未加密对象配置复制的方法相同。除了复制当前所需的权限外，没有其他的 SSE-C 权限。

根据在 S3 复制配置中指定的内容，如果符合条件，S3 复制会自动复制新上传的 SSE-C 加密对象。要复制存储桶中的现有对象，请使用 S3 批量复制。有关复制对象的更多信息，请参阅[设置实时复制概述](replication-how-setup.md)和[使用批量复制以复制现有对象](s3-batch-replication-batch.md)。

复制 SSE-C 对象不会产生额外的费用。有关复制定价的详细信息，请参阅 [Amazon S3 定价](https://aws.amazon.com/s3/pricing/)。

## 复制使用 SSE-S3、SSE-KMS 或 DSSE-KMS 加密的对象
<a name="replications"></a>

默认情况下，Amazon S3 不会复制使用 SSE-KMS 或 DSSE-KMS 加密的对象。本节介绍您可以添加的其他配置元素以指示 Amazon S3 复制这些对象。

有关带分步说明的示例，请参阅[为加密对象启用复制](#replication-walkthrough-4)。有关创建复制配置的信息，请参阅[在区域内和跨区域复制对象](replication.md)。

### 在复制配置中指定其他信息
<a name="replication-kms-extra-config"></a>

在复制配置中，您需要执行以下操作：
+ 在复制配置的 `Destination` 元素中，添加您希望 Amazon S3 用来加密对象副本的对称 AWS KMS 客户托管密钥的 ID，如下面的复制配置示例所示。
+ 明确选择支持复制使用 KMS 密钥（SSE-KMS 或 DSSE-KMS）加密的对象。要选择加入，请添加 `SourceSelectionCriteria` 元素，如以下复制配置示例所示。

 

```
<ReplicationConfiguration>
   <Rule>
      ...
      <SourceSelectionCriteria>
         <SseKmsEncryptedObjects>
           <Status>Enabled</Status>
         </SseKmsEncryptedObjects>
      </SourceSelectionCriteria>

      <Destination>
          ...
          <EncryptionConfiguration>
             <ReplicaKmsKeyID>AWS KMS key ARN or Key Alias ARN that's in the same AWS 区域 as the destination bucket.</ReplicaKmsKeyID>
          </EncryptionConfiguration>
       </Destination>
      ...
   </Rule>
</ReplicationConfiguration>
```

**重要**  
必须已在目标存储桶所在的同一 AWS 区域中创建 KMS 密钥。
KMS 密钥*必须*有效。`PutBucketReplication` API 操作不检查 KMS 密钥的有效性。如果使用的 KMS 密钥无效，您将在响应中收到 HTTP `200 OK` 状态代码，但复制将失败。

以下示例显示了一个包含可选配置元素的复制配置。此复制配置包含一个规则。该规则应用于键前缀为 `Tax` 的对象。Amazon S3 使用指定的 AWS KMS key ID 来加密这些对象副本。

```
<?xml version="1.0" encoding="UTF-8"?>
<ReplicationConfiguration>
   <Role>arn:aws:iam::account-id:role/role-name</Role>
   <Rule>
      <ID>Rule-1</ID>
      <Priority>1</Priority>
      <Status>Enabled</Status>
      <DeleteMarkerReplication>
         <Status>Disabled</Status>
      </DeleteMarkerReplication>
      <Filter>
         <Prefix>Tax</Prefix>
      </Filter>
      <Destination>
         <Bucket>arn:aws:s3:::amzn-s3-demo-destination-bucket</Bucket>
         <EncryptionConfiguration>
            <ReplicaKmsKeyID>AWS KMS key ARN or Key Alias ARN that's in the same AWS 区域 as the destination bucket.</ReplicaKmsKeyID>
         </EncryptionConfiguration>
      </Destination>
      <SourceSelectionCriteria>
         <SseKmsEncryptedObjects>
            <Status>Enabled</Status>
         </SseKmsEncryptedObjects>
      </SourceSelectionCriteria>
   </Rule>
</ReplicationConfiguration>
```

### 为 IAM 角色授予额外权限
<a name="replication-kms-permissions"></a>

要复制使用 SSE-S3、SSE-KMS 或 DSSE-KMS 静态加密的对象，请向您在复制配置中指定的 AWS Identity and Access Management（IAM）角色授予以下其他权限。通过更新与 IAM 角色关联的权限策略，可授予这些权限。
+ **针对源对象的 `s3:GetObjectVersionForReplication` 操作** – 此操作允许 Amazon S3 复制未加密的对象，以及通过使用 SSE-S3、SSE-KMS 或 DSSE-KMS 的服务器端加密创建的对象。
**注意**  
我们建议您使用 `s3:GetObjectVersionForReplication` 操作而不是 `s3:GetObjectVersion` 操作，因为 `s3:GetObjectVersionForReplication` 仅向 Amazon S3 提供进行复制所需的最低权限。此外，`s3:GetObjectVersion` 操作允许复制未加密的对象和 SSE-S3 加密的对象，但不允许复制使用 KMS 密钥（SSE-KMS 或 DSSE-KMS）加密的对象。
+ **针对 KMS 密钥的 `kms:Decrypt` 和 `kms:Encrypt` AWS KMS 操作**
  + 您必须授予对 AWS KMS key（用于解密源对象）的 `kms:Decrypt` 权限。
  + 您必须授予对 `kms:Encrypt`（用于加密对象副本）的 AWS KMS key 权限。
+ **用于复制明文对象的 `kms:GenerateDataKey` 操作** – 如果将明文对象复制到默认情况下启用 SSE-KMS 或 DSSE-KMS 加密的存储桶中，则必须在 IAM 策略中包含目标加密上下文的 `kms:GenerateDataKey` 权限和 KMS 密钥。

**重要**  
如果您使用 S3 批量复制来跨区域复制数据集，并且您的对象之前已将其服务器端加密类型从 SSE-S3 更新为 SSE-KMS，则您可能需要额外的权限。在源区域存储桶上，您必须拥有 `kms:decrypt` 权限。然后，您将需要针对目标区域中存储桶的 `kms:decrypt` 和 `kms:encrypt` 权限。

我们建议您通过使用 AWS KMS 条件键将这些权限仅限于目标存储桶和对象。对于策略中列出的 KMS 密钥，拥有 IAM 角色的 AWS 账户必须具有执行 `kms:Encrypt` 和 `kms:Decrypt` 操作的权限。如果 KMS 密钥由另一个 AWS 账户拥有，则 KMS 密钥的拥有者必须向拥有 IAM 角色的 AWS 账户授予这些权限。有关管理对这些 KMS 密钥的访问权限的更多信息，请参阅《AWS Key Management Service 开发人员指南》**中的 [Using IAM policies with AWS KMS](https://docs.aws.amazon.com/kms/latest/developerguide/iam-policies.html)。

### S3 存储桶密钥和复制
<a name="bk-replication"></a>

要将复制与 S3 存储桶密钥结合使用，用于加密对象副本的 KMS 密钥的 AWS KMS key 策略必须包含发出调用的主体的 `kms:Decrypt` 权限。对 `kms:Decrypt` 的调用会在使用 S3 存储桶密钥之前验证 S3 存储桶密钥的完整性。有关更多信息，请参阅 [将 S3 存储桶密钥与复制功能结合使用](bucket-key.md#bucket-key-replication)。

当为源存储桶或目标存储桶启用 S3 存储桶密钥时，加密上下文将是存储桶的 Amazon 资源名称（ARN），而不是对象的 ARN（例如 `arn:aws:s3:::bucket_ARN`）。您必须更新 IAM 策略才能将存储桶 ARN 用于加密上下文：

```
"kms:EncryptionContext:aws:s3:arn": [
"arn:aws:s3:::bucket_ARN"
]
```

有关更多信息，请参阅[加密上下文（`x-amz-server-side-encryption-context`）](specifying-kms-encryption.md#s3-kms-encryption-context)（在“使用 REST API”一节中）和[启用 S3 存储桶密钥之前需要注意的更改](bucket-key.md#bucket-key-changes)。

### 示例策略：将 SSE-S3 和 SSE-KMS 与复制结合使用
<a name="kms-replication-examples"></a>

以下 IAM 策略示例显示了将 SSE-S3 和 SSE-KMS 与复制结合使用的语句。

**Example – 将 SSE-KMS 用于单独的目标存储桶**  
以下示例策略显示了将 SSE-KMS 与单独的目标存储桶结合使用的语句。

**Example – 复制使用 SSE-S3 和 SSE-KMS 创建的对象**  
以下是一个完整的 IAM 策略，它授予所需的权限以复制未加密的对象、使用 SSE-S3 创建的对象以及使用 SSE-KMS 创建的对象。    
****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Effect":"Allow",
         "Action":[
            "s3:GetReplicationConfiguration",
            "s3:ListBucket"
         ],
         "Resource":[
            "arn:aws:s3:::amzn-s3-demo-source-bucket"
         ]
      },
      {
         "Effect":"Allow",
         "Action":[
            "s3:GetObjectVersionForReplication",
            "s3:GetObjectVersionAcl"
         ],
         "Resource":[
            "arn:aws:s3:::amzn-s3-demo-source-bucket/key-prefix1*"
         ]
      },
      {
         "Effect":"Allow",
         "Action":[
            "s3:ReplicateObject",
            "s3:ReplicateDelete"
         ],
         "Resource":"arn:aws:s3:::amzn-s3-demo-destination-bucket/key-prefix1*"
      },
      {
         "Action":[
            "kms:Decrypt"
         ],
         "Effect":"Allow",
         "Condition":{
            "StringLike":{
               "kms:ViaService":"s3.us-east-1.amazonaws.com",
               "kms:EncryptionContext:aws:s3:arn":[
                  "arn:aws:s3:::amzn-s3-demo-source-bucket/key-prefix1*"
               ]
            }
         },
         "Resource":[
           "arn:aws:kms:us-east-1:111122223333:key/key-id"
         ]
      },
      {
         "Action":[
            "kms:Encrypt"
         ],
         "Effect":"Allow",
         "Condition":{
            "StringLike":{
               "kms:ViaService":"s3.us-east-1.amazonaws.com",
               "kms:EncryptionContext:aws:s3:arn":[
                  "arn:aws:s3:::amzn-s3-demo-destination-bucket/prefix1*"
               ]
            }
         },
         "Resource":[
            "arn:aws:kms:us-east-1:111122223333:key/key-id"
         ]
      }
   ]
}
```

**Example – 使用 S3 存储桶密钥复制对象**  
以下是一个完整的 IAM 策略，它授予复制具有 S3 存储桶密钥的对象所必需的权限。    
****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Effect":"Allow",
         "Action":[
            "s3:GetReplicationConfiguration",
            "s3:ListBucket"
         ],
         "Resource":[
            "arn:aws:s3:::amzn-s3-demo-source-bucket"
         ]
      },
      {
         "Effect":"Allow",
         "Action":[
            "s3:GetObjectVersionForReplication",
            "s3:GetObjectVersionAcl"
         ],
         "Resource":[
            "arn:aws:s3:::amzn-s3-demo-source-bucket/key-prefix1*"
         ]
      },
      {
         "Effect":"Allow",
         "Action":[
            "s3:ReplicateObject",
            "s3:ReplicateDelete"
         ],
         "Resource":"arn:aws:s3:::amzn-s3-demo-destination-bucket/key-prefix1*"
      },
      {
         "Action":[
            "kms:Decrypt"
         ],
         "Effect":"Allow",
         "Condition":{
            "StringLike":{
               "kms:ViaService":"s3.us-east-1.amazonaws.com",
               "kms:EncryptionContext:aws:s3:arn":[
                  "arn:aws:s3:::amzn-s3-demo-source-bucket"
               ]
            }
         },
         "Resource":[
           "arn:aws:kms:us-east-1:111122223333:key/key-id"
         ]
      },
      {
         "Action":[
            "kms:Encrypt"
         ],
         "Effect":"Allow",
         "Condition":{
            "StringLike":{
               "kms:ViaService":"s3.us-east-1.amazonaws.com",
               "kms:EncryptionContext:aws:s3:arn":[
                  "arn:aws:s3:::amzn-s3-demo-destination-bucket"
               ]
            }
         },
         "Resource":[
            "arn:aws:kms:us-east-1:111122223333:key/key-id"
         ]
      }
   ]
}
```

### 为跨账户方案授予其他权限
<a name="replication-kms-cross-acct-scenario"></a>

在跨账户方案中（其中源存储桶和目标存储桶由不同的 AWS 账户拥有），您可以使用 KMS 密钥加密对象副本。但是，KMS 密钥拥有者必须向源存储桶拥有者授予使用 KMS 密钥的权限。

**注意**  
如果您需要跨账户复制 SSE-KMS 数据，则复制规则必须指定来自目标账户 AWS KMS 的[客户托管式密钥](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)。[AWS 托管式密钥](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk)不支持跨账户使用，因此不能用于执行跨账户复制。<a name="cross-acct-kms-key-permission"></a>

**向源存储桶拥有者授予使用 KMS 密钥的权限（AWS KMS 控制台）**

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

1. 要更改 AWS 区域，请使用页面右上角的区域选择器。

1. 要查看您账户中自己所创建和管理的密钥，请在导航窗格中选择 **Customer managed keys (客户托管密钥)**。

1. 请选择 KMS 密钥。

1. 在**一般配置**部分下，选择**密钥策略**选项卡。

1. 向下滚动到**其他 AWS 账户**。

1. 选择**添加其他 AWS 账户**。

   将显示**其它 AWS 账户**对话框。

1. 在此对话框中，选择**添加其他 AWS 账户**。对于 **arn:aws:iam::**，输入源存储桶账户 ID。

1. 选择 **Save changes（保存更改）**。

**向源存储桶拥有者授予使用 KMS 密钥的权限 (AWS CLI)**
+ 有关 `put-key-policy` AWS Command Line Interface（AWS CLI）命令的信息，请参阅《AWS CLI 命令参考》**中的 [https://docs.aws.amazon.com/cli/latest/reference/kms/put-key-policy.html](https://docs.aws.amazon.com/cli/latest/reference/kms/put-key-policy.html)。有关基础 `PutKeyPolicy` API 操作的信息，请参阅《AWS Key Management Service API 参考》[https://docs.aws.amazon.com/kms/latest/APIReference/](https://docs.aws.amazon.com/kms/latest/APIReference/)中的 [https://docs.aws.amazon.com/kms/latest/APIReference/API_PutKeyPolicy.html](https://docs.aws.amazon.com/kms/latest/APIReference/API_PutKeyPolicy.html)。

### AWS KMS 事务限额注意事项
<a name="crr-kms-considerations"></a>

在启用跨区域复制（CRR）后使用 AWS KMS 加密添加许多新对象时，您可能会遇到节流（HTTP `503 Service Unavailable` 错误）。如果每秒 AWS KMS 事务数超出当前限额，则会发生节流。有关更多信息，请参阅《*AWS Key Management Service 开发人员指南*》中的[配额](https://docs.aws.amazon.com/kms/latest/developerguide/limits.html)。

要请求增加限额，您可以使用服务限额。有关更多信息，请参阅[请求提高限额](https://docs.aws.amazon.com/servicequotas/latest/userguide/request-quota-increase.html)。如果您所在区域不支持 Service Quotas，请[创建一个 AWS 支持 案例](https://console.aws.amazon.com/support/home#/)。

## 为加密对象启用复制
<a name="replication-walkthrough-4"></a>

默认情况下，Amazon S3 不会复制使用具有 AWS Key Management Service（AWS KMS）密钥的服务器端加密（SSE-KMS）或具有 AWS KMS 密钥的双层服务器端加密（DSSE-KMS）加密的对象。要复制用 SSE-KMS 或 DSS-KMS 加密的对象，必须修改存储桶复制配置，以指示 Amazon S3 复制这些对象。此示例介绍如何使用 Amazon S3 控制台和 AWS Command Line Interface（AWS CLI）更改存储桶复制配置以允许复制加密对象。

**注意**  
当为源或目标存储桶启用 S3 存储桶密钥时，加密上下文将是存储桶的 Amazon 资源名称 (ARN)，而不是对象的 ARN。您必须更新 IAM 策略才能将存储桶 ARN 用于加密上下文。有关更多信息，请参阅 [S3 存储桶密钥和复制](#bk-replication)。

**注意**  
您可以在 Amazon S3 中使用多区域 AWS KMS keys。但是，Amazon S3 目前将多区域密钥视为单区域密钥，且不使用密钥的多区域特征。有关更多信息，请参阅《AWS Key Management Service 开发人员指南》**中的 [Using multi-Region keys](https://docs.aws.amazon.com/kms/latest/developerguide/multi-region-keys-overview.html)。

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

如需分步指导，请参阅 [针对同一账户中的存储桶配置复制](replication-walkthrough1.md)。本主题提供了在源存储桶和目标存储桶由相同和不同的 AWS 账户拥有时设置复制配置的说明。

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

要使用 AWS CLI 复制加密的对象，请执行以下操作：
+ 创建源存储桶和目标存储桶，并对这些存储桶启用版本控制。
+ 创建向 Amazon S3 授予复制对象的权限的 AWS Identity and Access Management（IAM）服务角色。IAM 角色的权限包含复制这些加密对象所需的权限。
+ 将复制配置添加到源存储桶。复制配置提供与复制使用 KMS 密钥加密的对象相关的信息。
+ 将加密的对象添加到源存储桶。
+ 测试设置，以确认加密的对象正在复制到目标存储桶。

以下过程指导您完成此过程。

**复制服务器端加密对象 (AWS CLI)**

要在此过程中使用这些示例，请将 `user input placeholders` 替换为您自己的信息。

1. 在此示例中，您在同一个 AWS 账户中创建源存储桶 (*`amzn-s3-demo-source-bucket`*) 和目标存储桶 (*`amzn-s3-demo-destination-bucket`*)。还可以为 AWS CLI 设置凭证配置文件。此示例使用配置文件名称 `acctA`。

   有关设置凭证配置文件和使用命名配置文件的信息，请参阅《AWS Command Line Interface 用户指南》**中的 [Configuration and credential file settings](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html)。

1. 使用以下命令创建 `amzn-s3-demo-source-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
   ```

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

1. 使用以下命令创建 `amzn-s3-demo-destination-bucket` 存储桶并对该存储桶启用版本控制。以下示例命令在美国西部（俄勒冈州）（`us-west-2`）区域中创建 `amzn-s3-demo-destination-bucket` 存储桶。
**注意**  
要在 `amzn-s3-demo-source-bucket` 存储桶和 `amzn-s3-demo-destination-bucket` 存储桶均位于同一 AWS 账户中时设置复制配置，请使用同一配置文件。此示例使用 `acctA`。要在两个存储桶由不同 AWS 账户拥有时配置复制，您需要为每个存储桶指定不同的配置文件。

   

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

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

1. 接下来，创建 IAM 服务角色。您将在稍后添加到 `amzn-s3-demo-source-bucket` 存储桶的复制配置中指定此角色。Amazon S3 担任此角色以代表您复制对象。分两个步骤创建 IAM 角色：
   + 创建服务角色。
   + 将权限策略附加到角色。

   1. 要创建 IAM 服务角色，请执行以下操作：

      1. 复制以下信任策略，并将其保存到本地计算机上当前目录中一个名为 `s3-role-trust-policy-kmsobj.json` 的文件。此策略授予 Amazon S3 服务主体担任该角色的权限，以便 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 replicationRolekmsobj \
         --assume-role-policy-document file://s3-role-trust-policy-kmsobj.json  \
         --profile acctA
         ```

   1. 接下来，将权限策略附加到角色。此策略授予对各种 Amazon S3 存储桶和对象操作的权限。

      1. 复制以下权限策略，并将其保存到本地计算机上当前目录中一个名为 `s3-role-permissions-policykmsobj.json` 的文件。您将创建一个 IAM 角色，稍后将策略附加到该角色。
**重要**  
在权限策略中，您可以指定将用于加密 `amzn-s3-demo-source-bucket` 和 `amzn-s3-demo-destination-bucket` 存储桶的 AWS KMS 密钥 ID。您必须为 `amzn-s3-demo-source-bucket` 和 `amzn-s3-demo-destination-bucket` 存储桶创建两个单独的 KMS 密钥。AWS KMS keys不会在创建它们的 AWS 区域之外共享。

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

****  

         ```
         {
            "Version":"2012-10-17",		 	 	 
            "Statement":[
               {
                  "Action":[
                     "s3:ListBucket",
                     "s3:GetReplicationConfiguration",
                     "s3:GetObjectVersionForReplication",
                     "s3:GetObjectVersionAcl",
                     "s3:GetObjectVersionTagging"
                  ],
                  "Effect":"Allow",
                  "Resource":[
                     "arn:aws:s3:::amzn-s3-demo-source-bucket",
                     "arn:aws:s3:::amzn-s3-demo-source-bucket/*"
                  ]
               },
               {
                  "Action":[
                     "s3:ReplicateObject",
                     "s3:ReplicateDelete",
                     "s3:ReplicateTags"
                  ],
                  "Effect":"Allow",
                  "Condition":{
                     "StringLikeIfExists":{
                        "s3:x-amz-server-side-encryption":[
                           "aws:kms",
                           "AES256",
                           "aws:kms:dsse"
                        ],
                        "s3:x-amz-server-side-encryption-aws-kms-key-id":[
                           "AWS KMS key IDs(in ARN format) to use for encrypting object replicas"  
                        ]
                     }
                  },
                  "Resource":"arn:aws:s3:::amzn-s3-demo-destination-bucket/*"
               },
               {
                  "Action":[
                     "kms:Decrypt"
                  ],
                  "Effect":"Allow",
                  "Condition":{
                     "StringLike":{
                        "kms:ViaService":"s3.us-east-1.amazonaws.com",
                        "kms:EncryptionContext:aws:s3:arn":[
                           "arn:aws:s3:::amzn-s3-demo-source-bucket/*"
                        ]
                     }
                  },
                  "Resource":[
                     "arn:aws:kms:us-east-1:111122223333:key/key-id" 
                  ]
               },
               {
                  "Action":[
                     "kms:Encrypt"
                  ],
                  "Effect":"Allow",
                  "Condition":{
                     "StringLike":{
                        "kms:ViaService":"s3.us-west-2.amazonaws.com",
                        "kms:EncryptionContext:aws:s3:arn":[
                           "arn:aws:s3:::amzn-s3-demo-destination-bucket/*"
                        ]
                     }
                  },
                  "Resource":[
                     "arn:aws:kms:us-west-2:111122223333:key/key-id" 
                  ]
               }
            ]
         }
         ```

------

      1. 创建一个策略并将其附加到角色。

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

1. 接下来，将以下复制配置添加到 `amzn-s3-demo-source-bucket` 存储桶。它指示 Amazon S3 将前缀为 `Tax/` 的对象复制到 `amzn-s3-demo-destination-bucket` 存储桶。
**重要**  
在复制配置中，指定 Amazon S3 可代入的 IAM 角色。仅当您具有 `iam:PassRole` 权限时，才能执行此操作。您在 CLI 命令中指定的配置文件必须具有此权限。有关更多信息，请参阅《IAM 用户指南》**中的[向用户授予将角色传递给 AWS 服务的权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_passrole.html)。

   ```
    <ReplicationConfiguration>
     <Role>IAM-Role-ARN</Role>
     <Rule>
       <Priority>1</Priority>
       <DeleteMarkerReplication>
          <Status>Disabled</Status>
       </DeleteMarkerReplication>
       <Filter>
          <Prefix>Tax</Prefix>
       </Filter>
       <Status>Enabled</Status>
       <SourceSelectionCriteria>
         <SseKmsEncryptedObjects>
           <Status>Enabled</Status>
         </SseKmsEncryptedObjects>
       </SourceSelectionCriteria>
       <Destination>
         <Bucket>arn:aws:s3:::amzn-s3-demo-destination-bucket</Bucket>
         <EncryptionConfiguration>
           <ReplicaKmsKeyID>AWS KMS key IDs to use for encrypting object replicas</ReplicaKmsKeyID>
         </EncryptionConfiguration>
       </Destination>
     </Rule>
   </ReplicationConfiguration>
   ```

   要将复制配置添加到 `amzn-s3-demo-source-bucket` 存储桶，请执行以下操作：

   1. 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",
                  "EncryptionConfiguration":{
                     "ReplicaKmsKeyID":"AWS KMS key IDs (in ARN format) to use for encrypting object replicas"
                  }
               },
               "SourceSelectionCriteria":{
                  "SseKmsEncryptedObjects":{
                     "Status":"Enabled"
                  }
               }
            }
         ]
      }
      ```

   1. 编辑 JSON 以提供 `amzn-s3-demo-destination-bucket` 存储桶、`AWS KMS key IDs (in ARN format)` 和 `IAM-role-ARN` 的值。保存更改。

   1. 使用以下命令以将复制配置添加到 `amzn-s3-demo-source-bucket` 存储桶中。请务必提供 `amzn-s3-demo-source-bucket` 存储桶名称。

      ```
      $ aws s3api put-bucket-replication \
      --replication-configuration file://replication.json \
      --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. 在 `amzn-s3-demo-source-bucket` 存储桶中，创建一个名为 `Tax` 的文件夹。

   1. 将示例对象添加到文件夹。请务必选择加密选项并指定用于加密对象的 KMS 密钥。

   1. 确认 `amzn-s3-demo-destination-bucket` 存储桶包含对象副本，并且它们已使用在配置中指定的 KMS 密钥进行了加密。有关更多信息，请参阅 [获取复制状态信息](replication-status.md)。

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

有关显示如何添加复制配置的代码示例，请参阅[使用 AWS SDK](replication-walkthrough1.md#replication-ex1-sdk)。您必须适当地修改复制配置。

 