

# 设置实时复制概述
<a name="replication-how-setup"></a>

**注意**  
在您设置复制之前就存在的对象将不会自动复制。换句话说，Amazon S3 不以回溯方式复制对象。要复制在复制配置之前创建的对象，请使用 S3 分批复制。有关配置批量复制的更多信息，请参阅[复制现有对象](s3-batch-replication-batch.md)。

要启用实时复制，即同区域复制（SRR）或跨区域复制（CRR），请向源存储桶添加复制配置。该配置会指示 Amazon S3 按照指定的方式复制对象。在复制配置中，您必须提供以下内容：
+ **目标存储桶** – 您希望 Amazon S3 将对象复制到的存储桶。
+ **要复制的对象** – 可以复制源存储桶中的所有对象或对象的子集。通过在配置中提供一个[键名前缀](https://docs.aws.amazon.com/glossary/latest/reference/glos-chap.html#keyprefix)和/或一个或多个对象标签，可标识子集。

  例如，如果您配置复制规则，仅复制键名前缀为 `Tax/` 的对象，则 Amazon S3 仅复制键为 `Tax/doc1` 或 `Tax/doc2` 之类的对象。但它不复制具有键 `Legal/doc3` 的对象。如果您同时指定前缀和一个或多个标签，则 Amazon S3 仅复制具有特定键前缀和这些标签的对象。
+ **AWS Identity and Access Management（IAM）角色** – Amazon S3 代入此 IAM 角色以代表您复制对象。有关创建此 IAM 角色和管理权限的更多信息，请参阅[为实时复制设置权限](setting-repl-config-perm-overview.md)。

除了这些最低要求，您还可以选择以下选项：
+ **副本存储类** – 默认情况下，Amazon S3 使用与源对象相同的存储类来存储对象副本。您可以为副本指定其他存储类。
+ **副本所有权** – Amazon S3 假定对象副本继续由源对象的拥有者拥有。因此，在复制对象时，它还会复制对应的对象访问控制列表 (ACL) 或 S3 对象拥有权设置。如果源存储桶和目标存储桶由不同的 AWS 账户拥有，您可以配置复制以将副本的拥有者更改为拥有目标存储桶的 AWS 账户。有关更多信息，请参阅 [更改副本拥有者](replication-change-owner.md)。

可以使用 Amazon S3 控制台、AWS Command Line Interface（AWS CLI）、AWS SDK 或 Amazon S3 REST API 配置复制。有关如何设置复制的详细演练，请参阅[配置实时复制的示例](replication-example-walkthroughs.md)。

 Amazon S3 提供了 REST API 操作来支持设置复制规则。有关更多信息，请参阅《Amazon Simple Storage Service API 参考》**中的以下主题：
+  [https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketReplication.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketReplication.html) 
+  [https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketReplication.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketReplication.html) 
+  [https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketReplication.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketReplication.html) 

**Topics**
+ [复制配置文件元素](replication-add-config.md)
+ [为实时复制设置权限](setting-repl-config-perm-overview.md)
+ [配置实时复制的示例](replication-example-walkthroughs.md)

# 复制配置文件元素
<a name="replication-add-config"></a>

Amazon S3 以 XML 形式存储复制配置。如果您通过 Amazon S3 REST API 以编程方式配置复制，则可以在此 XML 文件中指定复制配置的不同元素。如果您通过 AWS Command Line Interface（AWS CLI）配置复制，则可以使用 JSON 格式指定复制配置。有关 JSON 示例，请参阅[配置实时复制的示例](replication-example-walkthroughs.md)中的演练。

**注意**  
复制配置 XML 格式的最新版本为 V2。XML V2 复制配置是那些包含规则的 `<Filter>` 元素和指定 S3 Replication Time Control（S3 RTC）的规则的配置。  
要查看复制配置版本，您可以使用 `GetBucketReplication` API 操作。有关更多信息，请参阅《Amazon Simple Storage Service API 参考》**中的 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketReplication.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketReplication.html)。  
为了向后兼容，Amazon S3 继续支持 XML V1 复制配置格式。如果您已使用 XML V1 复制配置格式，请参阅[向后兼容性注意事项](#replication-backward-compat-considerations)来了解向后兼容性注意事项。

在复制配置 XML 文件中，必须指定一个 AWS Identity and Access Management（IAM）角色以及一个或多个规则，如下面的示例所示：

```
<ReplicationConfiguration>
    <Role>IAM-role-ARN</Role>
    <Rule>
        ...
    </Rule>
    <Rule>
         ... 
    </Rule>
     ...
</ReplicationConfiguration>
```

Amazon S3 无法在未经您的权限的情况下复制对象。可以使用在复制配置中指定的 IAM 角色向 Amazon S3 授予权限。Amazon S3 担任此 IAM 角色以代表您复制对象。您必须先向 IAM 角色授予必要的权限。有关管理权限的更多信息，请参阅 [为实时复制设置权限](setting-repl-config-perm-overview.md)。

在以下场景下，只在复制配置中添加一个规则：
+ 您希望复制所有对象。
+ 您希望只复制对象的一个子集。通过在规则中添加一个筛选条件，可标识对象子级。在该筛选条件中，指定对象键前缀、标签或二者的组合，来标识要向其应用规则的对象子集。筛选条件指向与您指定的确切值相匹配的对象。

如果要复制不同的对象子集，请在复制配置中添加多个规则。在每个规则中，指定一个用于选择不同子集的筛选条件。例如，您可能选择了键前缀为 `tax/` 或 `document/` 的复制对象。要做到这一点，您需要添加两个规则，一个规则指定 `tax/` 键前缀筛选条件，另一个指定 `document/` 键前缀。有关对象键前缀的更多信息，请参阅[使用前缀组织对象](using-prefixes.md)。

以下各节提供了更多信息。

**Topics**
+ [基本规则配置](#replication-config-min-rule-config)
+ [可选：指定筛选条件](#replication-config-optional-filter)
+ [其他目标配置](#replication-config-optional-dest-config)
+ [复制配置示例](#replication-config-example-configs)
+ [向后兼容性注意事项](#replication-backward-compat-considerations)

## 基本规则配置
<a name="replication-config-min-rule-config"></a>

每个规则必须包含规则的状态和优先级。规则还必须指示是否复制删除标记。
+ `<Status>` 元素通过使用值 `Enabled` 或 `Disabled` 来指示是启用还是禁用规则。如果规则处于禁用状态，则 Amazon S3 不会执行规则中指定的操作。
+ `<Priority>` 元素指示当两个或更多复制规则冲突时哪个规则优先。Amazon S3 将尝试根据所有复制规则复制对象。但是，如果同一目标存储桶有两个或更多规则，则将根据具有最高优先级的规则复制对象。数字越大，优先级越高。
+ `<DeleteMarkerReplication>` 元素通过使用值 `Enabled` 或 `Disabled` 来指示是否复制删除标记。

在 `<Destination>` 元素配置中，必须提供您希望 Amazon S3 将对象复制到其中的一个或多个目标存储桶的名称。

以下示例显示针对 V2 规则的最低要求。为了向后兼容，Amazon S3 仍继续支持 XML V1 格式。有关更多信息，请参阅 [向后兼容性注意事项](#replication-backward-compat-considerations)。

```
...
    <Rule>
        <ID>Rule-1</ID>
        <Status>Enabled-or-Disabled</Status>
        <Filter>
            <Prefix></Prefix>   
        </Filter>
        <Priority>integer</Priority>
        <DeleteMarkerReplication>
           <Status>Enabled-or-Disabled</Status>
        </DeleteMarkerReplication>
        <Destination>        
           <Bucket>arn:aws:s3:::amzn-s3-demo-destination-bucket</Bucket> 
        </Destination>    
    </Rule>
    <Rule>
         ...
    </Rule>
     ...
...
```

您也可以指定其他配置选项。例如，您可能选择了将一个存储类用于对象副本，将另一个存储类用于源对象。

## 可选：指定筛选条件
<a name="replication-config-optional-filter"></a>

要选择规则应用于的对象子集，请添加一个可选筛选条件。可按对象键前缀、对象标签或二者的组合进行筛选。如果您同时按键前缀和对象标签进行筛选，Amazon S3 会使用逻辑 `AND` 运算符组合这些筛选条件。换句话说，规则会应用于同时具有特定键前缀和特定标签的对象子集。

**根据对象键前缀进行筛选**  
要指定具有基于对象键前缀的筛选条件的规则，请使用以下 XML。对于每个规则，只能指定一个前缀。

```
<Rule>
    ...
    <Filter>
        <Prefix>key-prefix</Prefix>   
    </Filter>
    ...
</Rule>
...
```

**根据对象标签进行筛选**  
要指定具有基于对象标签的筛选条件的规则，请使用以下 XML。可以指定一个或多个对象标签。

```
<Rule>
    ...
    <Filter>
        <And>
            <Tag>
                <Key>key1</Key>
                <Value>value1</Value>
            </Tag>
            <Tag>
                <Key>key2</Key>
                <Value>value2</Value>
            </Tag>
             ...
        </And>
    </Filter>
    ...
</Rule>
...
```

**使用键前缀和对象标签进行筛选**  
要指定组合了键前缀和对象标签的规则筛选条件，请使用以下 XML。您需要将这些筛选条件包含在 `<And>` 父元素中。Amazon S3 会执行逻辑 `AND` 运算以组合这些筛选条件。换句话说，规则会应用于同时具有特定键前缀和特定标签的对象子集。

```
<Rule>
    ...
    <Filter>
        <And>
            <Prefix>key-prefix</Prefix>
            <Tag>
                <Key>key1</Key>
                <Value>value1</Value>
            </Tag>
            <Tag>
                <Key>key2</Key>
                <Value>value2</Value>
            </Tag>
             ...
    </Filter>
    ...
</Rule>
...
```

**注意**  
如果您指定了一条带有空 `<Filter>` 元素的规则，则该规则将应用于您存储桶中的所有对象。
当您在实时复制中使用基于标签的复制规则时，必须在 `PutObject` 操作中使用匹配的复制规则标签来标记新对象。否则，将不会复制对象。如果在 `PutObject` 操作后标记了对象，也不会复制这些对象。  
要复制在 `PutObject` 操作之后标记的对象，您必须使用 S3 批量复制。有关分批复制的更多信息，请参阅 [复制现有对象](s3-batch-replication-batch.md)。

## 其他目标配置
<a name="replication-config-optional-dest-config"></a>

在目标配置中，指定您希望 Amazon S3 将对象复制到其中的存储桶。您可以设置配置以将对象从一个源存储桶复制到一个或更多个目标存储桶。

```
...
<Destination>        
    <Bucket>arn:aws:s3:::amzn-s3-demo-destination-bucket</Bucket>
</Destination>
...
```

您可在 `<Destination>` 元素中添加以下选项。

**Topics**
+ [指定存储类](#storage-class-configuration)
+ [添加多个目标存储桶](#multiple-destination-buckets-configuration)
+ [为涉及多个目标存储桶的每个复制规则指定不同的参数](#replication-rule-configuration)
+ [更改副本所有权](#replica-ownership-configuration)
+ [启用 S3 Replication Time Control](#rtc-configuration)
+ [复制使用 AWS KMS 通过服务器端加密所创建的对象](#sse-kms-configuration)

### 指定存储类
<a name="storage-class-configuration"></a>

您可以为对象副本指定存储类。默认情况下，Amazon S3 使用源对象的存储类来创建对象副本，如以下示例所示。

```
...
<Destination>
       <Bucket>arn:aws:s3:::amzn-s3-demo-destination-bucket</Bucket>
       <StorageClass>storage-class</StorageClass>
</Destination>
...
```

### 添加多个目标存储桶
<a name="multiple-destination-buckets-configuration"></a>

您可以在单个复制配置中添加多个目标存储桶，如下所示。

```
...
<Rule>
    <ID>Rule-1</ID>
    <Status>Enabled-or-Disabled</Status>
    <Priority>integer</Priority>
    <DeleteMarkerReplication>
       <Status>Enabled-or-Disabled</Status>
    </DeleteMarkerReplication>
    <Destination>        
       <Bucket>arn:aws:s3:::amzn-s3-demo-destination-bucket1</Bucket> 
    </Destination>    
</Rule>
<Rule>
    <ID>Rule-2</ID>
    <Status>Enabled-or-Disabled</Status>
    <Priority>integer</Priority>
    <DeleteMarkerReplication>
       <Status>Enabled-or-Disabled</Status>
    </DeleteMarkerReplication>
    <Destination>        
       <Bucket>arn:aws:s3:::amzn-s3-demo-destination-bucket2</Bucket> 
    </Destination>    
</Rule>
...
```

### 为涉及多个目标存储桶的每个复制规则指定不同的参数
<a name="replication-rule-configuration"></a>

在单个复制配置中添加多个目标存储桶时，可以为每个复制规则指定不同的参数，如下所示。

```
...
<Rule>
    <ID>Rule-1</ID>
    <Status>Enabled-or-Disabled</Status>
    <Priority>integer</Priority>
    <DeleteMarkerReplication>
       <Status>Disabled</Status>
    </DeleteMarkerReplication>
      <Metrics>
    <Status>Enabled</Status>
    <EventThreshold>
      <Minutes>15</Minutes> 
    </EventThreshold>
  </Metrics>
    <Destination>        
       <Bucket>arn:aws:s3:::amzn-s3-demo-destination-bucket1</Bucket> 
    </Destination>    
</Rule>
<Rule>
    <ID>Rule-2</ID>
    <Status>Enabled-or-Disabled</Status>
    <Priority>integer</Priority>
    <DeleteMarkerReplication>
       <Status>Enabled</Status>
    </DeleteMarkerReplication>
      <Metrics>
    <Status>Enabled</Status>
    <EventThreshold>
      <Minutes>15</Minutes> 
    </EventThreshold>
  </Metrics>
  <ReplicationTime>
    <Status>Enabled</Status>
    <Time>
      <Minutes>15</Minutes>
    </Time>
  </ReplicationTime>
    <Destination>        
       <Bucket>arn:aws:s3:::amzn-s3-demo-destination-bucket2</Bucket> 
    </Destination>    
</Rule>
...
```

### 更改副本所有权
<a name="replica-ownership-configuration"></a>

当源存储桶和目标存储桶由不同账户拥有时，您可以将副本的所有权更改为拥有目标存储桶的 AWS 账户。为此，请添加 `<AccessControlTranslation>` 元素。这个元素将获取值 `Destination`。

```
...
<Destination>
   <Bucket>arn:aws:s3:::amzn-s3-demo-destination-bucket</Bucket>
   <Account>destination-bucket-owner-account-id</Account>
   <AccessControlTranslation>
       <Owner>Destination</Owner>
   </AccessControlTranslation>
</Destination>
...
```

如果您没有将 `<AccessControlTranslation>` 元素添加到复制配置中，则副本由拥有源对象的同一 AWS 账户 拥有。有关更多信息，请参阅 [更改副本拥有者](replication-change-owner.md)。

### 启用 S3 Replication Time Control
<a name="rtc-configuration"></a>

您可以在复制配置中启用 S3 Replication Time Control（S3 RTC）。S3 RTC 在几秒钟内复制大多数对象，并在 15 分钟内复制 99.99% 的对象（由服务等级协议提供支持）。

**注意**  
`<EventThreshold>` 和 `<Time>` 元素只接受值 `<Minutes>15</Minutes>`。

```
...
<Destination>
  <Bucket>arn:aws:s3:::amzn-s3-demo-destination-bucket</Bucket>
  <Metrics>
    <Status>Enabled</Status>
    <EventThreshold>
      <Minutes>15</Minutes> 
    </EventThreshold>
  </Metrics>
  <ReplicationTime>
    <Status>Enabled</Status>
    <Time>
      <Minutes>15</Minutes>
    </Time>
  </ReplicationTime>
</Destination>
...
```

有关更多信息，请参阅 [使用 S3 Replication Time Control 满足合规性要求](replication-time-control.md)。有关 API 示例，请参阅《Amazon Simple Storage Service API 参考》**中的 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketReplication.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketReplication.html)。

### 复制使用 AWS KMS 通过服务器端加密所创建的对象
<a name="sse-kms-configuration"></a>

您的源存储桶可能包含一些对象，它们是使用 AWS Key Management Service（AWS KMS）密钥的服务器端加密（SSE-KMS）创建的。默认情况下，Amazon S3 不复制这些对象。您可以有选择地指示 Amazon S3 复制这些对象。要做到这一点，首先通过添加 `<SourceSelectionCriteria>` 元素显式选择此功能。然后提供 AWS KMS key（对于目标存储桶的 AWS 区域），用于加密对象副本。以下示例显示了如何指定这些元素。

```
...
<SourceSelectionCriteria>
  <SseKmsEncryptedObjects>
    <Status>Enabled</Status>
  </SseKmsEncryptedObjects>
</SourceSelectionCriteria>
<Destination>
  <Bucket>arn:aws:s3:::amzn-s3-demo-destination-bucket</Bucket>
  <EncryptionConfiguration>
    <ReplicaKmsKeyID>AWS KMS key ID to use for encrypting object replicas</ReplicaKmsKeyID>
  </EncryptionConfiguration>
</Destination>
...
```

有关更多信息，请参阅 [复制加密对象（SSE-S3、SSE-KMS、DSSE-KMS、SSE-C）](replication-config-for-kms-objects.md)。

## 复制配置示例
<a name="replication-config-example-configs"></a>

首先，您可以根据需要将以下复制配置示例添加到存储桶。

**重要**  
要向存储桶添加复制配置，您必须具有 `iam:PassRole` 权限。此权限允许您传递向 Amazon S3 授予复制权限的 IAM 角色。通过提供复制配置 XML 中 `<Role>` 元素中使用的 Amazon 资源名称（ARN），可指定 IAM 角色。有关更多信息，请参阅《IAM 用户指南》**中的[向用户授予将角色传递给 AWS 服务的权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_passrole.html)。

**Example 1：包含一个规则的复制配置**  
以下基本复制配置指定一个规则。该规则指定 Amazon S3 可担任的一个 IAM 角色以及用于对象副本的目标存储桶。`<Status>` 的元素值 `Enabled` 指示该规则是有效的。  

```
<?xml version="1.0" encoding="UTF-8"?>
<ReplicationConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
  <Role>arn:aws:iam::account-id:role/role-name</Role>
  <Rule>
    <Status>Enabled</Status>

    <Destination>
      <Bucket>arn:aws:s3:::amzn-s3-demo-destination-bucket</Bucket>
    </Destination>
  </Rule>
</ReplicationConfiguration>
```
要选择要复制的对象子集，可添加一个筛选条件。在以下配置中，该筛选条件指定一个对象键前缀。此规则将应用于其键名中带有前缀 `Tax/` 的对象。  

```
<?xml version="1.0" encoding="UTF-8"?>
<ReplicationConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
  <Role>arn:aws:iam::account-id:role/role-name</Role>
  <Rule>
    <Status>Enabled</Status>
    <Priority>1</Priority>
    <DeleteMarkerReplication>
       <Status>string</Status>
    </DeleteMarkerReplication>

    <Filter>
       <Prefix>Tax/</Prefix>
    </Filter>

    <Destination>
       <Bucket>arn:aws:s3:::amzn-s3-demo-destination-bucket</Bucket>
    </Destination>

  </Rule>
</ReplicationConfiguration>
```
如果您指定 `<Filter>` 元素，则还必须包含 `<Priority>` 和 `<DeleteMarkerReplication>` 元素。在此示例中，由于只有一个规则，因此您为 `<Priority>` 元素设置的值无关紧要。  
在以下配置中，筛选条件指定一个前缀和两个标签。规则将应用于具有指定键前缀和标签的对象子级。具体来说，规则将应用于在键名称中具有 `Tax/` 前缀并具有两个指定对象标签的对象。在此示例中，由于只有一个规则，因此您为 `<Priority>` 元素设置的值无关紧要。  

```
<?xml version="1.0" encoding="UTF-8"?>
<ReplicationConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
  <Role>arn:aws:iam::account-id:role/role-name</Role>
  <Rule>
    <Status>Enabled</Status>
    <Priority>1</Priority>
    <DeleteMarkerReplication>
       <Status>string</Status>
    </DeleteMarkerReplication>

    <Filter>
        <And>
          <Prefix>Tax/</Prefix>
          <Tag>
             <Tag>
                <Key>tagA</Key>
                <Value>valueA</Value>
             </Tag>
          </Tag>
          <Tag>
             <Tag>
                <Key>tagB</Key>
                <Value>valueB</Value>
             </Tag>
          </Tag>
       </And>

    </Filter>

    <Destination>
        <Bucket>arn:aws:s3:::amzn-s3-demo-destination-bucket</Bucket>
    </Destination>

  </Rule>
</ReplicationConfiguration>
```
可以为对象副本指定存储类，如下所示：  

```
<?xml version="1.0" encoding="UTF-8"?>

<ReplicationConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
  <Role>arn:aws:iam::account-id:role/role-name</Role>
  <Rule>
    <Status>Enabled</Status>
    <Destination>
       <Bucket>arn:aws:s3:::amzn-s3-demo-destination-bucket</Bucket>
       <StorageClass>storage-class</StorageClass>
    </Destination>
  </Rule>
</ReplicationConfiguration>
```
您可以指定 Amazon S3 支持的任何存储类。

**Example 2：包含两个规则的复制配置**  

**Example**  
在以下复制配置中，规则指定以下内容：  
+ 每个规则按不同的键前缀进行筛选，以便每个规则应用于不同的对象子集。在此示例中，Amazon S3 复制键名为 *`Tax/doc1.pdf`* 和 *`Project/project1.txt`* 的对象，但是它不复制键名为 *`PersonalDoc/documentA`* 的对象。
+ 尽管两个规则都指定 `<Priority>` 元素的值，但由于规则应用于两个不同的对象集，因此规则优先级无关紧要。下一示例将说明应用规则优先级时会发生的情况。
+ 第二个规则为对象副本指定 S3 Standard-IA 存储类。Amazon S3 对这些对象副本使用指定的存储类。
   

```
<?xml version="1.0" encoding="UTF-8"?>

<ReplicationConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
  <Role>arn:aws:iam::account-id:role/role-name</Role>
  <Rule>
    <Status>Enabled</Status>
    <Priority>1</Priority>
    <DeleteMarkerReplication>
       <Status>string</Status>
    </DeleteMarkerReplication>
    <Filter>
        <Prefix>Tax</Prefix>
    </Filter>
    <Status>Enabled</Status>
    <Destination>
      <Bucket>arn:aws:s3:::amzn-s3-demo-destination-bucket</Bucket>
    </Destination>
     ...
  </Rule>
 <Rule>
    <Status>Enabled</Status>
    <Priority>2</Priority>
    <DeleteMarkerReplication>
       <Status>string</Status>
    </DeleteMarkerReplication>
    <Filter>
        <Prefix>Project</Prefix>
    </Filter>
    <Status>Enabled</Status>
    <Destination>
      <Bucket>arn:aws:s3:::amzn-s3-demo-destination-bucket</Bucket>
     <StorageClass>STANDARD_IA</StorageClass>
    </Destination>
     ...
  </Rule>


</ReplicationConfiguration>
```

**Example 3：包含两个具有重叠前缀的规则的复制配置**  <a name="overlap-rule-example"></a>
在此配置中，两个规则指定具有重叠键前缀 *`star`* 和 *`starship`* 的筛选条件。两个规则应用于键名称为 *`starship-x`* 的对象。在此示例中，Amazon S3 使用规则优先级确定要应用哪个规则。数字越大，优先级越高。  

```
<ReplicationConfiguration>

  <Role>arn:aws:iam::account-id:role/role-name</Role>

  <Rule>
    <Status>Enabled</Status>
    <Priority>1</Priority>
    <DeleteMarkerReplication>
       <Status>string</Status>
    </DeleteMarkerReplication>
    <Filter>
        <Prefix>star</Prefix>
    </Filter>
    <Destination>
      <Bucket>arn:aws:s3:::amzn-s3-demo-destination-bucket</Bucket>
    </Destination>
  </Rule>
  <Rule>
    <Status>Enabled</Status>
    <Priority>2</Priority>
    <DeleteMarkerReplication>
       <Status>string</Status>
    </DeleteMarkerReplication>
    <Filter>
        <Prefix>starship</Prefix>
    </Filter>    
    <Destination>
      <Bucket>arn:aws:s3:::amzn-s3-demo-destination-bucket</Bucket>
    </Destination>
  </Rule>
</ReplicationConfiguration>
```

**Example 4：示例演练**  
有关演练示例，请参阅 [配置实时复制的示例](replication-example-walkthroughs.md)。

有关复制配置的 XML 结构的更多信息，请参阅《Amazon Simple Storage Service API 参考》**中的 [PutBucketReplication](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTreplication.html)。

## 向后兼容性注意事项
<a name="replication-backward-compat-considerations"></a>

复制配置 XML 格式的最新版本为 V2。XML V2 复制配置是那些包含规则的 `<Filter>` 元素和指定 S3 Replication Time Control（S3 RTC）的规则的配置。

要查看复制配置版本，您可以使用 `GetBucketReplication` API 操作。有关更多信息，请参阅《Amazon Simple Storage Service API 参考》**中的 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketReplication.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketReplication.html)。

为了向后兼容，Amazon S3 继续支持 XML V1 复制配置格式。如果您已使用 XML V1 复制配置格式，请考虑以下影响向后兼容性的问题：
+ 复制配置 XML V2 格式包含规则的 `<Filter>` 元素。通过 `<Filter>` 元素，您可以指定基于对象键前缀和/或标签的对象筛选条件，以确定规则要应用于的范围。复制配置 XML V1 格式支持仅基于键前缀的筛选。在这种情况下，您直接添加 `<Prefix>` 元素作为 `<Rule>` 元素的子元素，如以下示例所示：

  ```
  <?xml version="1.0" encoding="UTF-8"?>
  <ReplicationConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <Role>arn:aws:iam::account-id:role/role-name</Role>
    <Rule>
      <Status>Enabled</Status>
      <Prefix>key-prefix</Prefix>
      <Destination>
         <Bucket>arn:aws:s3:::amzn-s3-demo-destination-bucket</Bucket>
      </Destination>
  
    </Rule>
  </ReplicationConfiguration>
  ```
+ 当您从源存储桶中删除对象而不指定对象版本 ID 时，Amazon S3 会添加一个删除标记。如果使用复制配置 XML V1 格式，Amazon S3 仅复制因用户操作产生的删除标记。换句话说，Amazon S3 仅在用户删除对象时才复制删除标记。如果 Amazon S3 移除到期的对象（作为生命周期操作的一部分），Amazon S3 不会复制删除标记。

  在复制配置 XML V2 格式中，可以为非基于标签的规则启用删除标记复制。有关更多信息，请参阅 [在存储桶之间复制删除标记](delete-marker-replication.md)。

 

# 为实时复制设置权限
<a name="setting-repl-config-perm-overview"></a>

在 Amazon S3 中设置实时复制时，您必须获取必要的权限，如下所示：
+ 您必须向将要创建复制规则的 AWS Identity and Access Management（IAM）主体（用户或角色）授予一组特定的权限。
+ Amazon S3 需要代表您复制对象的权限。您通过创建一个 IAM 角色，然后在复制配置中指定该角色，授予这些权限。
+ 当源存储桶与目标存储桶不是由相同账户拥有时，目标存储桶的拥有者还必须向源存储桶拥有者授予存储副本的权限。

**注意**  
如果您使用 S3 批量操作来按需复制对象，而不是设置实时复制，则 S3 批量复制需要不同的 IAM 角色和策略。有关批量复制 IAM 角色和策略示例，请参阅[配置 IAM 角色以进行 S3 批量复制](s3-batch-replication-policies.md)。

**Topics**
+ [步骤 1：向正在创建复制规则的 IAM 主体授予权限](#setting-repl-config-role)
+ [步骤 2：创建供 Amazon S3 代入的 IAM 角色](#setting-repl-config-same-acctowner)
+ [（可选）步骤 3：在源存储桶和目标存储桶由不同的 AWS 账户拥有时授予权限](#setting-repl-config-crossacct)
+ [（可选）步骤 4：授予更改副本所有权的权限](#change-replica-ownership)

## 步骤 1：向正在创建复制规则的 IAM 主体授予权限
<a name="setting-repl-config-role"></a>

您将用于创建复制规则的 IAM 用户或角色需要相应的权限，才能为单向或双向复制创建复制规则。如果用户或角色没有这些权限，您将无法创建复制规则。有关更多信息，请参阅《IAM 用户指南》**中的 [IAM 身份](https://docs.aws.amazon.com/IAM/latest/UserGuide/id.html)。

用户或角色需要执行以下操作：
+ `iam:AttachRolePolicy`
+ `iam:CreatePolicy`
+ `iam:CreateServiceLinkedRole`
+ `iam:PassRole`
+ `iam:PutRolePolicy`
+ `s3:GetBucketVersioning`
+ `s3:GetObjectVersionAcl`
+ `s3:GetObjectVersionForReplication`
+ `s3:GetReplicationConfiguration`
+ `s3:PutReplicationConfiguration`

以下是包含这些操作的示例 IAM 策略。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetAccessPoint",
                "s3:GetAccountPublicAccessBlock",
                "s3:GetBucketAcl",
                "s3:GetBucketLocation",
                "s3:GetBucketPolicyStatus",
                "s3:GetBucketPublicAccessBlock",
                "s3:ListAccessPoints",
                "s3:ListAllMyBuckets",
                "s3:PutReplicationConfiguration",
                "s3:GetReplicationConfiguration",
                "s3:GetBucketVersioning",
                "s3:GetObjectVersionForReplication",
                "s3:GetObjectVersionAcl",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:GetObjectVersion",
                "s3:GetBucketOwnershipControls",
                "s3:PutBucketOwnershipControls",
                "s3:GetObjectLegalHold",
                "s3:GetObjectRetention",
                "s3:GetBucketObjectLockConfiguration"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket1-*",
                "arn:aws:s3:::amzn-s3-demo-bucket2-*/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:List*AccessPoint*",
                "s3:GetMultiRegion*"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "iam:Get*",
                "iam:CreateServiceLinkedRole",
                "iam:CreateRole",
                "iam:PassRole"
            ],
            "Resource": "arn:aws:iam::*:role/service-role/s3*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "iam:List*"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "iam:AttachRolePolicy",
                "iam:PutRolePolicy",
                "iam:CreatePolicy"
              ],
            "Resource": [
                "arn:aws:iam::*:policy/service-role/s3*",
                "arn:aws:iam::*:role/service-role/s3*"
            ]
        }
    ]
}
```

------

## 步骤 2：创建供 Amazon S3 代入的 IAM 角色
<a name="setting-repl-config-same-acctowner"></a>



默认情况下，所有 Amazon S3 资源（存储桶、对象和相关子资源）都是私有的，只有资源拥有者可以访问相应的资源。Amazon S3 需要权限才能从源存储桶读取和复制对象。您通过创建一个 IAM 角色，并在复制配置中指定该角色，来授予这些权限。

本节解释了附加到此 IAM 角色的信任策略和最低所需权限策略。示例演练提供创建 IAM 角色的分步说明。有关更多信息，请参阅 [配置实时复制的示例](replication-example-walkthroughs.md)。

**注意**  
如果您使用控制台创建复制配置，我们建议您跳过本节，改为让控制台为您创建此 IAM 角色以及必要的信任和权限策略。

*信任策略*确定哪些主体身份可以担任此 IAM 角色。*权限策略*指定 IAM 角色可在什么条件下对哪些资源执行哪些操作。
+ 以下示例显示了一个*信任策略*，您在其中将 Amazon S3 标识为可担任此角色的 AWS 服务主体。

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

****  

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

------
+ 以下示例显示了一个*信任策略*，您在其中将 Amazon S3 和 S3 批量操作标识为可担任此角色的服务主体。如果您正在创建批量复制任务，则使用此方法。有关更多信息，请参阅 [为新的复制规则或目标创建批量复制任务](s3-batch-replication-new-config.md)。

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

****  

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

------

  有关 IAM 角色的更多信息，请参阅《IAM 用户指南》**中的 [IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)。
+ 以下示例显示了*权限策略*，您在其中向 IAM 角色授予代表您执行复制任务的权限。当 Amazon S3 担任角色时，它将具有您在此策略中指定的权限。在此策略中，`amzn-s3-demo-source-bucket` 是源存储桶，`amzn-s3-demo-destination-bucket` 是目标存储桶。

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

****  

  ```
  {
     "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",
              "s3:GetObjectVersionTagging"
           ],
           "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/*"
        }
     ]
  }
  ```

------

  此权限策略授予执行以下操作的权限：
  +  `s3:GetReplicationConfiguration` 和 `s3:ListBucket` – 对 `amzn-s3-demo-source-bucket` 存储桶执行这些操作的权限可让 Amazon S3 检索复制配置和列出存储桶内容。（当前权限模型需要 `s3:ListBucket` 权限来访问删除标记）。
  + `s3:GetObjectVersionForReplication` 和 `s3:GetObjectVersionAcl` – 针对所有对象授予的这些操作的权限允许 Amazon S3 获取特定对象版本和对象关联的访问控制列表 (ACL)。

    
  + `s3:ReplicateObject` 和 `s3:ReplicateDelete` – `amzn-s3-demo-destination-bucket` 存储桶中所有对象上的这些操作的权限允许 Amazon S3 将对象或删除标记复制到目标存储桶。有关删除标记的信息，请参阅 [删除操作对复制操作有何影响](replication-what-is-isnot-replicated.md#replication-delete-op)。
**注意**  
对 `amzn-s3-demo-destination-bucket` 存储桶执行 `s3:ReplicateObject` 操作的权限还支持复制元数据，例如对象标签和 ACL。因此，您无需显式授予执行 `s3:ReplicateTags` 操作的权限。
  + `s3:GetObjectVersionTagging` – 对 `amzn-s3-demo-source-bucket` 存储桶中的对象执行此操作的权限可让 Amazon S3 读取用于复制的对象标签。有关对象标签的更多信息，请参阅 [使用标签对对象进行分类](object-tagging.md)。如果 Amazon S3 没有 `s3:GetObjectVersionTagging` 权限，它将复制对象，而不是对象标签。

  有关 Amazon S3 操作的列表，请参阅《Service Authorization Reference》**中的 [Actions, resources, and condition keys for Amazon S3](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazons3.html#list_amazons3-actions-as-permissions)。

  有关按 S3 资源类型对 S3 API 操作的权限的更多信息，请参阅 [Amazon S3 API 操作所需的权限](using-with-s3-policy-actions.md)。
**重要**  
拥有 IAM 角色的 AWS 账户 必须拥有其向 IAM 角色授予的操作的权限。  
例如，假定源存储桶包含由另一个 AWS 账户 拥有的对象。对象的拥有者必须通过对象的访问控制列表（ACL），向拥有 IAM 角色的 AWS 账户显式授予必要的权限。否则，Amazon S3 无法访问这些对象，因而这些对象的复制将失败。有关 ACL 权限的信息，请参阅 [访问控制列表 (ACL) 概述](acl-overview.md)。  
  
此处介绍的权限与最低复制配置相关。如果您选择添加可选复制配置，则必须向 Amazon S3 授予其它权限：  
要复制加密的对象，还需要授予必要的 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)。

## （可选）步骤 3：在源存储桶和目标存储桶由不同的 AWS 账户拥有时授予权限
<a name="setting-repl-config-crossacct"></a>

当源存储桶和目标存储桶不是由相同的账户拥有时，目标存储桶的拥有者还必须添加一个存储桶策略，来向源存储桶的拥有者授予执行复制操作的权限，如下面的示例所示。在此示例策略中，`amzn-s3-demo-destination-bucket` 是目标存储桶。

还可以使用 Amazon S3 控制台来自动为您生成此存储桶策略。有关更多信息，请参阅[启用从源存储桶接收复制的对象](#receiving-replicated-objects)。

**注意**  
角色的 ARN 格式可能看起来不同。如果使用控制台创建角色，则 ARN 格式为 `arn:aws:iam::account-ID:role/service-role/role-name`。如果使用 AWS CLI 创建角色，则 ARN 格式为 `arn:aws:iam::account-ID:role/role-name`。有关更多信息，请参阅 *IAM 用户指南*中的 [IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html)。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Id": "PolicyForDestinationBucket",
    "Statement": [
        {
            "Sid": "Permissions on objects",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:role/service-role/source-account-IAM-role"
            },
            "Action": [
                "s3:ReplicateDelete",
                "s3:ReplicateObject"
            ],
            "Resource": "arn:aws:s3:::amzn-s3-demo-destination-bucket/*"
        },
        {
            "Sid": "Permissions on bucket",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:role/service-role/source-account-IAM-role"
            },
            "Action": [
                "s3:List*",
                "s3:GetBucketVersioning",
                "s3:PutBucketVersioning"
            ],
            "Resource": "arn:aws:s3:::amzn-s3-demo-destination-bucket"
        }
    ]
}
```

------

有关示例，请参阅[针对不同账户中的存储桶配置复制](replication-walkthrough-2.md)。

如果向源存储桶中的对象添加标签，请注意以下事项：
+ 如果源存储桶拥有者向 Amazon S3 授予 `s3:GetObjectVersionTagging` 和 `s3:ReplicateTags` 操作的权限来复制对象标签（通过 IAM 角色），则 Amazon S3 将复制标签以及对象。有关 IAM 角色的信息，请参阅 [步骤 2：创建供 Amazon S3 代入的 IAM 角色](#setting-repl-config-same-acctowner)。
+ 如果目标存储桶的所有者不希望复制标签，则他们可以向目标存储桶策略添加以下语句来显式拒绝 `s3:ReplicateTags` 操作的权限。在此策略中，`amzn-s3-demo-destination-bucket` 是目标存储桶。

  ```
  ...
     "Statement":[
        {
           "Effect":"Deny",
           "Principal":{
              "AWS":"arn:aws:iam::source-bucket-account-id:role/service-role/source-account-IAM-role"
           },
           "Action":"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)。

**启用从源存储桶接收复制的对象**  
您可以快速生成所需的策略，以便启用通过 Amazon S3 控制台从源存储桶接收复制的对象，而不是手动将上述策略添加到目标存储桶中。

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

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

1. 在**存储桶**列表中，选择要用作目标存储桶的存储桶。

1. 选择 **Management**（管理）选项卡，然后向下滚动到 **Replication rules**（复制规则）。

1. 对于 **Actions**（操作），选择 **Receive replicated objects**（接收复制的对象）。

   按照提示进行操作并输入源存储桶账户的 AWS 账户 ID，然后选择**生成策略**。控制台将生成 Amazon S3 存储桶策略和 KMS 密钥策略。

1. 要将此策略添加到现有存储桶策略中，请选择 **Apply settings**（应用设置），或者选择 **Copy**（复制）以手动复制更改。

1. （可选）在 AWS Key Management Service 控制台中将 AWS KMS 策略复制到所需的 KMS 密钥策略。

## （可选）步骤 4：授予更改副本所有权的权限
<a name="change-replica-ownership"></a>

当源存储桶和目标存储桶由不同的 AWS 账户 拥有时，您可以指示 Amazon S3 将副本的所有权更改为拥有目标存储桶的 AWS 账户。要覆盖副本的所有权，您必须授予一些额外的权限或调整目标存储桶的 S3 对象所有权设置。有关拥有者覆盖的更多信息，请参阅[更改副本拥有者](replication-change-owner.md)。

# 配置实时复制的示例
<a name="replication-example-walkthroughs"></a>

以下各示例提供的分步演练介绍了如何为常见使用案例配置实时复制。

**注意**  
实时复制指同区域复制 (SRR) 和跨区域复制 (CRR)。实时复制不会复制在设置复制之前就存在于存储桶中的任何对象。想要复制在设置复制之前就存在的对象，请使用按需复制。要同步存储桶和按需复制现有对象，请参阅[复制现有对象](s3-batch-replication-batch.md)。

这些示例演示了如何使用 Amazon S3 控制台、AWS Command Line Interface（AWS CLI）和 AWS SDK（展示了适用于 Java 的 AWS SDK 和适用于 .NET 的 AWS SDK 示例）创建复制配置。

有关安装和配置 AWS CLI 的信息，请参阅《AWS Command Line Interface 用户指南》**中的以下主题：
+  [开始使用 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html) 
+  [Configure the AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html) – 必须设置至少一个配置文件。如果要探讨跨账户方案，请设置两个配置文件。

有关 AWS SDK 的更多信息，请参阅[适用于 Java 的 AWS SDK](https://aws.amazon.com/sdk-for-java/) 和[适用于 .NET 的 AWS SDK](https://aws.amazon.com/sdk-for-net/)。

**提示**  
有关演示如何使用实时复制来复制数据的分步教程，请参阅[教程：使用 S3 复制在 AWS 区域内和区域之间复制数据](https://aws.amazon.com/getting-started/hands-on/replicate-data-using-amazon-s3-replication/?ref=docs_gateway/amazons3/replication-example-walkthroughs.html)。

**Topics**
+ [针对同一账户中的存储桶进行配置](replication-walkthrough1.md)
+ [针对不同账户中的存储桶进行配置](replication-walkthrough-2.md)
+ [使用 S3 Replication Time Control](replication-time-control.md)
+ [复制加密对象](replication-config-for-kms-objects.md)
+ [复制元数据更改](replication-for-metadata-changes.md)
+ [复制删除标记](delete-marker-replication.md)

# 针对同一账户中的存储桶配置复制
<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);
            }
        }
    }
}
```

------

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

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

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

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

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

当源存储桶和目标存储桶由不同 AWS 账户拥有时设置实时复制的过程，与这两个存储桶由相同账户拥有时设置复制的过程类似。但是，当您在跨账户场景中配置复制时，会有一些区别：
+ 目标存储桶拥有者必须在目标存储桶策略中，向源存储桶拥有者授予复制对象的权限。
+ 如果在跨账户场景中，您要复制的对象使用了具有 AWS Key Management Service（AWS KMS）密钥的服务器端加密（SSE-KMS）进行加密，则 KMS 密钥的拥有者必须向源存储桶拥有者授予使用 KMS 密钥的权限。有关更多信息，请参阅 [为跨账户方案授予其他权限](replication-config-for-kms-objects.md#replication-kms-cross-acct-scenario)。
+ 默认情况下，复制的对象归源存储桶拥有者所有。在跨账户场景中，您可能希望配置复制，来将复制对象的所有权更改为目标存储桶的拥有者。有关更多信息，请参阅 [更改副本拥有者](replication-change-owner.md)。

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

1. 在此示例中，您将在两个不同的 AWS 账户中创建源存储桶和目标存储桶。您必须为 AWS CLI 设置两个凭证配置文件。此示例使用 `acctA` 和 `acctB` 作为这些配置文件名称。有关设置凭证配置文件和使用命名配置文件的信息，请参阅《AWS Command Line Interface 用户指南》**中的 [Configuration and credential file settings](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html)。

1. 按照 [针对同一账户中的存储桶配置复制](replication-walkthrough1.md) 中的分步说明操作，进行以下更改：
   + 对于与源存储桶活动相关的所有 AWS CLI 命令（例如，创建源存储桶、启用版本控制和创建 IAM 角色），请使用 `acctA` 配置文件。使用 `acctB` 配置文件创建目标存储桶。
   + 确保 IAM 角色的权限策略指定您为此示例创建的源存储桶和目标存储桶。

1. 在控制台中，在目标存储存储桶上添加以下存储桶策略，以允许源存储存储桶的拥有者复制对象。有关说明，请参阅[使用 Amazon S3 控制台添加存储桶策略](add-bucket-policy.md)。请务必编辑该策略，即提供源存储桶拥有者的 AWS 账户 ID、IAM 角色名称和目标存储桶名称。
**注意**  
要使用以下示例，请将 `user input placeholders` 替换为您自己的信息。将 `amzn-s3-demo-destination-bucket` 替换为目标存储桶名称。将 IAM Amazon 资源名称（ARN）中的 `source-bucket-account-ID:role/service-role/source-account-IAM-role` 替换为您用于此复制配置的 IAM 角色。  
如果您手动创建了 IAM 服务角色，请将 IAM ARN 中的角色路径设置为 `role/service-role/`，如以下策略示例所示。有关更多信息，请参阅 *IAM 用户指南*中的 [IAM ARN](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html#identifiers-arns)。

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Id": "",
       "Statement": [
           {
               "Sid": "Set-permissions-for-objects",
               "Effect": "Allow",
               "Principal": {
                   "AWS": "arn:aws:iam::111122223333:role/service-role/source-account-IAM-role"
               },
               "Action": [
                   "s3:ReplicateObject",
                   "s3:ReplicateDelete"
               ],
               "Resource": "arn:aws:s3:::amzn-s3-demo-destination-bucket/*"
           },
           {
               "Sid": "Set-permissions-on-bucket",
               "Effect": "Allow",
               "Principal": {
                   "AWS": "arn:aws:iam::111122223333:role/service-role/source-account-IAM-role"
               },
               "Action": [
                   "s3:GetBucketVersioning",
                   "s3:PutBucketVersioning"
               ],
               "Resource": "arn:aws:s3:::amzn-s3-demo-destination-bucket"
           }
       ]
   }
   ```

------

1. （可选）如果您要复制的对象使用了 SSE-KMS 进行加密，则 KMS 密钥的拥有者必须向源存储桶拥有者授予使用 KMS 密钥的权限。有关更多信息，请参阅 [为跨账户方案授予其他权限](replication-config-for-kms-objects.md#replication-kms-cross-acct-scenario)。

1. （可选）在复制中，默认情况下，源对象的拥有者拥有副本。当源存储桶和目标存储桶由不同的 AWS 账户拥有时，您可以添加可选的配置设置，来将副本所有权更改为拥有目标存储桶的 AWS 账户。这包括授予 `ObjectOwnerOverrideToBucketOwner` 权限。有关更多信息，请参阅 [更改副本拥有者](replication-change-owner.md)。

# 更改副本拥有者
<a name="replication-change-owner"></a>

在复制中，默认情况下，源对象的拥有者也拥有副本。但是，当源存储桶和目标存储桶由不同的 AWS 账户拥有时，您可能想要更改副本所有权。例如，您可能想要更改所有权，来限制对于对象副本的访问权限。在复制配置中，可以添加可选的配置设置，来将副本所有权更改为拥有目标存储桶的 AWS 账户。

要更改副本拥有者，请执行以下操作：
+ 将*拥有者覆盖* 选项添加到复制配置，来指示 Amazon S3 更改副本所有权。
+ 向 Amazon S3 授予更改副本所有权的 `s3:ObjectOwnerOverrideToBucketOwner` 权限。
+ 在目标存储桶策略中添加支持更改副本所有权的 `s3:ObjectOwnerOverrideToBucketOwner` 权限。`s3:ObjectOwnerOverrideToBucketOwner` 权限可让目标存储桶的拥有者接受对象副本的所有权。

有关更多信息，请参阅[所有权覆盖选项的注意事项](#repl-ownership-considerations)和[向复制配置添加拥有者覆盖选项](#repl-ownership-owneroverride-option)。有关带分步说明的有效示例，请参阅[如何更改副本拥有者](#replication-walkthrough-3)。

**重要**  
您可以为对象所有权使用“强制存储桶拥有者”设置，而不是使用拥有者覆盖选项。当您使用复制且源存储桶和目标存储桶由不同的 AWS 账户拥有时，目标存储桶的存储桶拥有者可以为对象所有权使用“强制存储桶拥有者”设置，来将副本所有权更改为拥有目标存储桶的 AWS 账户。此设置将禁用对象访问控制列表（ACL)。  
“强制存储桶拥有者”设置模拟现有的拥有者覆盖行为，而无需 `s3:ObjectOwnerOverrideToBucketOwner` 权限。在桶拥有者强制设置的情况下已复制到目标桶的所有对象都归目标桶拥有者所有。有关对象所有权的更多信息，请参阅[为您的存储桶控制对象所有权和禁用 ACL。](about-object-ownership.md)。

## 所有权覆盖选项的注意事项
<a name="repl-ownership-considerations"></a>

当您配置所有权覆盖选项时，请注意以下几点：
+ 默认情况下，源对象的拥有者也拥有副本。Amazon S3 复制对象版本及其关联的 ACL。

  如果您向复制配置中添加拥有者覆盖选项，Amazon S3 将仅复制对象版本，而不复制 ACL。此外，Amazon S3 不会复制对源对象 ACL 的任何后续更改。Amazon S3 在副本上设置 ACL，将完全控制权限授予目标存储桶拥有者。
+  当您更新复制配置来启用或禁用拥有者覆盖时，会发生以下行为：
  + 如果向复制配置添加拥有者覆盖选项：

    当 Amazon S3 复制对象版本时，它会放弃与源对象关联的 ACL。而是 Amazon S3 改为在副本上设置 ACL，将完全控制权限授予目标存储桶的拥有者。Amazon S3 不会复制对源对象 ACL 的任何后续更改。但是，此 ACL 更改不会应用于设置拥有者覆盖选项之前已复制的对象版本。设置拥有者覆盖之前所复制的源对象 ACL 上的任何更新仍将继续复制（因为对象及其副本继续具有相同的拥有者）。
  + 如果从复制配置中删除拥有者覆盖选项：

    Amazon S3 将源存储桶中出现的新对象及其关联的 ACL 复制到目标存储桶。对于删除拥有者覆盖之前已复制的对象，Amazon S3 不会复制其 ACL，因为 Amazon S3 进行的对象所有权更改仍保持有效。也就是说，对于在您设置了拥有者覆盖的情况下所复制的对象版本上的 ACL，接下来不会进行复制。

## 向复制配置添加拥有者覆盖选项
<a name="repl-ownership-owneroverride-option"></a>

**警告**  
仅在源存储桶和目标存储桶由不同 AWS 账户拥有时添加拥有者覆盖选项。Amazon S3 不会检查存储桶由相同账户还是不同账户拥有。如果您在两个存储桶均由同一 AWS 账户拥有时添加拥有者覆盖，Amazon S3 会应用拥有者覆盖。此选项向目标存储桶的拥有者授予完全权限，并且不会将后续更新复制到源对象的访问控制列表（ACL）。副本拥有者可以使用 `PutObjectAcl` 请求直接更改与副本关联的 ACL，但不能通过复制进行更改。

要指定拥有者覆盖选项，请向每个 `Destination` 元素添加以下元素：
+ `AccessControlTranslation` 元素，指示 Amazon S3 更改副本所有权
+ `Account` 元素，指定目标存储桶拥有者的 AWS 账户 

```
<ReplicationConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    ...
    <Destination>
      ...
      <AccessControlTranslation>
           <Owner>Destination</Owner>
       </AccessControlTranslation>
      <Account>destination-bucket-owner-account-id</Account>
    </Destination>
  </Rule>
</ReplicationConfiguration>
```

以下复制配置示例指示 Amazon S3 将键前缀为 *`Tax`* 的对象复制到 `amzn-s3-demo-destination-bucket` 目标存储桶，并更改副本的所有权。要使用此示例，请将 `user input placeholders` 替换为您自己的信息。

```
<?xml version="1.0" encoding="UTF-8"?>
<ReplicationConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
   <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>
         <Account>destination-bucket-owner-account-id</Account>
         <AccessControlTranslation>
            <Owner>Destination</Owner>
         </AccessControlTranslation>
      </Destination>
   </Rule>
</ReplicationConfiguration>
```

## 向 Amazon S3 授予更改副本所有权的权限
<a name="repl-ownership-add-role-permission"></a>

通过在与 AWS Identity and Access Management（IAM）角色关联的权限策略中添加 `s3:ObjectOwnerOverrideToBucketOwner` 操作的权限，可向 Amazon S3 授予更改副本所有权的权限。此角色是在复制配置中指定的 IAM 角色，可让 Amazon S3 担任该角色并代表您复制对象。要使用以下示例，请将 `amzn-s3-demo-destination-bucket` 替换为目标存储桶的名称。

```
...
{
    "Effect":"Allow",
         "Action":[
       "s3:ObjectOwnerOverrideToBucketOwner"
    ],
    "Resource":"arn:aws:s3:::amzn-s3-demo-destination-bucket/*"
}
...
```

## 在目标存储桶策略中添加允许更改副本所有权的权限
<a name="repl-ownership-accept-ownership-b-policy"></a>

目标存储桶的拥有者必须向源存储桶的拥有者授予更改副本所有权的权限。目标存储桶的拥有者向源存储桶的拥有者授予 `s3:ObjectOwnerOverrideToBucketOwner` 操作的权限。此权限可让目标存储桶拥有者接受对象副本的所有权。以下示例存储桶策略语句说明如何执行此操作。要使用此示例，请将 `user input placeholders` 替换为您自己的信息。

```
...
{
    "Sid":"1",
    "Effect":"Allow",
    "Principal":{"AWS":"source-bucket-account-id"},
    "Action":["s3:ObjectOwnerOverrideToBucketOwner"],
    "Resource":"arn:aws:s3:::amzn-s3-demo-destination-bucket/*"
}
...
```

## 如何更改副本拥有者
<a name="replication-walkthrough-3"></a>

当复制配置中的源存储桶和目标存储桶由不同的 AWS 账户拥有时，可以指示 Amazon S3 将副本所有权更改为拥有目标存储桶的 AWS 账户。以下示例显示如何使用 Amazon S3 控制台、AWS Command Line Interface（AWS CLI）和 AWS SDK 来更改副本所有权。

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

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

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

以下过程介绍如何使用 AWS CLI 更改副本所有权。在此过程中，您将执行以下操作：
+ 创建源存储桶和目标存储桶。
+ 对存储桶启用版本控制。
+ 创建 AWS Identity and Access Management（IAM）角色来向 Amazon S3 授予复制对象的权限。
+ 将复制配置添加到源存储桶。
+ 在复制配置中，指示 Amazon S3 更改副本所有权。
+ 您需要测试复制配置。

**当源存储桶和目标存储桶由不同的 AWS 账户拥有时更改副本所有权（AWS CLI）**

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

1. 在此示例中，您将在两个不同的 AWS 账户中创建源存储桶和目标存储桶。要使用这两个账户，请使用两个命名配置文件配置 AWS CLI。此示例分别使用名为 *`acctA`* 和 *`acctB`* 的配置文件。有关设置凭证配置文件和使用命名配置文件的信息，请参阅《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. 创建源存储桶，并启用版本控制。此示例在美国东部（弗吉尼亚州北部）(`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. 创建一个目标存储桶，并启用版本控制。此示例在美国西部（俄勒冈州）(`us-west-2`) 区域中创建名为 `amzn-s3-demo-destination-bucket` 的目标存储桶。使用的 AWS 账户配置文件应与您用于源存储桶的配置文件不同。

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

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

1. 您必须添加权限到目标存储桶策略以允许更改副本所有权。

   1.  将以下策略保存到名为 `destination-bucket-policy.json` 的文件中。确保将 *`user input placeholders`* 替换为您自己的信息。

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

****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Sid": "destination_bucket_policy_sid",
                  "Principal": {
                      "AWS": "source-bucket-owner-123456789012"
                  },
                  "Action": [
                      "s3:ReplicateObject",
                      "s3:ReplicateDelete",
                      "s3:ObjectOwnerOverrideToBucketOwner",
                      "s3:ReplicateTags",
                      "s3:GetObjectVersionTagging"
                  ],
                  "Effect": "Allow",
                  "Resource": [
                      "arn:aws:s3:::amzn-s3-demo-destination-bucket/*"
                  ]
              }
          ]
      }
      ```

------

   1. 使用以下 `put-bucket-policy` 命令将上述策略添加到目标存储桶：

      ```
      aws s3api put-bucket-policy --region $ {destination-region} --bucket $ {amzn-s3-demo-destination-bucket} --policy file://destination_bucket_policy.json
      ```

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 CLI `create-role` 命令来创建 IAM 角色：

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

         记下您创建的 IAM 角色的 Amazon 资源名称（ARN）。您将在后面的步骤中用到此 ARN。

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

      1. 复制以下权限策略，并将其保存到本地计算机上当前目录中一个名为 `s3-role-perm-pol-changeowner.json` 的文件。此策略授予对各种 Amazon S3 存储桶和对象操作的权限。在下面的步骤中，您将此策略附加到之前创建的 IAM 角色。

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

****  

         ```
         {
            "Version":"2012-10-17",		 	 	 
            "Statement":[
               {
                  "Effect":"Allow",
                  "Action":[
                     "s3:GetObjectVersionForReplication",
                     "s3:GetObjectVersionAcl"
                  ],
                  "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:ObjectOwnerOverrideToBucketOwner",
                     "s3:ReplicateTags",
                     "s3:GetObjectVersionTagging"
                  ],
                  "Resource":"arn:aws:s3:::amzn-s3-demo-destination-bucket/*"
               }
            ]
         }
         ```

------

      1. 要将前面的权限策略附加到该角色，请运行以下 `put-role-policy` 命令：

         ```
         $ aws iam put-role-policy \
         --role-name replicationRole \
         --policy-document file://s3-role-perm-pol-changeowner.json \
         --policy-name replicationRolechangeownerPolicy \
         --profile acctA
         ```

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

   1. AWS CLI 要求以 JSON 形式指定复制配置。将以下 JSON 保存到本地计算机上当前目录中一个名为 `replication.json` 的文件。在配置中，`AccessControlTranslation` 指定副本所有权从源存储桶拥有者更改为目标存储桶拥有者。

      ```
      {
         "Role":"IAM-role-ARN",
         "Rules":[
            {
               "Status":"Enabled",
               "Priority":1,
               "DeleteMarkerReplication":{
                  "Status":"Disabled"
               },
               "Filter":{
               },
               "Status":"Enabled",
               "Destination":{
                  "Bucket":"arn:aws:s3:::amzn-s3-demo-destination-bucket",
                  "Account":"destination-bucket-owner-account-id",
                  "AccessControlTranslation":{
                     "Owner":"Destination"
                  }
               }
            }
         ]
      }
      ```

   1. 编辑 JSON，即提供目标存储桶名称、目标存储桶拥有者账户 ID 和 `IAM-role-ARN` 的值。将 *`IAM-role-ARN`* 替换为您之前创建的 IAM 角色的 ARN。保存更改。

   1. 要向源存储桶添加复制配置，请运行以下命令：

      ```
      $ 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. 将对象添加到源存储桶。验证目标存储桶包含对象副本，并且该副本的所有权已更改为拥有目标存储桶的 AWS 账户。

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

 有关添加复制配置的代码示例，请参阅[使用 AWS SDK](replication-walkthrough1.md#replication-ex1-sdk)。您必须适当地修改复制配置。有关概念性信息，请参阅 [更改副本拥有者](#replication-change-owner)。

# 使用 S3 Replication Time Control 满足合规性要求
<a name="replication-time-control"></a>

S3 Replication Time Control（S3 RTC）可以帮助您满足数据复制的合规性要求或业务要求，并提供对 Amazon S3 复制时间的可见性。S3 RTC 会在几秒钟内复制您上传到 Amazon S3 的大多数对象，并在 15 分钟内复制 99.9% 的对象。

默认情况下，S3 RTC 包括两种跟踪复制进度的方法：
+ **S3 复制指标** – 可以使用 S3 复制指标，来监控待复制的 S3 API 操作的总数、待复制的对象的总大小、到目标区域的最长复制时间以及复制失败的操作总数。然后，您可以监控单独复制的每个数据集。也可以独立于 S3 RTC 启用 S3 复制指标。有关更多信息，请参阅 [使用 S3 复制指标](repl-metrics.md)。

  启用了 S3 Replication Time Control（S3 RTC）的复制规则可发布 S3 复制指标。复制指标在启用 S3 RTC 之后的 15 分钟内可用。复制指标可通过 Amazon S3 控制台、Amazon S3 API、AWS SDK、AWS Command Line Interface（AWS CLI）和 Amazon CloudWatch 提供。有关 CloudWatch 指标的更多信息，请参阅[使用 Amazon CloudWatch 监控指标](cloudwatch-monitoring.md)。有关通过 Amazon S3 控制台查看复制指标的更多信息，请参阅[查看复制指标](repl-metrics.md#viewing-replication-metrics)。

  S3 复制指标的费率与 Amazon CloudWatch 自定义指标费率相同。有关信息，请参阅 [Amazon CloudWatch 定价](https://aws.amazon.com/cloudwatch/pricing/)。
+ **Amazon S3 事件通知** – S3 RTC 提供 `OperationMissedThreshold` 和 `OperationReplicatedAfterThreshold` 事件，如果对象复制超过 15 分钟阈值或在 15 分钟阈值后发生，这些事件会通知存储桶拥有者。借助 S3 RTC，当对象在 15 分钟内未复制（这种情况很罕见）以及当这些对象在 15 分钟阈值之后复制时，Amazon S3 事件通知可以通知您。

  复制事件在启用 S3 RTC 之后的 15 分钟内可用。Amazon S3 事件通知可通过 Amazon SQS、Amazon SNS 或 AWS Lambda 提供。有关更多信息，请参阅 [使用 Amazon S3 事件通知接收复制失败事件](replication-metrics-events.md)。

 

## S3 RTC 的最佳实践和准则
<a name="rtc-best-practices"></a>

在 Amazon S3 中在启用 S3 Replication Time Control（S3 RTC）的情况下复制数据时，请遵循这些最佳实践准则，来为您的工作负载优化复制性能。

**Topics**
+ [Amazon S3 复制和请求速率性能准则](#rtc-request-rate-performance)
+ [估算您的复制请求速率](#estimating-replication-request-rates)
+ [超过 S3 RTC 数据传输速率配额](#exceed-rtc-data-transfer-limits)
+ [AWS KMS 加密对象复制请求速率](#kms-object-replication-request-rates)

### Amazon S3 复制和请求速率性能准则
<a name="rtc-request-rate-performance"></a>

当从 Amazon S3 上传和检索存储时，您的应用程序可以实现每秒数千个事务的请求性能。例如，应用程序在 S3 存储桶中对于每个前缀每秒可实现至少 3500 个 `PUT`/`COPY`/`POST`/`DELETE` 请求或 5500 个 `GET`/`HEAD` 请求，包括 S3 复制代表您发出的请求。对存储桶中的前缀数量没有限制。您可以通过并行读取来增加读取或写入性能。例如，如果您在 S3 存储桶中创建 10 个前缀来并行处理读取，则可以将读取性能扩展到每秒 55000 个读取请求。

Amazon S3 根据高于这些准则的持续请求速率或与 `LIST` 请求并行的持续请求速率自动扩展。尽管 Amazon S3 在内部针对新的请求速率进行优化，但您可能暂时会收到 HTTP 503 请求响应，直至优化完成。随着每秒请求速率增大，或者当您首次启用 S3 RTC 时，可能会发生这种行为。在这些期间，您的复制延迟可能会增加。S3 RTC 服务等级协议 (SLA) 不适用于超出 Amazon S3 每秒请求性能准则的时间段。

在复制数据传输速率超过默认 1 千兆位/秒（Gbps）配额的时间段内，S3 RTC SLA 也不适用。如果您预计复制传输速率超过 1 Gbps，则可以联系 [AWS 支持 中心](https://console.aws.amazon.com/support/home#/)或使用 [Service Quotas](https://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html) 来请求提高复制传输速率配额。

### 估算您的复制请求速率
<a name="estimating-replication-request-rates"></a>

总请求速率（包括 Amazon S3 复制代表您发出的请求）不得超出复制源存储桶和目标存储桶的 Amazon S3 请求速率准则。对于每个已复制的对象，Amazon S3 复制向源存储桶发出最多五个 `GET`/`HEAD` 请求和一个 `PUT` 请求，并向每个目标存储桶发出一个 `PUT` 请求。

例如，如果您预期每秒复制 100 个对象，则 Amazon S3 复制可能会代表您执行额外 100 个 `PUT` 请求，每秒总计向源 S3 存储桶发出 200 个 `PUT` 请求。Amazon S3 复制也可能最多执行 500 个 `GET`/`HEAD` 请求（每个已复制的对象有 5 个 `GET`/`HEAD` 请求）。

**注意**  
每个已复制的对象只会产生一个 `PUT` 请求的费用。有关更多信息，请参阅 [Amazon S3 有关复制的常见问题](https://aws.amazon.com/s3/faqs/#Replication)中的定价信息。

### 超过 S3 RTC 数据传输速率配额
<a name="exceed-rtc-data-transfer-limits"></a>

如果您预期 S3 RTC 数据传输速率会超过默认的 1 Gbps 配额，请联系 [AWS 支持 中心](https://console.aws.amazon.com/support/home#/)或使用 [Service Quotas](https://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html) 来请求提高复制传输速率配额。

### AWS KMS 加密对象复制请求速率
<a name="kms-object-replication-request-rates"></a>

当您复制通过具有 AWS Key Management Service（AWS KMS）密钥的服务器端加密（SSE-KMS）来加密的对象时，每秒 AWS KMS 请求配额适用。因为请求速率超过了每秒请求数的配额，所以 AWS KMS 可能会拒绝其它有效的请求。如果请求受到限制，AWS KMS 将返回 `ThrottlingException` 错误。AWS KMS 请求速率配额适用于您直接发出的请求和 Amazon S3 复制代表您发出的请求。

例如，如果您预期每秒复制 1000 个对象，则可以从 AWS KMS 请求速率配额中减去 2000 个请求。生成的每秒请求速率可用于除复制之外的 AWS KMS 工作负载。您可以使用 [Amazon CloudWatch 中的 AWS KMS 请求指标](https://docs.aws.amazon.com/kms/latest/developerguide/monitoring-cloudwatch.html)来监控AWS 账户的总 AWS KMS 请求速率。

要申请增加每秒 AWS KMS 请求配额，请联系 [AWS 支持 中心](https://console.aws.amazon.com/support/home#/)或使用[服务配额](https://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html)。

## 启用 S3 Replication Time Control
<a name="replication-walkthrough-5"></a>

您可以基于新的或现有的复制规则开始使用 S3 Replication Time Control（S3 RTC）。可以选择将复制规则应用于整个存储桶，或应用于具有特定前缀或标签的对象。启用 S3 RTC 时，也会在复制规则上启用 S3 复制指标。

还可以使用 Amazon S3 控制台、Amazon S3 API、AWS SDK 和 AWS Command Line Interface（AWS CLI）配置 S3 RTC。

**Topics**

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

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

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

要在启用 S3 RTC 的情况下使用 AWS CLI 复制对象，您需要创建存储桶，对存储桶启用版本控制，创建一个 IAM 角色（该角色向 Amazon S3 赋予复制对象的权限），并将复制配置添加到源存储桶。复制配置必须启用了 S3 RTC，如以下示例所示。

有关使用 AWS CLI 设置复制配置的分步说明，请参阅[针对同一账户中的存储桶配置复制](replication-walkthrough1.md)。

以下示例复制配置启用并设置复制规则的 `ReplicationTime` 和 `EventThreshold` 值。启用和设置这些值可以对规则启用 S3 RTC。

```
{
    "Rules": [
        {
            "Status": "Enabled",
            "Filter": {
                "Prefix": "Tax"
            },
            "DeleteMarkerReplication": {
                "Status": "Disabled"
            },
            "Destination": {
                "Bucket": "arn:aws:s3:::amzn-s3-demo-destination-bucket",
                "Metrics": {
                    "Status": "Enabled",
                    "EventThreshold": {
                        "Minutes": 15
                    }
                },
                "ReplicationTime": {
                    "Status": "Enabled",
                    "Time": {
                        "Minutes": 15
                    }
                }
            },
            "Priority": 1
        }
    ],
    "Role": "IAM-Role-ARN"
}
```

**重要**  
 `Metrics:EventThreshold:Minutes` 和 `ReplicationTime:Time:Minutes` 只能将 `15` 作为有效值。

### 使用适用于 Java 的 AWS SDK
<a name="replication-ex5-sdk"></a>

 以下 Java 示例在启用 S3 Replication Time Control（S3 RTC）的情况下添加复制配置。

```
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.model.DeleteMarkerReplication;
import software.amazon.awssdk.services.s3.model.Destination;
import software.amazon.awssdk.services.s3.model.Metrics;
import software.amazon.awssdk.services.s3.model.MetricsStatus;
import software.amazon.awssdk.services.s3.model.PutBucketReplicationRequest;
import software.amazon.awssdk.services.s3.model.ReplicationConfiguration;
import software.amazon.awssdk.services.s3.model.ReplicationRule;
import software.amazon.awssdk.services.s3.model.ReplicationRuleFilter;
import software.amazon.awssdk.services.s3.model.ReplicationTime;
import software.amazon.awssdk.services.s3.model.ReplicationTimeStatus;
import software.amazon.awssdk.services.s3.model.ReplicationTimeValue;

public class Main {

  public static void main(String[] args) {
    S3Client s3 = S3Client.builder()
      .region(Region.US_EAST_1)
      .credentialsProvider(() -> AwsBasicCredentials.create(
          "AWS_ACCESS_KEY_ID",
          "AWS_SECRET_ACCESS_KEY")
      )
      .build();

    ReplicationConfiguration replicationConfig = ReplicationConfiguration
      .builder()
      .rules(
          ReplicationRule
            .builder()
            .status("Enabled")
            .priority(1)
            .deleteMarkerReplication(
                DeleteMarkerReplication
                    .builder()
                    .status("Disabled")
                    .build()
            )
            .destination(
                Destination
                    .builder()
                    .bucket("destination_bucket_arn")
                    .replicationTime(
                        ReplicationTime.builder().time(
                            ReplicationTimeValue.builder().minutes(15).build()
                        ).status(
                            ReplicationTimeStatus.ENABLED
                        ).build()
                    )
                    .metrics(
                        Metrics.builder().eventThreshold(
                            ReplicationTimeValue.builder().minutes(15).build()
                        ).status(
                            MetricsStatus.ENABLED
                        ).build()
                    )
                    .build()
            )
            .filter(
                ReplicationRuleFilter
                    .builder()
                    .prefix("testtest")
                    .build()
            )
        .build())
        .role("role_arn")
        .build();

    // Put replication configuration
    PutBucketReplicationRequest putBucketReplicationRequest = PutBucketReplicationRequest
      .builder()
      .bucket("source_bucket")
      .replicationConfiguration(replicationConfig)
      .build();

    s3.putBucketReplication(putBucketReplicationRequest);
  }
}
```

# 复制加密对象（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)。您必须适当地修改复制配置。

 

# 使用副本修改同步复制元数据更改
<a name="replication-for-metadata-changes"></a>

Amazon S3 副本修改同步可以协助您保留在副本和源对象之间复制的对象元数据，例如标签、访问控制列表（ACL）和对象锁定设置。默认情况下，Amazon S3 仅会从源对象向副本复制元数据。启用副本修改同步后，Amazon S3 会将对副本所做的元数据更改复制回源对象，使复制成为双向复制。

## 启用副本修改同步
<a name="enabling-replication-for-metadata-changes"></a>

您可以将 Amazon S3 副本修改同步与新的或现有的复制规则一起使用。可以将它应用于整个存储桶或具有特定前缀的对象。

要使用 Amazon S3 控制台启用副本修改同步，请参阅[配置实时复制的示例](replication-example-walkthroughs.md)。本主题提供了在源存储桶和目标存储桶由相同或不同的 AWS 账户拥有时，在复制配置中启用副本修改同步的说明。

要使用 AWS Command Line Interface（AWS CLI）启用副本修改同步，必须向包含已启用 `ReplicaModifications` 的副本的存储桶添加复制配置。要设置双向复制，请创建从源存储桶 (`amzn-s3-demo-source-bucket`) 到包含副本的存储桶 (`amzn-s3-demo-destination-bucket`) 的复制规则。然后，创建从包含副本的存储桶 (`amzn-s3-demo-destination-bucket`) 到源存储桶 (`amzn-s3-demo-source-bucket`) 的第二条复制规则。源存储桶和目标存储桶可以位于相同或不同的 AWS 区域中。

**注意**  
必须同时在源存储桶和目标存储桶上启用副本修改同步，才能复制副本元数据更改，例如已复制对象上的对象访问控制列表（ACL）、对象标签或对象锁定设置。与所有复制规则一样，可以将这些规则应用于整个存储桶，也可以应用于按前缀或对象标签筛选的对象子集。

在以下示例配置中，Amazon S3 将以 `Tax` 为前缀的元数据更改复制到存储桶 `amzn-s3-demo-source-bucket`，该存储桶包含源对象。

```
{
    "Rules": [
        {
            "Status": "Enabled",
            "Filter": {
                "Prefix": "Tax"
            },
            "SourceSelectionCriteria": {
                "ReplicaModifications":{
                    "Status": "Enabled"
                }
            },
            "Destination": {
                "Bucket": "arn:aws:s3:::amzn-s3-demo-source-bucket"
            },
            "Priority": 1
        }
    ],
    "Role": "IAM-Role-ARN"
}
```

有关使用 AWS CLI 创建复制规则的完整说明，请参阅[针对同一账户中的存储桶配置复制](replication-walkthrough1.md)。

# 在存储桶之间复制删除标记
<a name="delete-marker-replication"></a>

默认情况下，当启用 S3 复制且源存储桶中的对象被删除时，Amazon S3 仅在源存储桶中添加删除标记。此操作有助于保护目标存储桶中的数据免遭意外删除或恶意删除。如果您启用了*删除标记复制*，则这些标记将复制到目标存储桶，Amazon S3 的行为就像对象在源存储桶和目标存储桶中都被删除了一样。有关删除标记工作原理的更多信息，请参阅[使用删除标记](DeleteMarker.md)。

**注意**  
基于标签的复制规则不支持删除标记复制。删除标记复制也不符合您使用 S3 Replication Time Control（S3 RTC）时授予的 15 分钟服务水平协议（SLA）。
如果您没在使用最新的复制配置 XML 版本，则删除操作会对复制产生不同的影响。有关更多信息，请参阅 [删除操作对复制操作有何影响](replication-what-is-isnot-replicated.md#replication-delete-op)。
如果您启用删除标记复制，并且源存储桶具有 S3 生命周期到期规则，则 S3 生命周期到期规则添加的删除标记将不会复制到目标存储桶。

## 启用删除标记复制
<a name="enabling-delete-marker-replication"></a>

您可以开始将删除标记复制与新的或现有的复制规则结合使用。可以将删除标记复制应用于整个存储桶或具有特定前缀的对象。

要使用 Amazon S3 控制台启用删除标记复制，请参阅[使用 S3 控制台](replication-walkthrough1.md#enable-replication)。本主题提供了在源存储桶和目标存储桶由相同或不同的 AWS 账户拥有时，在复制配置中启用删除标记复制的说明。

要使用 AWS Command Line Interface（AWS CLI）启用删除标记复制，必须向已启用 `DeleteMarkerReplication` 的源存储桶添加复制配置，如下面的示例配置所示。

在以下示例复制配置中，对于以 `Tax` 为前缀的对象，删除标记将复制到目标存储桶 `amzn-s3-demo-destination-bucket`。

```
{
    "Rules": [
        {
            "Status": "Enabled",
            "Filter": {
                "Prefix": "Tax"
            },
            "DeleteMarkerReplication": {
                "Status": "Enabled"
            },
            "Destination": {
                "Bucket": "arn:aws:s3:::amzn-s3-demo-destination-bucket"
            },
            "Priority": 1
        }
    ],
    "Role": "IAM-Role-ARN"
}
```

有关通过 AWS CLI 创建复制规则的完整说明，请参阅[针对同一账户中的存储桶配置复制](replication-walkthrough1.md)。