

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