

# 在区域内和跨区域复制对象
<a name="replication"></a>

您可以使用复制来启用跨 Amazon S3 存储桶自动以异步方式复制对象。为对象复制配置的存储桶可由相同 AWS 账户 或不同账户拥有。您可以将对象复制到单个目标存储桶或多个目标存储桶。目标存储桶可以位于不同的 AWS 区域，也可以与源存储桶位于同一区域内。

复制有两种类型：*实时复制* 和*按需复制*。
+ **实时复制**：想要在向源存储桶写入新的和更新的对象的同时，**自动复制这些对象**，请使用实时复制。实时复制不会复制在设置复制之前就存在于存储桶中的任何对象。想要复制在设置复制之前就存在的对象，请使用按需复制。
+ **按需复制**：想要按需从源存储桶中**复制现有对象**到一个或多个目标存储桶，请使用 S3 批量复制。有关复制现有对象的更多信息，请参阅 [何时使用 S3 分批复制](#batch-replication-scenario)。

实时复制有两种形式：*跨区域复制（CRR）*和*同区域复制（SRR）*。
+ **跨区域复制（CRR）**：可以使用 CRR 跨不同 AWS 区域中的 S3 存储桶复制对象。有关 CRR 的更多信息，请参阅[何时使用跨区域复制](#crr-scenario)。
+ **同区域复制（SRR）**– 可以使用 SRR 跨同一 AWS 区域中的 Amazon S3 存储桶复制对象。有关 SRR 的更多信息，请参阅[何时使用同区域复制](#srr-scenario)。

**Topics**
+ [

## 为什么使用复制？
](#replication-scenario)
+ [

## 何时使用跨区域复制
](#crr-scenario)
+ [

## 何时使用同区域复制
](#srr-scenario)
+ [

## 何时使用双向复制
](#two-way-replication-scenario)
+ [

## 何时使用 S3 分批复制
](#batch-replication-scenario)
+ [

## 工作负载要求和实时复制
](#replication-workload-requirements)
+ [

# Amazon S3 复制什么内容？
](replication-what-is-isnot-replicated.md)
+ [

# 复制的要求和注意事项
](replication-requirements.md)
+ [

# 设置实时复制概述
](replication-how-setup.md)
+ [

# 管理或暂停实时复制
](disable-replication.md)
+ [

# 使用批量复制以复制现有对象
](s3-batch-replication-batch.md)
+ [

# 对复制进行问题排查
](replication-troubleshoot.md)
+ [

# 使用指标、事件通知和状态监控复制
](replication-metrics.md)

## 为什么使用复制？
<a name="replication-scenario"></a>

复制可帮助您实现以下功能：
+ **复制对象，同时保留元数据** – 您可以使用复制来制作对象的副本，并保留所有元数据（例如原始对象创建时间和版本 ID）。如果您必须确保副本与源对象完全相同，则此功能非常重要。
+ **将对象复制到不同的存储类** – 您可以使用复制直接将对象置于目标存储桶中的 S3 Glacier Flexible Retrieval、S3 Glacier Deep Archive 或其他存储类中。您还可以将数据复制到相同的存储类，并在目标存储桶上使用生命周期配置，以在对象老化时将其移动到较冷的存储类。
+ **在不同的所有权下维护对象副本** – 无论谁拥有源对象，您都可以指示 Amazon S3 将副本的所有权更改为拥有目标存储桶的 AWS 账户。这称为*拥有者覆盖* 选项。您可以使用此选项来要限制对对象副本的访问权限。
+ **将对象存储在多个 AWS 区域** – 要确保数据保存位置的地理差异，您可以在不同的 AWS 区域 中设置多个目标存储桶。此功能可能会帮助您满足某些合规性要求。
+ **在 15 分钟内复制对象** – 要在可预测的时间范围内在同一 AWS 区域 或跨不同区域复制您的数据，您可以使用 S3 Replication Time Control（S3 RTC）。S3 RTC 在 15 分钟内复制 Amazon S3 中存储的 99.99% 的新对象（由服务等级协议提供支持）。有关更多信息，请参阅 [使用 S3 Replication Time Control 满足合规性要求](replication-time-control.md)。
**注意**  
S3 RTC 不适用于分批复制。分批复制是一项按需复制任务，可以使用 S3 批量操作进行跟踪。有关更多信息，请参阅 [跟踪任务状态和完成报告](batch-ops-job-status.md)。
+ **同步存储桶、复制现有对象以及之前无法复制或已复制的对象** – 要同步存储桶和复制现有对象，请使用分批复制作为按需复制操作。有关何时使用分批复制的更多信息，请参阅 [何时使用 S3 分批复制](#batch-replication-scenario)。
+ **复制对象并失效转移到另一个 AWS 区域中的存储桶** - 要在数据复制期间使所有元数据和对象在存储桶之间保持同步，请在配置 Amazon S3 多区域接入点失效转移控制之前使用双向复制规则。双向复制规则有助于确保在将数据写入流量失效转移到的 S3 存储桶时，该数据随后被复制回源存储桶。

## 何时使用跨区域复制
<a name="crr-scenario"></a>

S3 跨区域复制（CRR）用于在不同 AWS 区域中跨 Amazon S3 存储桶复制对象。CRR 可帮助您：
+ **满足合规性要求** – 虽然 Amazon S3 默认跨多个地理位置较远的可用区存储数据，但是合规性要求所规定的数据存储距离可能更远。为满足这些要求，可以使用跨区域复制在远距离 AWS 区域 之间复制数据。
+ **最大限度减少延迟** – 如果客户处于两个地理位置，您可以在地理位置与用户较近的AWS 区域中维护对象副本，从而最大限度缩短访问对象时的延迟。
+ **提高操作效率** – 如果您在两个不同 AWS 区域 中具有分析同一组对象的计算集群，则可以选择在这些区域中维护对象副本。

## 何时使用同区域复制
<a name="srr-scenario"></a>

同区域复制（SRR）用于在同一 AWS 区域中跨 Amazon S3 存储桶复制对象。SRR 可帮助您：
+ **将日志聚合到单个存储桶** – 如果您在多个存储桶中或者跨多个账户存储日志，则可以轻松地将日志复制到区域中的单个存储桶。这样做实现了在单个位置更简单地处理日志。
+ **在生产账户和测试账户之间配置实时复制** – 如果您或您的客户有使用相同数据的生产账户和测试账户，您可以在那些账户之间复制对象，同时保留对象元数据。
+ **遵守数据主权法律** – 您可能需要将数据的多个副本存储在特定区域内的单独 AWS 账户 中。当合规性法规不允许数据离开您的国家/地区时，同区域复制可帮助您自动复制关键数据。

## 何时使用双向复制
<a name="two-way-replication-scenario"></a>
+ **跨多个 AWS 区域构建共享数据集** – 通过副本修改同步功能，您可以轻松地对于复制对象复制元数据更改，例如对象访问控制列表（ACL)、对象标签或对象锁定。如果要使所有对象和对象元数据更改保持同步，这种双向复制非常重要。在相同或不同 AWS 区域中的两个或更多存储桶之间执行双向复制时，您可以对新的或现有的复制规则[启用副本修改同步](https://docs.aws.amazon.com/AmazonS3/latest/userguide/replication-for-metadata-changes.html#enabling-replication-for-metadata-changes)。
+ **在失效转移期间跨区域保持数据同步** – 您可以直接从多区域接入点通过 S3 跨区域复制（CRR）配置双向复制规则，在 AWS 区域中的存储桶之间同步数据。要就何时启动失效转移做出明智的决定，您还可以启用 S3 复制指标，以便监控 Amazon CloudWatch、S3 Replication Time Control（S3 RTC）或多区域接入点中的复制。
+ **使应用程序具有高可用性** - 即使在区域流量中断的情况下，您也可以使用双向复制规则在数据复制期间跨存储桶保持所有元数据和对象同步。

## 何时使用 S3 分批复制
<a name="batch-replication-scenario"></a>

作为按需选项，分批复制将现有对象复制到不同的存储桶。与实时复制不同，这些任务可以根据需要运行。分批复制可帮助您实现以下功能：
+ **复制现有对象** – 您可以使用分批复制来复制在配置同区域复制或跨区域复制之前添加到存储桶中的对象。
+ **复制之前无法复制的对象** – 您可以筛选分批复制任务以尝试复制状态为 **FAILED** 的对象。
+ **复制已经复制的对象** – 您可能需要将数据的多个副本存储在单独的 AWS 账户 或 AWS 区域 中。分批复制可以将现有对象复制到新添加的目标。
+ **复制根据复制规则创建的对象的副本** – 复制配置在目标存储桶中创建对象的副本。对象的副本只能通过分批复制进行复制。

## 工作负载要求和实时复制
<a name="replication-workload-requirements"></a>

根据工作负载要求，某些类型的实时复制将比其它类型的复制更适合您的应用场景。使用下表来确定针对您的场景应该使用哪种类型的复制，以及是否需要对您的工作负载使用 S3 Replication Time Control（S3 RTC）。S3 RTC 在 15 分钟内复制 Amazon S3 中存储的 99.99% 的新对象 [由服务等级协议（SLA）提供支持]。有关更多信息，请参阅 [使用 S3 Replication Time Control 满足合规性要求](replication-time-control.md)。


| 工作负载要求 | S3 RTC（15 分钟 SLA） | 跨区域复制 (CRR) | 同区域复制（SRR） | 
| --- | --- | --- | --- | 
| 在不同 AWS 账户之间复制对象 | 支持 | 是 | 是 | 
| 在 24-48 小时内，在同一 AWS 区域中复制对象（不受 SLA 支持） | 否 | 否 | 是 | 
| 在 24-48 小时内，在不同 AWS 区域之间复制对象（不受 SLA 支持） | 否 | 是 | 否 | 
|  可预测的复制时间：由 SLA 提供支持，可在 15 分钟内复制 99.9% 的对象  | 是 | 否 | 否 | 

# Amazon S3 复制什么内容？
<a name="replication-what-is-isnot-replicated"></a>

Amazon S3 仅复制为复制配置的存储桶中的特定项目。

**Topics**
+ [

## 使用复制配置会复制什么？
](#replication-what-is-replicated)
+ [

## 使用复制配置不会复制什么？
](#replication-what-is-not-replicated)

## 使用复制配置会复制什么？
<a name="replication-what-is-replicated"></a>

默认情况下，Amazon S3 会复制以下内容：
+ 添加复制配置之后创建的对象。
+ 未加密的对象。
+ 使用客户提供密钥（SSE-C）加密的对象，使用 Amazon S3 托管密钥（SSE-S3）或存储在 AWS Key Management Service 中的 KMS 密钥（SSE-KMS）静态加密的对象。有关更多信息，请参阅 [复制加密对象（SSE-S3、SSE-KMS、DSSE-KMS、SSE-C）](replication-config-for-kms-objects.md)。
+ 从源对象到副本的对象元数据。有关将元数据从副本复制到源对象的信息，请参阅 [使用副本修改同步复制元数据更改](replication-for-metadata-changes.md)。
+ 仅限存储桶拥有者有权读取其对象和访问控制列表（ACL）的源存储存储桶中的对象。

  有关资源所有权的更多信息，请参阅 [Amazon S3 存储桶和对象所有权](access-policy-language-overview.md#about-resource-owner)。
+ 对象 ACL 更新（但源存储桶和目标存储桶不是由相同账户拥有时指示 Amazon S3 更改副本所有权的情况除外）。

  有关更多信息，请参阅 [更改副本拥有者](replication-change-owner.md)。

  在 Amazon S3 能够使两个 ACL 同步之前，可能需要花一些时间。这一所有权变更仅适用于在向存储桶添加复制配置之后创建的对象。
+  对象标签（如果有）。
+ S3 对象锁定保留信息（如果有）。

  如果 Amazon S3 复制应用了保留信息的对象，它会将相同的保留控制功能应用于您的副本，从而替换在目标存储桶上配置的默认保留期。如果未对您源存储桶中的对象应用保留控制功能，并且您复制到设置了默认保留期的目标存储桶，则目标存储桶的默认保留期将应用于对象副本。有关更多信息，请参阅 [使用对象锁定以锁定对象](object-lock.md)。

### 删除操作对复制操作有何影响
<a name="replication-delete-op"></a>

如果您从源存储桶中删除对象，则默认情况下会执行以下操作：
+ 如果您发出 DELETE 请求而未指定对象版本 ID，Amazon S3 会添加一个删除标记。Amazon S3 将按如下所示处理该删除标记：
  + 如果您使用的是最新版本的复制配置（即在复制配置规则中指定 `Filter` 元素），Amazon S3 默认不会复制该删除标记。但是，您可以将*删除标记复制*添加到非基于标记的规则。有关更多信息，请参阅 [在存储桶之间复制删除标记](delete-marker-replication.md)。
  + 如果您未指定 `Filter` 元素，则 Amazon S3 将假定复制配置为版本 V1，并复制用户操作产生的删除标记。但是，如果 Amazon S3 因生命周期操作删除了对象，则删除标记不会复制到目标存储桶。
+ 如果您在 `DELETE` 请求中指定一个要删除的对象版本 ID，Amazon S3 会在源存储桶中删除该对象版本。但不会将删除操作复制到目标存储桶中。换句话说，它不会从目标存储桶中删除同一对象版本。这会防止恶意删除数据。

## 使用复制配置不会复制什么？
<a name="replication-what-is-not-replicated"></a>

默认情况下，Amazon S3 不复制以下内容：
+ 源存储桶中作为另一个复制规则所建副本的对象。例如，假设您配置的复制中，存储桶 A 是源，存储桶 B 是目标。现在假设您添加另一个复制配置，其中存储桶 B 是源，而存储桶 C 是目标。在这种情况下，存储桶 B 中作为存储桶 A 中对象的副本的对象不会复制到存储桶 C。

  要复制属于副本的对象，请使用分批复制。请通过 [复制现有对象](s3-batch-replication-batch.md) 了解有关配置分批复制的更多信息。
+ 源存储桶中已复制到其他目标的对象。例如，如果您在现有复制配置中更改目标存储桶，则 Amazon S3 不会再次复制对象。

  要复制之前已复制的对象，请使用分批复制。请通过 [复制现有对象](s3-batch-replication-batch.md) 了解有关配置分批复制的更多信息。
+ 批处理复制不支持重新复制从目标存储桶中使用对象的版本 ID 删除的对象。要重新复制这些对象，您可以使用分批复制任务将源对象复制到位。将这些对象复制到位会在源存储桶中创建对象的新版本，并自动启动到目标的复制。有关如何使用分批复制的更多信息，请参阅[使用分批操作复制对象的示例](batch-ops-examples-copy.md)。
+ 默认情况下，从不同的 AWS 账户 进行复制时，添加到源存储桶的删除标记不会被复制。

  有关如何复制删除标记的更多信息，请参阅 [在存储桶之间复制删除标记](delete-marker-replication.md)。
+ 存储在 S3 Glacier Flexible Retrieval、S3 Glacier Deep Archive、S3 Intelligent-Tiering Archive Access 或 S3 Intelligent-Tiering Deep Archive Access 存储类或层中的对象。在还原这些对象并将它们复制到不同的存储类之前，您无法复制它们。

  要了解有关 S3 Glacier Flexible Retrieval 和 S3 Glacier Deep Archive 的更多信息，请参阅[极少访问的对象的存储类](storage-class-intro.md#sc-glacier)。

  有关 S3 Intelligent-Tiering 的更多信息，请参阅[使用 Amazon S3 Intelligent-Tiering 管理存储成本](intelligent-tiering.md)。
+ 源存储存储桶中存储桶拥有者没有足够权限进行复制的对象。

  有关对象拥有者如何向存储桶拥有者授予权限的信息，请参阅[在授予上传对象的跨账户权限的同时，确保存储桶拥有者拥有完全控制权](example-bucket-policies.md#example-bucket-policies-acl-2)。
+ 对存储桶级别子资源进行的更新。

  例如，如果您更改生命周期配置或向源存储桶添加通知配置，则这些更改不会应用于目标存储桶。此功能使您可以在源存储桶和目标存储桶中具有不同的配置。
+ 由生命周期配置执行的操作。

  例如，如果仅对源存储桶启用了生命周期配置，则 Amazon S3 会为过期对象创建删除标记，但不会复制这些标记。如果您希望对源存储桶和目标存储桶应用相同的生命周期配置，请对这两个存储桶启用相同的生命周期配置。有关生命周期配置的更多信息，请参阅 [管理对象的生命周期](object-lifecycle-mgmt.md)。
+ 当您在实时复制中使用基于标签的复制规则时，必须在 `PutObject` 操作中使用匹配的复制规则标签来标记新对象。否则，将不会复制对象。如果在 `PutObject` 操作后标记了对象，也不会复制这些对象。

  要复制在 `PutObject` 操作之后标记的对象，您必须使用 S3 批量复制。有关分批复制的更多信息，请参阅 [复制现有对象](s3-batch-replication-batch.md)。

# 复制的要求和注意事项
<a name="replication-requirements"></a>

Amazon S3 复制具有以下要求：
+ 源存储桶拥有者必须已为其账户启用源和目标 AWS 区域。目标存储桶拥有者必须已为其账户启用目标区域。

  有关启用和禁用 AWS 区域的更多信息，请参阅《AWS 账户管理 参考指南》**中的 [Specify which AWS 区域 your account can use](https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-regions.html)。
+ 源存储桶和目标存储桶必须均已启用版本控制。有关版本控制的更多信息，请参阅 [使用 S3 版本控制保留对象的多个版本](Versioning.md)。
+ Amazon S3 必须有权代表您将对象从源存储桶复制到目标存储桶。有关这些权限的更多信息，请参阅 [为实时复制设置权限](setting-repl-config-perm-overview.md)。
+ 如果源存储桶的拥有者不拥有该存储桶中的对象，则对象拥有者必须使用对象访问控制列表（ACL）对该存储桶拥有者授予 `READ` 和 `READ_ACP` 权限。有关更多信息，请参阅 [访问控制列表 (ACL) 概述](acl-overview.md)。
+ 如果源存储桶已启用 S3 对象锁定，目标存储桶也必须启用 S3 对象锁定。

  要在启用了对象锁定的存储桶上启用复制，您必须使用 AWS Command Line Interface、REST API 或 AWS SDK。有关更多一般信息，请参阅 [使用对象锁定以锁定对象](object-lock.md)。
**注意**  
您必须在用于设置复制的 AWS Identity and Access Management (IAM) 角色中授予对源 S3 存储桶的两项新权限。这两项新权限是 `s3:GetObjectRetention` 和 `s3:GetObjectLegalHold`。如果这个角色有 `s3:Get*` 权限，则它已经满足要求了。有关更多信息，请参阅 [为实时复制设置权限](setting-repl-config-perm-overview.md)。

有关更多信息，请参阅 [设置实时复制概述](replication-how-setup.md)。

如果您要在*跨账户方案*（其中，源存储桶和目标存储桶由不同的 AWS 账户拥有）中设置复制配置，则需要满足以下附加要求：
+ 目标存储桶的拥有者必须使用存储桶策略向源存储桶的拥有者授予复制对象的权限。有关更多信息，请参阅 [（可选）步骤 3：在源存储桶和目标存储桶由不同的 AWS 账户拥有时授予权限](setting-repl-config-perm-overview.md#setting-repl-config-crossacct)。
+ 目标存储桶不能配置为申请方付款存储桶。有关更多信息，请参阅 [使用申请方付款通用存储桶进行存储传输和使用](RequesterPaysBuckets.md)。

## 复制的注意事项
<a name="replication-and-other-bucket-configs"></a>

在创建复制配置之前，请注意以下注意事项。

**Topics**
+ [

### 生命周期配置和对象副本
](#replica-and-lifecycle)
+ [

### 版本控制配置和复制配置
](#replication-and-versioning)
+ [

### 将 S3 复制与 S3 Intelligent-Tiering 结合使用
](#replication-and-intelligent-tiering)
+ [

### 日志记录配置和复制配置
](#replication-and-logging)
+ [

### CRR 和目标区域
](#replication-and-dest-region)
+ [

### S3 批量复制
](#considerations-batch-replication)
+ [

### S3 Replication Time Control
](#considerations-RTC)

### 生命周期配置和对象副本
<a name="replica-and-lifecycle"></a>

Amazon S3 复制对象所需的时间取决于对象大小。对于大型对象，可能需要几个小时。虽然可能需要一段时间之后副本才能出现在目标存储桶中，但创建副本所需的时间与创建源存储桶中的对应对象所需的时间相同。如果您对目标存储桶启用了生命周期配置，生命周期规则遵循对象的原始创建时间，而不是副本在目标存储桶中可用的时间。

复制配置需要启用版本控制的存储桶。在存储桶上启用版本控制时，请注意以下几点：
+ 如果您具有对象过期生命周期配置，在启用版本控制后，请添加 `NonCurrentVersionExpiration` 策略以保持与启用版本控制之前相同的永久删除行为。
+ 如果具有转换生命周期配置，则在启用版本控制后，考虑添加 `NonCurrentVersionTransition` 策略。

### 版本控制配置和复制配置
<a name="replication-and-versioning"></a>

对存储桶配置复制时，源存储桶和目标存储桶都必须启用版本控制。对源存储桶和目标存储桶启用版本控制并对源存储桶配置复制后，您会遇到以下问题：
+ 如果您尝试对源存储桶禁用版本控制，则 Amazon S3 会返回错误。您必须先删除复制配置，然后才能对源存储桶禁用版本控制。
+ 如果您对目标存储桶禁用版本控制，则复制会失败。源对象的复制状态为 `FAILED`。

### 将 S3 复制与 S3 Intelligent-Tiering 结合使用
<a name="replication-and-intelligent-tiering"></a>

S3 Intelligent-Tiering 是一种存储类，旨在通过自动将数据移动到最具成本效益的访问层来优化存储成本。每月只需支付少量的对象监控和自动化费用，S3 Intelligent-Tiering 即可监控访问模式并将未访问的对象移动到成本较低的访问层。

使用 S3 批量复制来复制存储在 S3 Intelligent-Tiering 中的对象或调用 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html) 或 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html) 将构成访问。在这些情况下，复制操作的源对象是分层的。

有关 S3 Intelligent-Tiering 的更多信息，请参阅[使用 Amazon S3 Intelligent-Tiering 管理存储成本](intelligent-tiering.md)。

### 日志记录配置和复制配置
<a name="replication-and-logging"></a>

如果 Amazon S3 将日志传送到已启用复制的存储桶，它将复制日志对象。

如果对源存储桶或目标存储桶启用了[服务器访问日志](ServerLogs.md)或 [AWS CloudTrail 日志](cloudtrail-logging.md)，Amazon S3 将在这些日志中包含复制相关的请求。例如，Amazon S3 将记录它复制的每个对象。

### CRR 和目标区域
<a name="replication-and-dest-region"></a>

Amazon S3 跨区域复制（CRR）用于在不同 AWS 区域 中跨 S3 存储桶复制对象。根据您的业务需求或成本考虑，您可能选择了区域作为目标存储桶。例如，区域间数据传输费用因您所选的区域而异。

假设您选择了美国东部（弗吉尼亚州北部）(`us-east-1`) 作为源存储桶的区域。如果您选择了美国西部（俄勒冈州）(`us-west-2`) 作为目标存储桶的区域，则您支付的费用将比选择美国东部（俄亥俄州）(`us-east-2`) 区域时更多。有关定价信息，请参阅 [Amazon S3 定价](https://aws.amazon.com/s3/pricing/)中的“数据传输定价”。

同区域复制 (SRR) 不会产生相关的数据传输费用。

### S3 批量复制
<a name="considerations-batch-replication"></a>

有关批量复制的注意事项的信息，请参阅 [S3 分批复制注意事项](s3-batch-replication-batch.md#batch-replication-considerations)。

### S3 Replication Time Control
<a name="considerations-RTC"></a>

有关 S3 Replication Time Control（S3 RTC）的最佳实践和注意事项的信息，请参阅 [S3 RTC 的最佳实践和准则](replication-time-control.md#rtc-best-practices)。

# 设置实时复制概述
<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)。

# 管理或暂停实时复制
<a name="disable-replication"></a>

实时复制是跨相同或不同 AWS 区域中的存储桶自动、异步复制对象。在您设置复制配置后，Amazon S3 会将源存储桶中新创建的对象和对象更新复制到一个或多个指定的目标存储桶。

您使用 Amazon S3 控制台向源存储桶添加复制规则。复制规则定义了要复制的源存储桶对象和存储已复制对象的目标存储桶。有关复制的更多信息，请参阅 [在区域内和跨区域复制对象](replication.md)。

可以在 Amazon S3 控制台中的**复制**页面上管理复制规则。可以添加、查看、编辑、启用、禁用或删除复制规则。也可以更改复制规则的优先级。有关向存储桶添加复制规则的信息，请参阅 [使用 S3 控制台](replication-walkthrough1.md#enable-replication)。

**使用 Amazon S3 控制台管理存储桶的复制规则**

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

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

1. 在**通用存储桶**选项卡上，选择您想要的存储桶的名称。

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

1. 可以通过以下方式更改复制规则：
   + 要启用或禁用复制规则，请选择规则左侧的选项按钮。在**操作**菜单上，选择**启用规则**或**禁用规则**。还可从**操作**菜单中禁用、启用或删除存储桶中的所有规则。
**注意**  
如果您禁用复制规则，之后又重新启用该规则，那么在禁用规则期间未复制的任何新对象或更改的对象在重新启用该规则后均*不会* 自动复制。要复制这些对象，必须使用 S3 批量复制。有关更多信息，请参阅 [使用批量复制以复制现有对象](s3-batch-replication-batch.md)。
   + 要更改规则的优先级，请选择规则左侧的选项按钮，然后选择**编辑规则**。

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

## 暂停或停止复制
<a name="replication-pause"></a>

要临时暂停复制并在以后自动恢复，您可以使用 AWS Fault Injection Service 中的 `aws:s3:bucket-pause-replication` 操作。有关更多信息，请参阅《AWS Fault Injection Service 用户指南》**中的 [https://docs.aws.amazon.com/fis/latest/userguide/fis-actions-reference.html#bucket-pause-replication](https://docs.aws.amazon.com/fis/latest/userguide/fis-actions-reference.html#bucket-pause-replication) 和 [Pause S3 Replication](https://docs.aws.amazon.com/fis/latest/userguide/cross-region-scenario.html#cross-region-scenario-actions-pause-s3-replication)。

要在 Amazon S3 中停止复制，我们建议您禁用复制规则。如果您禁用复制规则，之后又重新启用该规则，那么在禁用规则期间未复制的任何新对象或更改的对象在重新启用该规则后均*不会* 自动复制。要复制这些对象，必须使用 S3 批量复制。有关更多信息，请参阅 [使用批量复制以复制现有对象](s3-batch-replication-batch.md)。

如果您移除向 Amazon S3 授予所需权限的 AWS Identity and Access Management（IAM）角色、AWS Key Management Service（AWS KMS）权限或存储桶策略权限，复制也将停止。但是，我们建议您不要使用这些方法，因为它们会导致复制失败。Amazon S3 会将受影响对象的复制状态报告为 `FAILED`。如果稍后权限恢复，则标记为 `FAILED` 的对象*不会* 自动复制。要复制这些对象，必须使用 S3 批量复制。

# 使用批量复制以复制现有对象
<a name="s3-batch-replication-batch"></a>

S3 批量复制与实时复制不同，后者连续自动跨 Amazon S3 存储桶复制新对象。相反，S3 批量复制是按需对现有对象进行的。可以使用 S3 批量复制来复制以下类型的对象：
+ 在复制配置设立之前已经存在的对象
+ 以前已复制的对象
+ 复制失败的对象

您可以使用批量操作任务来按需复制这些对象。

要开始使用批量复制，您可以：
+ **为新的复制规则或目标启动批量复制** – 可以在新的复制配置中创建第一条规则时，或通过 Amazon S3 控制台向现有配置添加新的目标存储桶时，创建一次性批量复制任务。
+ **为现有复制配置启动批量复制** – 可以通过 Amazon S3 控制台、AWS Command Line Interface（AWS CLI）、AWS SDK 或 Amazon S3 REST API，使用 S3 批量操作创建新的批量复制任务。

分批复制任务完成后，您将收到完成报告。有关如何使用此报告检查任务的更多信息，请参阅[跟踪任务状态和完成报告](batch-ops-job-status.md)。

## S3 分批复制注意事项
<a name="batch-replication-considerations"></a>

使用 S3 批量复制之前，请查看以下注意事项列表：
+ 您的源存储桶必须具有现有的复制配置。要启用复制，请参阅 [设置实时复制概述](replication-how-setup.md) 和 [配置实时复制的示例](replication-example-walkthroughs.md)。
+ 如果您为存储桶配置了 S3 生命周期，我们建议在批量复制任务处于活动状态时禁用生命周期规则。这样做有助于确保源存储桶和目标存储桶的对等。否则，这些存储桶可能会出现差异，目标存储桶将不会与源存储桶完全一样。例如，考虑以下情形：
  + 您的源存储桶有某个对象的多个版本，并且对于该对象有一个删除标记。
  + 您的源存储桶和目标存储桶具有移除已过期删除标记的生命周期配置。

  在这种情况下，批量复制可能会在复制对象版本之前，将删除标记复制到目标存储桶。这种行为可能导致在复制对象版本之前，生命周期配置将删除标记标为过期，并且从目标存储桶中移除删除标记。
+ 您指定用于运行批量操作任务的 AWS Identity and Access Management（IAM）角色必须具有必要的权限，来执行基础的批量复制操作。有关创建 IAM 角色的更多信息，请参阅 [配置 IAM 角色以进行 S3 批量复制](s3-batch-replication-policies.md)。
+ 批量复制需要可以由 Amazon S3 生成的清单。生成的清单必须存储在与源存储桶相同的 AWS 区域 中。如果您选择不生成清单，则可以提供包含要复制的对象的 Amazon S3 清单报告或 CSV 文件。有关更多信息，请参阅 [为分批复制任务指定清单](#batch-replication-manifest)。
+ 批量复制不支持重新复制已通过从目标存储桶中指定对象的版本 ID 删除的对象。要重新复制这些对象，您可以使用分批复制任务将源对象复制到位。将这些对象复制到位会在源存储桶中创建对象的新版本，并自动启动到目标存储桶的复制。删除和重新创建目标存储桶不会启动复制。

  有关批量复制的更多信息，请参阅[使用分批操作复制对象的示例](batch-ops-examples-copy.md)。
+ 如果您在源存储桶上使用复制规则，请确保通过向附加到复制规则的 IAM 角色授予复制对象的适当权限，来[更新您的复制配置](https://docs.aws.amazon.com/AmazonS3/latest/userguide/replication-walkthrough-2.html)。此 IAM 角色必须具有在源存储桶和目标存储桶上执行复制所需的权限。
+ 如果您在短时间范围内为同一个存储桶提交多个批量复制任务，Amazon S3 会同时运行这些任务。
+ 如果您为两个不同的存储桶提交多个批量复制任务，请注意 Amazon S3 可能无法同时运行所有任务。如果您超过了账户中一次可以运行的批量复制任务的数量，Amazon S3 会暂停优先级较低的任务，来处理优先级较高的任务。优先级较高的任务完成后，任何暂停的任务都会再次变为活动状态。
+ 存储在 S3 Glacier Flexible Retrieval 和 S3 Glacier Deep Archive 存储类中的对象不支持批量复制。
+ 要批量复制存储在归档访问存储层或深度归档访问存储层中的 S3 Intelligent-Tiering 对象，必须首先启动[还原](https://docs.aws.amazon.com/AmazonS3/latest/userguide/intelligent-tiering-managing.html#restore-data-from-int-tier-archive)请求，然后等待对象移动到频繁访问层。
+ 单个批量复制作业可以支持包含多达 200 亿个对象的清单。
+ 如果您使用 S3 批量复制来跨区域复制数据集，并且您的对象之前已将其服务器端加密类型从 SSE-S3 更新为 SSE-KMS，则您可能需要额外的权限。在源区域存储桶上，您必须拥有 `kms:decrypt` 权限。然后，您将需要针对目标区域中存储桶的 `kms:decrypt` 和 `kms:encrypt` 权限。有关更多信息，请参阅 [复制加密对象](replication-config-for-kms-objects.md)。

## 为分批复制任务指定清单
<a name="batch-replication-manifest"></a>

清单是一种 Amazon S3 对象，其中包含您希望 Amazon S3 采取操作的对象键。如果您希望创建批量复制任务，则必须提供用户生成的清单，或者让 Amazon S3 根据复制配置生成清单。

如果您提供用户生成的清单，清单必须采用 Amazon S3 清单报告或 CSV 文件的形式。如果清单中的对象位于受版本控制的存储桶中，则必须指定对象的版本 ID。只会复制在清单中指定了版本 ID 的对象。要了解有关指定清单的更多信息，请参阅 [指定清单](batch-ops-create-job.md#specify-batchjob-manifest)。

如果您选择让 Amazon S3 代表您生成清单文件，那么列出的对象会使用与源存储桶上的复制配置相同的源存储桶、前缀和标签。使用生成的清单，Amazon S3 复制所有符合条件的对象版本。

**注意**  
如果您选择让 Amazon S3 生成清单，则清单必须存储在与源存储桶相同的 AWS 区域中。

## 分批复制任务的筛选条件
<a name="batch-replication-filters"></a>

在创建批量复制任务时，您可以选择指定其它筛选条件，例如对象创建日期和复制状态，来缩小任务的范围。

您可以通过提供以下一个或多个值基于 `ObjectReplicationStatuses` 值筛选要复制的对象：
+ `"NONE"` – 表示 Amazon S3 之前从未尝试过复制对象。
+ `"FAILED"` – 表示 Amazon S3 之前尝试过，但未成功复制对象。
+ `"COMPLETED"` – 表示 Amazon S3 之前已成功复制对象。
+ `"REPLICA"` – 表示此对象是 Amazon S3 已从另一个源存储桶复制的副本。

有关复制状态的更多信息，请参阅 [获取复制状态信息](replication-status.md)。

如果您不筛选批量复制任务，批量操作会尝试复制清单中与复制配置中的规则匹配的所有对象（无论其 `ObjectReplicationStatus` 如何），但默认情况下未复制的某些对象除外。有关更多信息，请参阅 [使用复制配置不会复制什么？](replication-what-is-isnot-replicated.md#replication-what-is-not-replicated)。

根据您的目标，您可以将 `ObjectReplicationStatuses` 设置为以下一个或多个值：
+ 要复制从未复制过的现有对象，请仅包括 `"NONE"`。
+ 要重试复制之前未能复制的对象，请仅包括 `"FAILED"`。
+ 要同时复制现有对象和重试复制之前未能复制的对象，请同时包括 `"NONE"` 和 `"FAILED"`。
+ 要使用已复制到另一个目标的对象回填目标存储桶，请包括 `"COMPLETED"`。
+ 要复制之前已复制的对象，请包括 `"REPLICA"`。

## 分批复制完成报告
<a name="batch-replication-completion-report"></a>

在创建批量复制任务时，您可以请求 CSV 完成报告。此报告显示对象、复制成功或失败代码、输出和描述。有关任务跟踪和完成报告的更多信息，请参阅[完成报告](batch-ops-job-status.md#batch-ops-completion-report)。

有关复制故障代码和描述的列表，请参阅 [Amazon S3 复制失败原因](replication-metrics-events.md#replication-failure-codes)。

有关排查批量复制故障的信息，请参阅[批量复制错误](replication-troubleshoot.md#troubleshoot-batch-replication-errors)。

## 批量复制入门
<a name="batch-replication-tutorial"></a>

要了解有关如何使用批量复制的更多信息，请参阅[教程：使用 S3 批量复制来复制 Amazon S3 存储桶中的现有对象](https://aws.amazon.com/getting-started/hands-on/replicate-existing-objects-with-amazon-s3-batch-replication/)。

# 配置 IAM 角色以进行 S3 批量复制
<a name="s3-batch-replication-policies"></a>

由于 Amazon S3 批量复制是批量操作任务的一种类型，因此您必须创建一个 AWS Identity and Access Management（IAM）角色，用于向批量操作授予代表您执行操作的权限。您还必须将分批复制 IAM 策略附加到批量操作 IAM 角色。

使用以下过程创建策略和 IAM 角色，来向批量操作授予启动批量复制任务的权限。

**创建用于批量复制的策略**

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

1. 在**访问管理**下，选择**策略**。

1. 选择 **Create policy (创建策略)**。

1. 在**指定权限**页面上，选择 **JSON**。

1. 根据您的清单是由 Amazon S3 生成还是您自行提供清单，插入以下策略之一。有关清单的更多信息，请参阅[为分批复制任务指定清单](s3-batch-replication-batch.md#batch-replication-manifest)。

   在使用这些策略之前，请将以下策略中的 `user input placeholders` 替换为复制源存储桶、清单存储桶和完成报告存储桶的名称。
**注意**  
批量复制的 IAM 角色需要不同的权限，具体取决于您是生成清单还是提供清单，因此，请务必从以下示例中选择相应的策略。

**使用和存储 Amazon S3 生成的清单时的策略**

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

****  

   ```
   {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
         {
            "Action": [
               "s3:InitiateReplication"
            ],
            "Effect": "Allow",
            "Resource": [
               "arn:aws:s3:::amzn-s3-demo-source-bucket/*"
            ]
         },
         {
            "Action": [
               "s3:GetReplicationConfiguration",
               "s3:PutInventoryConfiguration"
            ],
            "Effect": "Allow",
            "Resource": [
               "arn:aws:s3:::amzn-s3-demo-source-bucket"
            ]
         },
         {
            "Action": [
               "s3:GetObject",
               "s3:GetObjectVersion"
            ],
            "Effect": "Allow",
            "Resource": [
               "arn:aws:s3:::amzn-s3-demo-manifest-bucket/*"
            ]
         },
         {
            "Effect": "Allow",
            "Action": [
               "s3:PutObject"
            ],
            "Resource": [
               "arn:aws:s3:::amzn-s3-demo-completion-report-bucket/*",
               "arn:aws:s3:::amzn-s3-demo-manifest-bucket/*"    
            ]
         }
      ]
   }
   ```

------

**使用用户提供的清单时的策略**

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

****  

   ```
   {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
         {
            "Action": [
               "s3:InitiateReplication"
            ],
            "Effect": "Allow",
            "Resource": [
               "arn:aws:s3:::amzn-s3-demo-source-bucket/*"
            ]
         },
         {
            "Action": [
               "s3:GetObject",
               "s3:GetObjectVersion"
            ],
            "Effect": "Allow",
            "Resource": [
               "arn:aws:s3:::amzn-s3-demo-manifest-bucket/*"
            ]
         },
         {
            "Effect": "Allow",
            "Action": [
               "s3:PutObject"
            ],
            "Resource": [
               "arn:aws:s3:::amzn-s3-demo-completion-report-bucket/*"    
            ]
         }
      ]
   }
   ```

------

1. 选择**下一步**。

1. 指定策略名称，然后选择**创建策略**。

**创建用于批量复制的 IAM 角色**

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

1. 在 **Access management**（访问管理）下，请选择 **Roles**（角色）。

1. 选择**创建角色**。

1. 选择 **AWS 服务**作为可信实体的类型。在**使用案例**部分中，选择 **S3** 作为服务，并选择 **S3 批量操作**作为使用案例。

1. 选择**下一步**。此时将显示**添加权限**页面。在搜索框中，搜索您在前面的过程中创建的策略。选中策略名称旁的复选框，然后选择**下一步**。

1. 在**命名、查看和创建**页面上，输入 IAM 角色的名称。

1. 在**步骤 1：信任身份**部分中，验证 IAM 角色是否使用以下信任策略：

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

****  

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

------

1. 在**步骤 2：添加权限**部分中，验证 IAM 角色是否使用您之前创建的策略。

1. 选择**创建角色**。

# 为新的复制规则或目标创建批量复制任务
<a name="s3-batch-replication-new-config"></a>

在 Amazon S3 中，实时复制不会复制在您创建复制配置之前已存在于源存储桶中的任何对象。实时复制仅自动复制在创建复制配置之后写入存储桶中的新对象和更新的对象。要复制已存在的对象，可以使用 S3 批量复制来按需复制这些对象。

在新的实时复制配置中创建第一个规则时，或通过 Amazon S3 控制台将新目标存储桶添加到现有复制配置时，可以选择创建一个批量复制任务。可以使用此批量复制任务来将源存储桶中的现有对象复制到目标存储桶。

要将批量复制用于现有配置而不添加新的目标存储桶，请参阅[为现有复制规则创建分批复制任务](s3-batch-replication-existing-config.md)。

**先决条件**  
在创建批量复制任务之前，必须创建批量操作 AWS Identity and Access Management（IAM）角色，来向 Amazon S3 授予代表您执行操作的权限。有关更多信息，请参阅 [配置 IAM 角色以进行 S3 批量复制](s3-batch-replication-policies.md)。

## 通过 Amazon S3 控制台将批量复制用于新的复制规则或目标
<a name="batch-replication-new-config-console"></a>

在新的复制配置中创建第一个规则时，或通过 Amazon S3 控制台将新的目标存储桶添加到现有配置时，可以选择创建批复制任务来复制源存储桶中的现有对象。

**在创建或更新复制配置时创建批量复制任务**

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

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

1. 在**通用存储桶**列表中，选择包含您想要复制的对象的存储桶名称。

1. 要创建新的复制规则或编辑现有规则，请选择**管理**选项卡，然后向下滚动到**复制规则**：
   + 要创建新的复制规则，请选择 **Create replication rule**（创建复制规则）。有关如何设置基本复制规则的示例，请参阅[配置实时复制的示例](replication-example-walkthroughs.md)。
   + 要编辑现有复制规则，请选择规则名称旁边的选项按钮，然后选择**编辑规则**。

1. 创建新的复制规则或编辑现有复制规则的目标，然后选择 **Save**（保存）。

   在新的复制配置中创建第一个规则或编辑现有配置以添加新目标后，将显示 **Replicate existing objects?**（是否复制现有对象？）对话框，让您可以选择创建分批复制任务。

1. 如果要立即创建并运行此任务，请选择**是，复制现有对象**。

   如果要以后创建批量复制任务，请选择**否，不复制现有对象**。

1. 如果选择**是，复制现有对象**，则会出现**创建批量操作任务**页面。S3 批量复制任务具有以下设置：  
**任务运行选项**  
如果您想让 S3 批量复制任务立即运行，请选择**任务准备就绪后自动运行**。如果您想在以后运行任务，请选择**等待任务准备就绪后再运行**。  
如果选择**任务准备就绪后自动运行**，您将无法创建和保存批量操作清单。要保存批量操作清单，请选择**等待任务准备就绪后再运行**。  
**批量操作清单**  
如果您选择**等待任务准备就绪后再运行**，则会显示**批量操作清单**部分。清单是您希望对其运行指定操作的所有对象的列表。可以选择保存此清单。与 S3 清单文件类似，清单将另存为 CSV 文件并存储在存储桶中。要了解有关批量操作清单的更多信息，请参阅 [指定清单](batch-ops-create-job.md#specify-batchjob-manifest)。  
**完成报告**  
S3 批量操作将为在清单中指定的每个对象执行一个任务。完成报告提供了以合并格式查看任务结果的简单途径，且无需进行任何附加设置。您可以为全部任务或仅为失败的任务请求完成报告。要了解有关完成报告的更多信息，请参阅 [完成报告](batch-ops-job-status.md#batch-ops-completion-report)。  
**权限**  
复制失败的最常见原因之一是提供的 AWS Identity and Access Management (IAM) 角色的权限不足。有关创建此角色的信息，请参阅 [配置 IAM 角色以进行 S3 批量复制](s3-batch-replication-policies.md)。确保创建或选择拥有批量复制所需权限的 IAM 角色。

1. 选择**保存**。

# 为现有复制规则创建分批复制任务
<a name="s3-batch-replication-existing-config"></a>

在 Amazon S3 中，实时复制不会复制在您创建复制配置之前已存在于源存储桶中的任何对象。实时复制仅自动复制在创建复制配置之后写入存储桶中的新对象和更新的对象。要复制已存在的对象，可以使用 S3 批量复制来按需复制这些对象。

您可以通过使用 AWS SDK、AWS Command Line Interface（AWS CLI）或 Amazon S3 控制台为现有复制配置来配置 S3 分批复制。有关批量复制的概述，请参阅[使用批量复制以复制现有对象](s3-batch-replication-batch.md)。

分批复制任务完成后，您将收到完成报告。有关如何使用报告检查任务的更多信息，请参阅 [跟踪任务状态和完成报告](batch-ops-job-status.md)。

**先决条件**  
在创建批量复制任务之前，必须创建批量操作 AWS Identity and Access Management（IAM）角色，来向 Amazon S3 授予代表您执行操作的权限。有关更多信息，请参阅 [配置 IAM 角色以进行 S3 批量复制](s3-batch-replication-policies.md)。

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

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

1. 在左侧导航窗格中，选择**批量操作**。

1. 选择**创建任务**。

1. 验证 **AWS 区域**部分显示了要在其中创建任务的区域。

1. 在**清单**部分中，指定要使用的清单格式。清单是您希望对其运行指定操作的所有对象的列表。要了解有关批量操作清单的更多信息，请参阅 [指定清单](batch-ops-create-job.md#specify-batchjob-manifest)。
   + 如果您准备了清单，请选择 **S3 清单报告 (manifest.json)** 或 **CSV**。如果清单位于受版本控制的存储桶中，则可以指定清单的版本 ID。如果未指定版本 ID，批量操作会使用清单的当前版本。有关创建清单的更多信息，请参阅[指定清单](batch-ops-create-job.md#specify-batchjob-manifest)。
**注意**  
如果清单中的对象位于受版本控制的存储桶中，则必须指定对象的版本 ID。有关更多信息，请参阅 [指定清单](batch-ops-create-job.md#specify-batchjob-manifest)。
   + 要根据复制配置创建清单，请选择 **Create manifest using S3 Replication configuration**（使用 S3 复制配置创建清单）。然后，选择复制配置的源存储桶。

1. （可选）如果您选择**使用 S3 复制配置创建清单**，则可以添加其它筛选条件，例如对象创建日期和复制状态。有关如何按复制状态筛选的示例，请参阅[为分批复制任务指定清单](s3-batch-replication-batch.md#batch-replication-manifest)。

1. （可选）如果您选择**使用 S3 复制配置创建清单**，则可以保存生成的清单。要保存清单，请选择**保存批量操作清单**。然后，为清单指定目标存储桶，并选择是否对清单进行加密。
**注意**  
生成的清单必须存储在与源存储桶相同的 AWS 区域 中。

1. 选择**下一步**。

1. 在**操作**页上，选择**复制**，然后选择**下一步**。

1. （可选）提供 **Description**（说明）。

1. 必要时调整任务的 **Priority**（优先级）。数字越大，优先级越高。Amazon S3 尝试在优先级较低的任务之前运行优先级较高的任务。有关任务优先级的更多信息，请参阅 [分配任务优先级](batch-ops-job-priority.md)。

1. （可选）生成完成报告。要生成此报告，请选择**生成完成报告**。

   如果您选择生成完成报告，则必须选择报告**仅失败的任务**或**全部任务**，并为报告提供目标存储桶。

1. 在**权限**部分中，请确保您选择拥有批量复制所需权限的 IAM 角色。复制失败的最常见原因之一是提供的 IAM 角色的权限不足。有关创建此角色的信息，请参阅 [配置 IAM 角色以进行 S3 批量复制](s3-batch-replication-policies.md)。

1. （可选）将任务标签添加到分批复制任务中。

1. 选择**下一步**。

1. 检查任务配置，然后选择**创建任务**。

## 通过 S3 清单使用 AWS CLI
<a name="batch-replication-existing-config-cli"></a>

以下示例 `create-job` 命令通过使用 S3 为 AWS 账户 `111122223333` 生成的清单创建 S3 批量复制任务。此示例将复制现有对象和之前复制失败的对象。有关按复制状态筛选的信息，请参阅[为分批复制任务指定清单](s3-batch-replication-batch.md#batch-replication-manifest)。

要使用此命令，请将 *`user input placeholders`* 替换为您自己的信息。将 IAM 角色 `role/batch-Replication-IAM-policy` 替换为您之前创建的 IAM 角色。有关更多信息，请参阅 [配置 IAM 角色以进行 S3 批量复制](s3-batch-replication-policies.md)。

```
aws s3control create-job --account-id 111122223333 \ 
--operation '{"S3ReplicateObject":{}}' \ 
--report '{"Bucket":"arn:aws:s3:::amzn-s3-demo-completion-report-bucket",\ 
"Prefix":"batch-replication-report", \ 
"Format":"Report_CSV_20180820","Enabled":true,"ReportScope":"AllTasks"}' \ 
--manifest-generator '{"S3JobManifestGenerator": {"ExpectedBucketOwner": "111122223333", \ 
"SourceBucket": "arn:aws:s3:::amzn-s3-demo-source-bucket", \ 
"EnableManifestOutput": false, "Filter": {"EligibleForReplication": true, \ 
"ObjectReplicationStatuses": ["NONE","FAILED"]}}}' \ 
--priority 1 \ 
--role-arn arn:aws:iam::111122223333:role/batch-Replication-IAM-policy \ 
--no-confirmation-required \ 
--region source-bucket-region
```

**注意**  
必须从与复制源存储桶相同的 AWS 区域中启动该任务。

成功启动分批复制任务后，您会收到任务 ID 作为响应。可以使用下面的 `describe-job` 命令来监控此任务。要使用此命令，请将 *`user input placeholders`* 替换为您自己的信息。

```
aws s3control describe-job --account-id 111122223333 --job-id job-id --region source-bucket-region
```

## 通过用户提供的清单使用 AWS CLI
<a name="batch-replication-existing-config-cli-customer-manifest"></a>

以下示例通过使用 AWS 账户 `111122223333` 的用户定义清单创建 S3 批量复制任务。如果清单中的对象位于受版本控制的存储桶中，则必须指定对象的版本 ID。只有在清单中指定了版本 ID 的对象才会复制。有关创建清单的更多信息，请参阅[指定清单](batch-ops-create-job.md#specify-batchjob-manifest)。

要使用此命令，请将 *`user input placeholders`* 替换为您自己的信息。将 IAM 角色 `role/batch-Replication-IAM-policy` 替换为您之前创建的 IAM 角色。有关更多信息，请参阅 [配置 IAM 角色以进行 S3 批量复制](s3-batch-replication-policies.md)。

```
aws s3control create-job --account-id 111122223333 \ 
--operation '{"S3ReplicateObject":{}}' \
--report '{"Bucket":"arn:aws:s3:::amzn-s3-demo-completion-report-bucket",\
"Prefix":"batch-replication-report", \
"Format":"Report_CSV_20180820","Enabled":true,"ReportScope":"AllTasks"}' \
--manifest '{"Spec":{"Format":"S3BatchOperations_CSV_20180820",\
"Fields":["Bucket","Key","VersionId"]},\
"Location":{"ObjectArn":"arn:aws:s3:::amzn-s3-demo-manifest-bucket/manifest.csv",\
"ETag":"Manifest Etag"}}' \
--priority 1 \
--role-arn arn:aws:iam::111122223333:role/batch-Replication-IAM-policy \
--no-confirmation-required \
--region source-bucket-region
```

**注意**  
必须从与复制源存储桶相同的 AWS 区域中启动该任务。

成功启动分批复制任务后，您会收到任务 ID 作为响应。可以使用下面的 `describe-job` 命令来监控此任务。

```
aws s3control describe-job --account-id 111122223333 --job-id job-id --region source-bucket-region
```

# 对复制进行问题排查
<a name="replication-troubleshoot"></a>

本节列出了 Amazon S3 复制的问题排查提示以及有关 S3 批量复制错误的信息。

**Topics**
+ [

## S3 复制问题排查提示
](#troubleshoot-replication-tips)
+ [

## 批量复制错误
](#troubleshoot-batch-replication-errors)

## S3 复制问题排查提示
<a name="troubleshoot-replication-tips"></a>

如果在您配置复制之后，对象副本未出现在目标桶中，请使用以下问题排查提示确定并修复问题。
+ 大多数对象会在 15 分钟内复制。Amazon S3 复制对象所需的时间取决于多个因素，包括源和目标区域对，以及对象的大小。对于大型对象，复制可能需要几个小时。要想了解复制时间，您可以[使用 S3 Replication Time Control（S3 RTC）](https://docs.aws.amazon.com/AmazonS3/latest/userguide/replication-time-control.html#enabling-replication-time-control)。

  如果要复制的对象较大，请稍候片刻，然后再检查它是否出现在目标桶中。还可以检查源对象的复制状态。如果对象复制状态为 `PENDING`，表示 Amazon S3 尚未完成复制。如果对象复制状态为 `FAILED`，请检查对源桶设置的复制配置。

  此外，要在复制期间接收有关失败的信息，您可以设置 Amazon S3 事件通知来接收复制失败事件。有关更多信息，请参阅[使用 Amazon S3 事件通知接收复制失败事件](https://docs.aws.amazon.com/AmazonS3/latest/userguide/replication-metrics.html)。
+ 要检查对象的复制状态，可以调用 `HeadObject` API 操作。`HeadObject` API 操作返回对象的 `PENDING`、`COMPLETED` 或 `FAILED` 复制状态。在对 `HeadObject` API 调用的响应中，复制状态将在 `x-amz-replication-status` 标头中返回。
**注意**  
要运行 `HeadObject`，您必须对您请求的对象拥有读取权限。`HEAD` 请求与 `GET` 请求具有相同的选项，无需执行 `GET` 操作。例如，要使用 AWS Command Line Interface（AWS CLI）运行 `HeadObject` 请求，可以运行以下命令。将 `user input placeholders` 替换为您自己的信息。  

  ```
  aws s3api head-object --bucket amzn-s3-demo-source-bucket --key index.html
  ```
+ 如果 `HeadObject` 返回复制状态为 `FAILED` 的对象，则可以使用 S3 批量复制来复制这些失败的对象。有关更多信息，请参阅 [使用批量复制以复制现有对象](s3-batch-replication-batch.md)。或者，您可以将失败的对象重新上传到源桶，这将启动新对象的复制。
+ 在源桶上的复制配置中，验证以下几点：
  + 目标存储桶的 Amazon 资源名称 (ARN) 是否正确。
  + 键名前缀是否正确。例如，如果将配置设置为复制具有前缀 `Tax` 的对象，则仅复制具有 `Tax/document1` 或 `Tax/document2` 等键名的对象。不会复制具有键名 `document3` 的对象。
  + 复制规则的状态为 `Enabled`。
+ 在复制配置中验证尚未对任何存储桶暂停版本控制。源桶和目标桶必须均已启用版本控制。
+ 如果将复制规则设置为**将对象所有权更改为目标桶拥有者**，则用于复制的 AWS Identity and Access Management（IAM）角色必须具有 `s3:ObjectOwnerOverrideToBucketOwner` 权限。此权限是对资源（在本例中为目标桶）授予的。例如，以下 `Resource` 语句显示如何授予对目标桶的这一权限：

  ```
  {
    "Effect":"Allow",
    "Action":[
      "s3:ObjectOwnerOverrideToBucketOwner"
    ],
    "Resource":"arn:aws:s3:::amzn-s3-demo-destination-bucket/*"
  }
  ```
+ 如果目标桶由另一个账户拥有，则目标桶的拥有者还必须通过目标桶策略向源桶拥有者授予 `s3:ObjectOwnerOverrideToBucketOwner` 权限。要使用以下示例桶策略，请将 `user input placeholders` 替换为您自己的信息：

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

****  

  ```
  {
    "Version":"2012-10-17",		 	 	 
    "Id": "Policy1644945280205",
    "Statement": [
      {
        "Sid": "Stmt1644945277847",
        "Effect": "Allow",
        "Principal": {
          "AWS": "arn:aws:iam::123456789101:role/s3-replication-role"
        },
        "Action": [
          "s3:ReplicateObject",
          "s3:ReplicateTags",
          "s3:ObjectOwnerOverrideToBucketOwner"
        ],
        "Resource": "arn:aws:s3:::amzn-s3-demo-destination-bucket/*"
      }
    ]
  }
  ```

------
**注意**  
如果目标桶的对象所有权设置包括**强制桶拥有者**，则无需在复制规则中将此设置更新为**将对象所有权更改为目标桶拥有者**。原定设置情况下，对象所有权将发生变化。有关更改副本所有权的更多信息，请参阅[更改副本所有权](https://docs.aws.amazon.com/AmazonS3/latest/userguide/replication-change-owner.html)。
+ 如果您要在跨账户场景（即源存储桶和目标存储桶由不同的 AWS 账户拥有）中设置复制配置，则目标存储桶无法配置为申请方付款存储桶。有关更多信息，请参阅 [使用申请方付款通用存储桶进行存储传输和使用](RequesterPaysBuckets.md)。
+ 如果存储桶的源对象使用具有 AWS Key Management Service（AWS KMS）密钥的服务器端加密（SSE-KMS）来进行加密，则必须将复制规则配置为包含 AWS KMS 加密的对象。确保在 Amazon S3 控制台中的**加密**设置下选择**复制使用 AWS KMS 加密的对象**。然后，选择用于加密目标对象的 AWS KMS 密钥。
**注意**  
如果目标桶位于其他账户中，请指定目标账户拥有的 AWS KMS 客户自主管理型密钥。不要使用原定设置的 Amazon S3 托管式密钥（`aws/s3`）。使用默认密钥会使用由源账户拥有的 Amazon S3 托管式密钥来加密对象，从而防止与其它账户共享对象。因此，目标账户将无法访问目标桶中的对象。

  要使用属于目标账户的 AWS KMS 密钥加密目标对象，目标账户必须在 KMS 密钥策略中向复制角色授予 `kms:GenerateDataKey` 和 `kms:Encrypt` 权限。要在 KMS 密钥策略中使用以下示例语句，请将 `user input placeholders` 替换为您自己的信息：

  ```
  {    
      "Sid": "AllowS3ReplicationSourceRoleToUseTheKey",
      "Effect": "Allow",
      "Principal": {
          "AWS": "arn:aws:iam::123456789101:role/s3-replication-role"
      },
      "Action": ["kms:GenerateDataKey", "kms:Encrypt"],
      "Resource": "*"
  }
  ```

  如果您在 AWS KMS 密钥策略中的 `Resource` 语句中使用星号（`*`），则该策略将使用 KMS 密钥的权限仅授予复制角色。该策略不允许复制角色提升其权限。

  原定设置情况下，KMS 密钥策略向根用户授予对密钥的完全权限。这些权限可以委派给同一账户中的其他用户。除非源 KMS 密钥策略中具有 `Deny` 语句，否则，使用 IAM policy 向复制角色授予对源 KMS 密钥的权限就足够了。
**注意**  
将访问权限限制到特定 CIDR 范围、虚拟私有云（VPC）端点或 S3 接入点的 KMS 密钥策略可能会导致复制失败。

  如果源或目标 KMS 密钥根据加密上下文授予权限，请确认对于桶开启了 Amazon S3 桶密钥。如果桶已开启了 S3 桶密钥，则加密上下文必须是桶级资源，如下所示：

  ```
  "kms:EncryptionContext:arn:aws:arn": [
       "arn:aws:s3:::amzn-s3-demo-source-bucket"
       ]
  "kms:EncryptionContext:arn:aws:arn": [
       "arn:aws:s3:::amzn-s3-demo-destination-bucket"
       ]
  ```

  除了 KMS 密钥策略授予的权限外，源账户还必须向复制角色的 IAM policy 添加以下最低权限：

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

  有关如何复制使用 AWS KMS 加密的对象的更多信息，请参阅[复制加密的对象](https://docs.aws.amazon.com/AmazonS3/latest/userguide/replication-walkthrough-4.html)。
+ 如果目标桶由另一个 AWS 账户拥有，请验证桶拥有者是否对目标桶设置了允许源桶拥有者复制对象的桶策略。有关示例，请参阅[针对不同账户中的存储桶配置复制](replication-walkthrough-2.md)。
+ 要将对象锁定与复制功能结合使用，您必须在用于设置复制的 AWS Identity and Access Management（IAM）角色中，授予对源 S3 存储桶的两项额外的权限。这两项额外的权限是 `s3:GetObjectRetention` 和 `s3:GetObjectLegalHold`。如果角色已有 `s3:Get*` 权限声明，则该声明已满足要求。有关更多信息，请参阅 [将对象锁定与 S3 复制结合使用](object-lock-managing.md#object-lock-managing-replication)。
+ 如果在验证权限后您的对象仍无法复制，请检查以下位置是否存在任何显式 `Deny` 语句：
  + 源或目标桶策略中的 `Deny` 语句。如果桶策略拒绝针对以下任一操作访问复制角色，则复制将失败：

    源桶：

    ```
    1.            "s3:GetReplicationConfiguration",
    2.            "s3:ListBucket",
    3.            "s3:GetObjectVersionForReplication",
    4.            "s3:GetObjectVersionAcl",
    5.            "s3:GetObjectVersionTagging"
    ```

    目标桶：

    ```
    1.            "s3:ReplicateObject",
    2.            "s3:ReplicateDelete",
    3.            "s3:ReplicateTags"
    ```
  + 附加到 IAM 角色的 `Deny` 语句或权限边界可能导致复制失败。
  + 附加到源账户或目标账户的 AWS Organizations 服务控制策略（SCP）中的 `Deny` 语句可能导致复制失败。
  + 附加到源或目标存储桶的 AWS Organizations 资源控制策略（RCP）中的 `Deny` 语句可能导致复制失败。
+ 如果对象副本未出现在目标桶中，以下问题可能会禁止复制：
  + 若源桶中的某对象是另一个复制配置所创建的副本，Amazon S3 不会复制该对象。例如，如果您设置从桶 A 到桶 B 再到桶 C 的复制配置，则 Amazon S3 不会将桶 B 中的对象副本复制到桶 C。
  + 源桶拥有者可以向其他 AWS 账户授予上载对象的权限。默认情况下，源桶拥有者对于其他账户创建的对象没有权限。复制配置仅复制源桶拥有者对其具有访问权限的对象。为避免出现此问题，源存储桶拥有者可以向其它 AWS 账户授予有条件地创建对象的权限，从而要求针对这些对象的显式访问权限。有关策略示例，请参阅 [在授予上传对象的跨账户权限的同时，确保存储桶拥有者拥有完全控制权](example-bucket-policies.md#example-bucket-policies-acl-2)。
+ 假设在复制配置中，您添加了一个规则以复制具有特定标签的对象子集。在这种情况下，您必须在创建对象时分配特定的标签键和值，以供 Amazon S3 复制对象。如果您先创建对象，然后向现有对象添加标签，Amazon S3 将不会复制对象。
+ 使用 Amazon S3 事件通知，以便您在对象未复制到其目标 AWS 区域的情况下收到通知。Amazon S3 事件通知可以通过 Amazon Simple Queue Service（Amazon SQS）、Amazon Simple Notification Service（Amazon SNS）或 AWS Lambda 提供。有关更多信息，请参阅 [使用 Amazon S3 事件通知接收复制失败事件](replication-metrics-events.md)。

  您还可以使用 Amazon S3 事件通知查看复制失败原因。要查看失败原因的列表，请参阅 [Amazon S3 复制失败原因](https://docs.aws.amazon.com/AmazonS3/latest/userguide/replication-failure-codes.html)。

## 批量复制错误
<a name="troubleshoot-batch-replication-errors"></a>

要对未复制到目标存储桶的对象进行故障排除，请检查存储桶、复制角色和用于创建批量复制任务的 IAM 角色的不同权限类型。此外，请务必检查存储桶的屏蔽公共访问权限设置和 S3 对象所有权设置。

有关使用批量复制的更多故障排除提示，请参阅[排查 S3 批量操作问题](troubleshooting-batch-operations.md)。

如果您已设置复制但对象未复制，请参阅 AWS re:Post 知识中心中的[在存储桶之间设置复制时，为什么我的 Amazon S3 对象不复制？](https://repost.aws/knowledge-center/s3-troubleshoot-replication)

当使用批量复制时，可能会遇到以下错误之一：
+ 生成清单时未找到符合筛选条件的密钥。

  出现此错误的原因为以下之一：
  + 当源存储桶中的对象存储在 S3 Glacier Flexible Retrieval 或 S3 Glacier Deep Archive 存储类中时。

    要对这些对象使用批量复制，请先在批量操作任务中使用**还原** (`S3InitiateRestoreObjectOperation`) 操作，将它们还原到 S3 Standard 存储类。有关更多信息，请参阅[恢复已归档的对象](restoring-objects.md)和[还原对象（批量操作）](batch-ops-initiate-restore-object.md)。还原对象后，您可以使用批量复制任务来复制它们。
  + 当提供的筛选条件与源存储桶中的任何有效对象都不匹配时。

    验证并更正筛选条件。例如，在批量复制规则中，筛选条件负责查找源存储桶中带有 `Tax/` 前缀的所有对象。如果前缀名称输入不准确，开头和结尾都有一个斜杠（即 `/Tax/`），而不是仅在结尾处有斜杠，则找不到任何 S3 对象。要解决此错误，请更正前缀，在本例中就是将复制规则中的 `/Tax/` 更改为 `Tax/`。
+ 批量操作状态为失败，原因是：无法将任务报告写入报告桶。

  如果用于批量操作任务的 IAM 角色无法将完成报告放到您创建任务时指定的位置，则会出现此错误。要解决此错误，请检查 IAM 角色是否对您要保存批量操作完成报告的存储桶具有 `s3:PutObject` 权限。我们建议将报告发送到与源存储桶不同的存储桶。
+ 批量操作已完成但出现失败，并且失败总数不是 0。

  如果正在运行的批量复制任务存在对象权限不足问题，则会出现此错误。如果您对批量复制任务使用复制规则，请确保用于复制的 IAM 角色具有适当的权限，可访问源存储桶或目标存储桶中的对象。也可以检查[批量复制完成报告](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-batch-replication-batch.html#batch-replication-completion-report)，以查看特定的 [Amazon S3 复制失败原因](https://docs.aws.amazon.com/AmazonS3/latest/userguide/replication-failure-codes.html)。
+ 批量任务成功运行，但目标桶中预期的对象数量不相同。

  当批量复制任务中提供的清单中列出的对象与您在创建任务时选择的筛选条件不匹配时，就会出现此错误。当源桶中的对象与任何复制规则不匹配且未包含在生成的清单中时，您也可能会收到此消息。

### 向现有复制配置添加新的复制规则后，会出现批量操作失败
<a name="new-replication-rule"></a>

批量操作尝试对源桶的复制配置中的每条规则执行现有对象复制。如果任何现有复制规则出现问题，则可能会出现失败。

批量操作任务的完成报告解释了任务失败的原因。有关常见错误的列表，请参阅[Amazon S3 复制失败原因](replication-metrics-events.md#replication-failure-codes)。

# 使用指标、事件通知和状态监控复制
<a name="replication-metrics"></a>

可以通过以下机制监控实时复制配置和 S3 批量复制任务：
+ **S3 复制指标**：当您启用 S3 复制指标时，Amazon CloudWatch 会发出一些指标，可以使用这些指标在复制规则级别跟踪待处理字节、待处理操作和复制延迟。可以通过 Amazon S3 控制台和 Amazon CloudWatch 控制台查看 S3 复制指标。在 Amazon S3 控制台中，可以在源存储桶的**指标**选项卡中查看这些指标。有关 S3 复制指标的更多信息，请参阅[使用 S3 复制指标](repl-metrics.md)。
+ **S3 Storage Lens 存储分析功能指标**：除了 S3 复制指标外，还可以使用 S3 Storage Lens 存储分析功能控制面板提供的与复制相关的数据保护指标。例如，如果使用 S3 Storage Lens 存储分析功能中的免费指标，则可以看到诸如从源存储桶复制的总字节数或从源存储桶复制的对象计数之类的指标。

  要审计总体复制状况，可以在 S3 Storage Lens 存储分析功能中启用高级指标。借助 S3 Storage Lens 存储分析功能中的高级指标，可以查看有多少不同类型的复制规则，包括复制目标无效的复制规则的计数。

  有关在 S3 Storage Lens 存储分析功能中使用复制指标的更多信息，请参阅[在 S3 Storage Lens 存储分析功能控制面板中查看复制指标](viewing-replication-metrics-storage-lens.md)。
+ **S3 事件通知**：当对象未复制到其目标 AWS 区域或未在特定阈值内复制对象时，在这类情况下，S3 事件通知可以在对象级别通知您。S3 事件通知提供以下复制事件类型：`s3:Replication:OperationFailedReplication`、`s3:Replication:OperationMissedThreshold`、`s3:Replication:OperationReplicatedAfterThreshold` 和 `s3:Replication:OperationNotTracked`。

  Amazon S3 事件可以通过 Amazon Simple Queue Service (Amazon SQS)、Amazon Simple Notification Service (Amazon SNS) 或 AWS Lambda 获得。有关更多信息，请参阅 [使用 Amazon S3 事件通知接收复制失败事件](replication-metrics-events.md)。
+ **复制状态值**：还可以检索对象的复制状态。复制状态有助于您确定正在复制的对象的当前状态。源对象的复制状态将返回 `PENDING`、`COMPLETED`、或 `FAILED`。副本的复制状态将返回 `REPLICA`。

  在创建 S3 批量复制任务时，也可以使用复制状态值。例如，可以使用这些状态值来复制从未复制过或复制失败的对象。

  有关检索对象的复制状态的更多信息，请参阅[获取复制状态信息](replication-status.md)。有关将这些值与批量复制结合使用的更多信息，请参阅[分批复制任务的筛选条件](s3-batch-replication-batch.md#batch-replication-filters)。

**Topics**
+ [

# 使用 S3 复制指标
](repl-metrics.md)
+ [

# 在 S3 Storage Lens 存储分析功能控制面板中查看复制指标
](viewing-replication-metrics-storage-lens.md)
+ [

# 使用 Amazon S3 事件通知接收复制失败事件
](replication-metrics-events.md)
+ [

# 获取复制状态信息
](replication-status.md)

# 使用 S3 复制指标
<a name="repl-metrics"></a>

S3 复制指标为复制配置中的复制规则提供了详细的指标。使用复制指标，您可以通过跟踪待复制的字节数、待复制的操作数、复制失败的操作数和复制延迟来逐分钟监控进度。

**注意**  
S3 复制指标的费率与 Amazon CloudWatch 自定义指标费率相同。有关更多信息，请参阅 [Amazon CloudWatch 定价](https://aws.amazon.com/cloudwatch/pricing/)。
如果您使用 S3 Replication Time Control，Amazon CloudWatch 在相应的复制规则上启用 S3 RTC 后 15 分钟开始报告复制指标。

启用 S3 Replication Time Control（S3 RTC）时，将自动开启 S3 复制指标。在[创建或编辑规则](replication-walkthrough1.md)时，还可以独立于 S3 RTC 启用 S3 复制指标。S3 RTC 包含其他功能，例如服务水平协议（SLA）和错过阈值的通知。有关更多信息，请参阅 [使用 S3 Replication Time Control 满足合规性要求](replication-time-control.md)。

启用 S3 复制指标后，Amazon S3 会将以下指标发布到 Amazon CloudWatch。系统将以最大努力传输 CloudWatch 指标。


| 指标名称 | 指标描述 | 该指标适用于哪些对象？ | 该指标在哪个区域发布？ | 如果删除了目标存储桶，仍会发布该指标吗？ | 如果不进行复制，仍会发布该指标吗？ | 
| --- | --- | --- | --- | --- | --- | 
| **待复制的字节数** |  给定复制规则的待复制对象的总字节数。  | 此指标仅适用于通过 S3 Cross-Region Replication（S3 CRR）或 S3 Same-Region Replication（S3 SRR）复制的新对象。 | 该指标发布在目标存储桶的区域中。 | 否 | 是 | 
| **复制延迟** |  对于给定的复制规则，复制目标存储桶落后于源存储桶的最大秒数。  | 此指标仅适用于使用 S3 CRR 或 S3 SRR 复制的新对象。 | 该指标发布在目标存储桶的区域中。 | 否 | 是 | 
| **待复制的操作** |  给定复制规则的待复制操作的数量。此指标跟踪与对象、删除标记、标签、访问控制列表（ACL）和 S3 对象锁定相关的操作。  | 此指标仅适用于使用 S3 CRR 或 S3 SRR 复制的新对象。 | 该指标发布在目标存储桶的区域中。 | 否 | 是 | 
| **复制失败的操作** |  给定复制规则的复制失败的操作数。此指标跟踪与对象、删除标记、标签、访问控制列表（ACL）和对象锁定相关的操作。 **复制失败的操作**跟踪以一分钟为间隔汇总的 S3 复制失败。要确定复制失败的特定对象及其失败原因，请在 Amazon S3 事件通知中订阅 `OperationFailedReplication` 事件。有关更多信息，请参阅 [使用 Amazon S3 事件通知接收复制失败事件](replication-metrics-events.md)。  |  此指标既适用于使用 S3 CRR 或 S3 SRR 复制的新对象，也适用于使用 S3 批量复制所复制的现有对象。  如果 S3 批量复制任务根本无法运行，则指标不会发送到 Amazon CloudWatch。例如，如果您没有运行 S3 批量复制任务所需的权限，或者复制配置中的标签或前缀不匹配，则您的任务将无法运行。   | 该指标发布在源存储桶的区域中。 | 是 | 否 | 

有关使用 CloudWatch 中的这些指标的信息，请参阅 [CloudWatch 中的 S3 复制指标](metrics-dimensions.md#s3-cloudwatch-replication-metrics)。

## 启用 S3 复制指标
<a name="enabling-replication-metrics"></a>

您可以开始将 S3 复制指标与新的或现有的复制规则结合使用。有关创建复制规则的完整说明，请参阅 [针对同一账户中的存储桶配置复制](replication-walkthrough1.md)。您可以选择将复制规则应用于整个 S3 存储桶，或应用于具有特定前缀或标签的 Amazon S3 对象。

本主题提供了在源和目标存储桶由相同或不同的 AWS 账户拥有时，在复制配置中启用 S3 复制指标的说明。

要使用 AWS Command Line Interface（AWS CLI）启用复制指标，您必须向启用 `Metrics` 的源存储桶添加复制配置。在此示例配置中，以 `Tax` 为前缀的对象将复制到目标存储桶 `amzn-s3-demo-bucket`，并为这些对象生成指标。

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

## 查看复制指标
<a name="viewing-replication-metrics"></a>

在 Amazon S3 控制台中，可以在源通用存储桶的**指标**选项卡中查看 S3 复制指标。Amazon CloudWatch 控制台中也提供了这些 Amazon CloudWatch 指标。当您启用 S3 复制指标时，Amazon CloudWatch 会发出一些指标，您可以使用这些指标在复制规则级别跟踪待处理字节、待处理操作和复制延迟。

当您通过 Amazon S3 控制台或 Amazon S3 REST API 使用 S3 Replication Time Control（S3 RTC）启用复制时，S3 复制指标将自动开启。在[创建或编辑规则](replication-walkthrough1.md)时，还可以独立于 S3 RTC 启用 S3 复制指标。

如果您使用 S3 Replication Time Control，Amazon CloudWatch 在相应的复制规则上启用 S3 RTC 后 15 分钟开始报告复制指标。有关更多信息，请参阅 [使用 S3 复制指标](#repl-metrics)。

复制指标跟踪复制配置的规则 ID。复制规则 ID 可以特定于前缀、标签或两者的组合。

 有关 Amazon S3 的 CloudWatch 指标的更多信息，请参阅 [使用 Amazon CloudWatch 监控指标](cloudwatch-monitoring.md)。

**先决条件**  
创建启用了 S3 复制指标的复制规则。有关更多信息，请参阅 [启用 S3 复制指标](#enabling-replication-metrics)。

**通过源存储桶的**指标**选项卡查看 S3 复制指标**

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

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

1. 在存储桶列表中，选择您要获取其复制指标的对象所在的源存储桶的名称。

1. 选择**指标**选项卡。

1. 在**复制指标**下，选择要查看其指标的复制规则。

1. 请选择 **Display charts (显示图表)**。

   Amazon S3 针对您选择的指标显示**复制延迟**、**待复制的字节数**、**待复制的操作**和**复制失败的操作**图表。

# 在 S3 Storage Lens 存储分析功能控制面板中查看复制指标
<a name="viewing-replication-metrics-storage-lens"></a>

除了 [S3 复制指标](repl-metrics.md)外，还可以使用 S3 Storage Lens 存储分析功能提供的与复制相关的数据保护指标。S3 Storage Lens 存储统计管理工具是一项云存储分析功能，您可以使用它在整个组织范围内了解对象存储的使用情况和活动。有关更多信息，请参阅[使用 S3 Storage Lens 存储统计管理工具保护您的数据](https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage-lens-data-protection.html#storage-lens-data-protection-replication-rule)。

S3 Storage Lens 存储分析功能具有两层指标：免费指标以及高级指标和建议，您可以支付额外费用升级到高级指标和建议。借助高级指标和建议，您可以访问其他指标和功能，以深入了解您的存储。有关 S3 Storage Lens 存储统计管理工具定价的信息，请参阅 [Amazon S3 定价](https://aws.amazon.com/s3/pricing)。

如果您使用 S3 Storage Lens 存储分析功能中的免费指标，则可以看到诸如从源存储桶复制的总字节数或从源存储桶复制的对象计数之类的指标。

要审计总体复制状况，可以在 S3 Storage Lens 存储分析功能中启用高级指标。借助 S3 Storage Lens 存储分析功能中的高级指标，可以查看有多少不同类型的复制规则，包括复制目标无效的复制规则的计数。

有关 S3 Storage Lens 存储分析功能指标的完整列表，包括每个层中的复制指标，请参阅 [S3 Storage Lens 存储分析功能指标词汇表](https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage_lens_metrics_glossary.html?icmpid=docs_s3_user_guide_replication.html)。

**先决条件**  
创建[实时复制配置](replication-how-setup.md)或 [S3 批量复制任务](s3-batch-replication-batch.md)。

**在 Amazon S3 Storage Lens 存储统计管理工具中查看复制指标**

1. 创建 S3 Storage Lens 存储分析功能控制面板。如需分步指导，请参阅 [使用 S3 控制台](storage_lens_creating_dashboard.md#storage_lens_console_creating)。

1. （可选）在控制面板设置过程中，如果要查看所有 S3 Storage Lens 存储分析功能复制指标，请选择**高级指标和建议**，然后选择**高级数据保护指标**。有关指标的完整列表，请参阅 [S3 Storage Lens 存储统计管理工具指标词汇表](https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage_lens_metrics_glossary.html?icmpid=docs_s3_user_guide_replication.html)。

   如果您启用高级指标和建议，则可以进一步了解您的复制配置。例如，可以使用 S3 Storage Lens 存储分析功能复制规则计数指标，来获取有关配置为进行复制的存储桶的详细信息。此信息包括桶和区域内部以及跨桶和区域的复制规则。有关更多信息，请参阅 [计算每个桶的复制规则总计数](storage-lens-data-protection.md#storage-lens-data-protection-replication-rule)。

1. 创建控制面板后，打开控制面板，然后选择**存储桶**选项卡。

1. 向下滚动到 **Bucket**（桶）部分。在 **Metrics categories**（指标类别）下，选择 **Data protection**（数据保护）。然后清除 **Summary**（摘要）。

1. 要筛选**存储桶**列表以仅显示复制指标，请选择首选项图标（![\[The preferences icon in the S3 Storage Lens dashboard.\]](http://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/images/preferences.png)）。

1. 清除所有数据保护指标的切换开关，直到只有复制指标保持选中状态。

1. （可选）在 **Page size**（页面大小）下，选择要在列表中显示的桶数。

1. 选择**继续**。

# 使用 Amazon S3 事件通知接收复制失败事件
<a name="replication-metrics-events"></a>

如果在复制配置中启用了 S3 复制指标，则可以设置 Amazon S3 事件通知，以便在对象未复制到目标 AWS 区域时通知您。如果在复制配置中启用了 S3 Replication Time Control（S3 RTC），则当未在 15 分钟的 S3 RTC 复制阈值内复制对象时，您也会收到通知。

通过使用以下 `Replication` 事件类型，可以通过跟踪待处理字节数、待处理的操作和复制延迟来逐分钟监控复制事件的进度。有关 S3 复制指标的更多信息，请参阅[使用 S3 复制指标](repl-metrics.md)。
+ 当符合复制条件的对象复制失败时，`s3:Replication:OperationFailedReplication` 事件类型将通知您。
+ 当符合复制（使用 S3 RTC）条件的对象超过 15 分钟的复制阈值时，`s3:Replication:OperationMissedThreshold` 事件类型将通知您。
+ 当符合复制（使用 S3 RTC）条件的对象在 15 分钟阈值后复制时，`s3:Replication:OperationReplicatedAfterThreshold` 事件类型将通知您。
+ 当符合实时复制（同区域复制 [SRR] 或跨区域复制 [CRR]）条件的对象不再受复制指标跟踪时，`s3:Replication:OperationNotTracked` 事件类型会通知您。

有关所有受支持的复制事件类型的完整描述，请参阅 [SQS、SNS 和 Lambda 支持的事件类型](notification-how-to-event-types-and-destinations.md#supported-notification-event-types)。

有关 S3 事件通知捕获的故障代码的列表，请参阅 [Amazon S3 复制失败原因](#replication-failure-codes)。

您可以通过 Amazon Simple Queue Service（Amazon SQS）、Amazon Simple Notification Service（Amazon SNS）或 AWS Lambda 接收 S3 事件通知。有关更多信息，请参阅 [Amazon S3 事件通知](EventNotifications.md)。

有关如何配置 Amazon S3 事件通知的说明，请参阅 [Enabling event notifications](how-to-enable-disable-notification-intro.md)（启用事件通知）。

**注意**  
除了启用事件通知外，还要确保您也启用 S3 复制指标。有关更多信息，请参阅 [启用 S3 复制指标](repl-metrics.md#enabling-replication-metrics)。

以下是 Amazon S3 发送以发布 `s3:Replication:OperationFailedReplication` 事件的消息示例。有关更多信息，请参阅 [事件消息结构](notification-content-structure.md)。

```
{
  "Records": [
    {
      "eventVersion": "2.2",
      "eventSource": "aws:s3",
      "awsRegion": "us-east-1",
      "eventTime": "2024-09-05T21:04:32.527Z",
      "eventName": "Replication:OperationFailedReplication",
      "userIdentity": {
        "principalId": "s3.amazonaws.com"
      },
      "requestParameters": {
        "sourceIPAddress": "s3.amazonaws.com"
      },
      "responseElements": {
        "x-amz-request-id": "123bf045-2b4b-4ca8-a211-c34a63c59426",
        "x-amz-id-2": "12VAWNDIHnwJsRhTccqQTeAPoXQmRt22KkewMV8G3XZihAuf9CLDdmkApgZzudaIe2KlLfDqGS0="
      },
      "s3": {
        "s3SchemaVersion": "1.0",
        "configurationId": "ReplicationEventName",
        "bucket": {
          "name": "amzn-s3-demo-bucket1",
          "ownerIdentity": {
            "principalId": "111122223333"
          },
          "arn": "arn:aws:s3:::amzn-s3-demo-bucket1"
        },
        "object": {
          "key": "replication-object-put-test.png",
          "size": 520080,
          "eTag": "e12345ca7e88a38428305d3ff7fcb99f",
          "versionId": "abcdeH0Xp66ep__QDjR76LK7Gc9X4wKO",
          "sequencer": "0066DA1CBF104C0D51"
        }
      },
      "replicationEventData": {
        "replicationRuleId": "notification-test-replication-rule",
        "destinationBucket": "arn:aws:s3:::amzn-s3-demo-bucket2",
        "s3Operation": "OBJECT_PUT",
        "requestTime": "2024-09-05T21:03:59.168Z",
        "failureReason": "AssumeRoleNotPermitted"
      }
    }
  ]
}
```

## Amazon S3 复制失败原因
<a name="replication-failure-codes"></a>

下表列出了 Amazon S3 复制失败原因。可以通过 Amazon S3 事件通知接收 `s3:Replication:OperationFailedReplication` 事件，然后查看 `failureReason` 值，来查看这些原因。

还可以在 S3 批量复制完成报告中查看这些失败原因。有关更多信息，请参阅 [分批复制完成报告](s3-batch-replication-batch.md#batch-replication-completion-report)。


| 复制失败原因 | 说明 | 
| --- | --- | 
| `AssumeRoleNotPermitted` | Amazon S3 无法代入在复制配置或批量操作任务中指定的 AWS Identity and Access Management（IAM）角色。 | 
| `DstBucketInvalidRegion` | 目标存储桶未处于由批量操作任务指定的同一个 AWS 区域中。此错误特定于分批复制。 | 
| `DstBucketNotFound` | Amazon S3 找不到在复制配置中指定的目标存储桶。 | 
| `DstBucketObjectLockConfigMissing` | 要在启用对象锁定的情况下从源存储桶复制对象，目标存储桶也必须启用对象锁定。此错误表示目标存储桶中可能未启用对象锁定。有关更多信息，请参阅 [对象锁定注意事项](object-lock-managing.md)。 | 
| `DstBucketUnversioned` | 未为 S3 目标存储桶启用版本控制。要使用 S3 复制来复制对象，请对目标存储桶启用版本控制。 | 
| `DstDelObjNotPermitted` | Amazon S3 无法将删除标记复制到目标存储桶。针对目标存储桶的 `s3:ReplicateDelete` 权限可能缺失。 | 
| `DstKmsKeyInvalidState` | 适用于目标存储桶的 AWS Key Management Service（AWS KMS）密钥处于无效状态。查看并启用所需的 AWS KMS 密钥。有关管理 AWS KMS 密钥的更多信息，请参阅《AWS Key Management Service 开发人员指南》**中的 [AWS KMS 密钥的密钥状态](https://docs.aws.amazon.com/kms/latest/developerguide/key-state.html)。 | 
| `DstKmsKeyNotFound` | 在复制配置中为目标存储桶配置的 AWS KMS 密钥不存在。 | 
| `DstMultipartCompleteNotPermitted` | Amazon S3 无法完成目标存储桶中对象的分段上传。针对目标存储桶的 `s3:ReplicateObject` 权限可能缺失。 | 
| `DstMultipartInitNotPermitted` | Amazon S3 无法启动将对象分段上传到目标存储桶。针对目标存储桶的 `s3:ReplicateObject` 权限可能缺失。 | 
| `DstMultipartUploadNotPermitted` | Amazon S3 无法将分段上传对象上传到目标存储桶。针对目标存储桶的 `s3:ReplicateObject` 权限可能缺失。 | 
| `DstObjectHardDeleted` | S3 分批复制不支持重新复制从目标存储桶中使用对象的版本 ID 删除的对象。此错误特定于分批复制。 | 
| `DstPutAclNotPermitted` | Amazon S3 无法将对象访问控制列表（ACL）复制到目标存储桶。针对目标存储桶的 `s3:ReplicateObject` 权限可能缺失。 | 
| `DstPutLegalHoldNotPermitted` | 在复制不可变对象时，Amazon S3 无法对目标对象设置对象锁定法定保留。针对目标存储桶的 `s3:PutObjectLegalHold` 权限可能缺失。有关更多信息，请参阅 [法定保留](object-lock.md#object-lock-legal-holds)。 | 
|  `DstPutObjectNotPermitted` | Amazon S3 无法将对象复制到目标存储桶。当目标存储桶缺少所需权限（`s3:ReplicateObject` 或 `s3:ObjectOwnerOverrideToBucketOwner` 权限）或 AWS KMS 密钥策略不支持源存储桶的复制角色在目标存储桶上使用 AWS KMS 密钥（`kms:Decrypt` 和 `kms:GenerateDataKey*` 操作）时，就会发生这种情况。 | 
|  `DstPutRetentionNotPermitted` | 在复制不可变对象时，Amazon S3 无法对目标对象设置保留期。针对目标存储桶的 `s3:PutObjectRetention` 权限可能缺失。 | 
| `DstPutTaggingNotPermitted` | Amazon S3 无法将对象标签复制到目标存储桶。针对目标存储桶的 `s3:ReplicateObject` 权限可能缺失。 | 
| `DstVersionNotFound ` | Amazon S3 无法在目标存储桶中找到需要复制其元数据的所需对象版本。 | 
| `InitiateReplicationNotPermitted` | Amazon S3 无法在对象上启动复制。批量操作任务可能缺少 `s3:InitiateReplication` 权限。此错误特定于分批复制。 | 
| `SrcBucketInvalidRegion` | 源存储桶未处于批量操作任务指定的同一个 AWS 区域中。此错误特定于分批复制。 | 
| `SrcBucketNotFound` | Amazon S3 找不到源存储桶。 | 
| `SrcBucketReplicationConfigMissing` | Amazon S3 找不到源存储桶的复制配置。 | 
| `SrcGetAclNotPermitted` |  Amazon S3 无法访问源存储桶中要复制的对象。针对源存储桶对象的 `s3:GetObjectVersionAcl` 权限可能缺失。 源存储桶中的对象必须由存储桶拥有者所有。如果启用了 ACL，则验证应将“对象所有权”设置为“首选存储桶拥有者”还是“对象编写者”。如果将“对象所有权”设置为“首选存储桶拥有者”，则源存储桶对象必须具有 `bucket-owner-full-control` ACL，存储桶拥有者才能成为对象拥有者。源账户可以通过将“对象所有权”设置为“强制存储桶拥有者”并禁用 ACL，从而获取其存储桶中所有对象的所有权。  | 
| `SrcGetLegalHoldNotPermitted` | Amazon S3 无法访问 S3 对象锁定法定保留信息。 | 
| `SrcGetObjectNotPermitted` | Amazon S3 无法访问源存储桶中要复制的对象。针对源存储桶的 `s3:GetObjectVersionForReplication` 权限可能缺失。 | 
| `SrcGetRetentionNotPermitted` | Amazon S3 无法访问 S3 对象锁定保留期信息。 | 
| `SrcGetTaggingNotPermitted` | Amazon S3 无法从源存储桶访问对象标签信息。针对源存储桶的 `s3:GetObjectVersionTagging` 权限可能缺失。 | 
| `SrcHeadObjectNotPermitted` | Amazon S3 无法从源存储桶检索对象元数据。针对源存储桶的 `s3:GetObjectVersionForReplication` 权限可能缺失。 | 
| `SrcKeyNotFound` | Amazon S3 找不到要复制的源对象密钥。源对象可能在复制完成之前已被删除。 | 
| `SrcKmsKeyInvalidState` | 适用于源存储桶的 AWS KMS 密钥处于无效状态。查看并启用所需的 AWS KMS 密钥。有关管理 AWS KMS 密钥的更多信息，请参阅《AWS Key Management Service 开发人员指南》**中的 [AWS KMS 密钥的密钥状态](https://docs.aws.amazon.com/kms/latest/developerguide/key-state.html)。 | 
| `SrcObjectNotEligible` | 某些对象不符合复制条件。这可能是由于对象的存储类或对象标签与复制配置不匹配所致。 | 
| `SrcObjectNotFound` | 源对象不存在。 | 
| `SrcReplicationNotPending` | Amazon S3 已经复制了此对象。此对象不再处于待复制状态。 | 
| `SrcVersionNotFound` | Amazon S3 找不到要复制的源对象版本。源对象版本可能在复制完成之前已被删除。 | 

### 相关主题
<a name="replication-metrics-related-topics"></a>

[为实时复制设置权限](setting-repl-config-perm-overview.md)

[对复制进行问题排查](replication-troubleshoot.md)

# 获取复制状态信息
<a name="replication-status"></a>

复制状态可以帮助您确定正在复制的对象的当前状态。源对象的复制状态将返回 `PENDING`、`COMPLETED`、或 `FAILED`。副本的复制状态将返回 `REPLICA`。

在创建 S3 批量复制任务时，也可以使用复制状态值。例如，可以使用这些状态值来复制从未复制过或复制失败的对象。有关将这些值与批量复制结合使用的更多信息，请参阅[将复制状态信息和批量复制任务结合使用](#replication-status-batch-replication)。

**Topics**
+ [

## 复制状态概述
](#replication-status-overview)
+ [

## 复制到多个目标存储桶时的复制状态
](#replication-status-multiple-destinations)
+ [

## 启用了 Amazon S3 副本修改同步时的复制状态
](#replication-status-replica-mod-syn)
+ [

## 将复制状态信息和批量复制任务结合使用
](#replication-status-batch-replication)
+ [

## 查找复制状态
](#replication-status-usage)

## 复制状态概述
<a name="replication-status-overview"></a>

在复制中，您有一个源存储桶（对它配置复制）和一个或多个目标存储桶（Amazon S3 将对象复制到其中）。当您请求这些存储桶中的对象（使用 `GetObject`）或对象元数据（使用 `HeadObject`）时，Amazon S3 将在响应中返回 `x-amz-replication-status` 标头：
+ 如果请求源存储桶中的对象，Amazon S3 将返回 `x-amz-replication-status` 标头（如果请求中的对象符合复制条件）。

  例如，假设您在复制配置中指定了对象前缀 `TaxDocs`，以指示 Amazon S3 仅复制键名前缀为 `TaxDocs` 的对象。您上传的具有此键名前缀的任何对象（例如 `TaxDocs/document1.pdf`）都将复制。对于具有此键名前缀的对象请求，Amazon S3 会返回其对象复制状态为以下值之一的 `x-amz-replication-status` 标头：`PENDING`、`COMPLETED` 或 `FAILED`。
**注意**  
如果在上传对象后对象复制失败，您无法重试复制。必须再次上传该对象，或者必须使用 S3 批量复制来复制任何失败的对象。有关使用批量复制的更多信息，请参阅[使用批量复制以复制现有对象](s3-batch-replication-batch.md)。  
对象会因缺少复制角色权限、AWS Key Management Service（AWS KMS）权限或存储桶权限等问题而转换为 `FAILED` 状态。对于临时性故障（例如，在存储桶或区域不可用的情况下），复制状态将不会转换为 `FAILED`，而保持 `PENDING`。在资源重新联机后，Amazon S3 将继续复制这些对象。
+ 当请求目标存储桶中的对象时，如果请求中的对象是 Amazon S3 创建的副本，Amazon S3 会返回值为 `REPLICA` 的 `x-amz-replication-status` 标头。

**注意**  
在从启用了复制的源存储桶中删除对象之前，请检查该对象的复制状态，以确保已复制了该对象。  
如果对源存储桶启用了 S3 生命周期配置，则 Amazon S3 将暂停生命周期操作，直到它将对象的状态标记为 `COMPLETED` 或 `FAILED`。

## 复制到多个目标存储桶时的复制状态
<a name="replication-status-multiple-destinations"></a>

将对象复制到多个目标存储桶时，`x-amz-replication-status` 标头的作用有所不同。仅当向所有目标的复制都成功时，源对象的标头才返回 `COMPLETED` 值。在完成所有目标的复制之前，标头将保持 `PENDING` 值。如果一个或多个目标复制失败，则标头返回 `FAILED`。

## 启用了 Amazon S3 副本修改同步时的复制状态
<a name="replication-status-replica-mod-syn"></a>

当您的复制规则启用了 Amazon S3 副本修改同步时，副本可能报告 `REPLICA` 以外的状态。如果元数据更改正在复制过程中，`x-amz-replication-status` 标头返回 `PENDING`。如果副本修改同步无法复制元数据，则标头返回 `FAILED`。如果正确复制元数据，则副本将返回标头 `REPLICA`。

## 将复制状态信息和批量复制任务结合使用
<a name="replication-status-batch-replication"></a>

在创建批量复制任务时，可以选择指定其它筛选条件，例如对象创建日期和复制状态，来缩小任务的范围。

您可以通过提供以下一个或多个值基于 `ObjectReplicationStatuses` 值筛选要复制的对象：
+ `"NONE"` – 表示 Amazon S3 之前从未尝试过复制对象。
+ `"FAILED"` – 表示 Amazon S3 之前尝试过，但未成功复制对象。
+ `"COMPLETED"` – 表示 Amazon S3 之前已成功复制对象。
+ `"REPLICA"` – 表示这是 Amazon S3 已从另一个源复制的副本对象。

有关将这些复制状态与批量复制结合使用的更多信息，请参阅[分批复制任务的筛选条件](s3-batch-replication-batch.md#batch-replication-filters)。

## 查找复制状态
<a name="replication-status-usage"></a>

要获取存储桶中对象的复制状态，可以使用 Amazon S3 清单工具。Amazon S3 会向目标存储桶发送一个您在清单配置中指定的 CSV 文件。您还可以使用 Amazon Athena 在清单报告中查询复制状态。有关 Amazon S3 清单的更多信息，请参阅 [使用 S3 清单对数据进行编目和分析](storage-inventory.md)。

还可以使用 Amazon S3 控制台、AWS Command Line Interface（AWS CLI）或 AWS SDK 来查找对象复制状态。

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

在 Amazon S3 控制台中，可以在对象的详细信息页面上查看对象的复制状态。

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

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

1. 在**通用存储桶**列表中，选择复制源存储桶的名称。

1. 在 **Objects (对象)** 列表中，请选择对象名称。此时将显示对象的详细信息页面。

1. 在**属性**选项卡上，向下滚动至**对象管理概述**部分。在**管理配置**下，查看**复制状态**下的值。

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

使用以下 AWS Command Line Interface（AWS CLI）`head-object` 命令检索对象元数据，如以下示例所示。将 `amzn-s3-demo-source-bucket1` 替换为复制源存储桶的名称，并将另一个 `user input placeholders` 替换为您自己的信息。

```
aws s3api head-object --bucket amzn-s3-demo-source-bucket1 --key object-key --version-id object-version-id           
```

该命令会返回对象元数据（包括 `ReplicationStatus`），如以下示例响应所示。

```
{
   "AcceptRanges":"bytes",
   "ContentType":"image/jpeg",
   "LastModified":"Mon, 23 Mar 2015 21:02:29 GMT",
   "ContentLength":3191,
   "ReplicationStatus":"COMPLETED",
   "VersionId":"jfnW.HIMOfYiD_9rGbSkmroXsFj3fqZ.",
   "ETag":"\"6805f2cfc46c0f04559748bb039d69ae\"",
   "Metadata":{

   }
}
```

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

以下代码段分别使用适用于 Java 的 AWS SDK 和适用于 .NET 的 AWS SDK 获取复制状态。

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

```
GetObjectMetadataRequest metadataRequest = new GetObjectMetadataRequest(bucketName, key);
ObjectMetadata metadata = s3Client.getObjectMetadata(metadataRequest);

System.out.println("Replication Status : " + metadata.getRawMetadataValue(Headers.OBJECT_REPLICATION_STATUS));
```

------
#### [ .NET ]

```
GetObjectMetadataRequest getmetadataRequest = new GetObjectMetadataRequest
    {
         BucketName = sourceBucket,
         Key        = objectKey
    };

GetObjectMetadataResponse getmetadataResponse = client.GetObjectMetadata(getmetadataRequest);
Console.WriteLine("Object replication status: {0}", getmetadataResponse.ReplicationStatus);
```

------