

# S3 Replication Time Control (S3 RTC)を使用してコンプライアンス要件を満たす
<a name="replication-time-control"></a>

S3 Replication Time Control (S3 RTC) では、データレプリケーションに関するコンプライアンス要件 (またはビジネス要件) への対応をサポートします。また、Amazon S3 レプリケーション時間を可視化します。S3 RTC は、Amazon S3 にアップロードしたほとんどのオブジェクトを数秒でレプリケートします。99.9% のオブジェクトが 15 分以内にレプリケートされます。

デフォルトでは、S3 RTC にはレプリケーションの進行状況を追跡する 2 つの方法があります。
+ **S3 レプリケーションメトリクス** – S3 レプリケーションメトリクスを使用すると、レプリケーションを保留している S3 API オペレーションの合計数、レプリケーションを保留しているオブジェクトの合計サイズ、およびレプリケート先のリージョンへの最大レプリケーション時間、およびレプリケーションに失敗したオペレーションの合計数をモニタリングできます。次に、個別にレプリケートする各データセットをモニタリングできます。S3 レプリケーションメトリクスは、S3 RTC とは別に有効化することもできます。詳細については、「[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 は、オブジェクトレプリケーションが 15 分のしきい値を超えた場合、またはしきい値の後に発生した場合に、バケット所有者に通知する `OperationMissedThreshold` および `OperationReplicatedAfterThreshold` イベントを提供します。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>

S3 Replication Time Control (S3 RTC) を有効にして Amazon S3 にデータをレプリケートする場合は、以下のベストプラクティスガイドラインに従って、ワークロードのレプリケーションパフォーマンスを最適化します。

**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 レプリケーション のストレージをアップロードおよび取得する際に、リクエストパフォーマンスで 1 秒あたり何千ものトランザクションを達成できます。例えば、アプリケーションは S3 バケットでプレフィックスあたり毎秒 3,500 個以上の `PUT`/`COPY`/`POST`/`DELETE` リクエストまたは 5,500 個以上の `GET`/`HEAD` リクエストを処理できます。これには、S3 レプリケーションがユーザーに代わって行うリクエストも含まれます。バケット内のプレフィックスの数に制限はありません。読み取りを並列化することによって読み取りまたは書き込みのパフォーマンスを向上させることができます。例えば、S3 バケットに 10 個のプレフィックスを作成して読み取りを並列化すると、読み取りパフォーマンスを 1 秒あたり 55,000 回の読み取りリクエストにスケールできます。

Amazon S3 は、これらのガイドラインを上回る持続的なリクエストレートや、`LIST` リクエストで同時実行される持続的なリクエストレートに応じて自動的にスケールします。Amazon S3 が新しいリクエストレートに合わせて最適化を行っている間、最適化が完了するまで一時的に HTTP 503 リクエストレスポンスが送信される場合があります。この動作は、1 秒あたりのリクエスト数が増加したときや、S3 RTC を初めて有効にしたときに発生する場合があります。この間は、レプリケーションのレイテンシーが増加する可能性があります。S3 RTC サービスレベルアグリーメント (SLA) は、1 秒あたりのリクエストに関する Amazon S3 パフォーマンスガイドラインを超えた期間には適用されません。

S3 RTC SLA は、レプリケーションデータ転送速度がデフォルトの 1 Gbps クォータ制限を超えた期間にも適用されません。レプリケーション転送速度が 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 レプリケーションがレプリケート元に最大 5 件の `GET`/`HEAD` リクエストと 1 件の `PUT` リクエストを行い、レプリケート先バケットに 1 件の `PUT` リクエストを行います。

例えば、1 秒あたり 100 個のオブジェクトをレプリケートする場合、Amazon S3 レプリケーションはユーザーに代わって 100 件の `PUT` リクエストを追加で実行する可能性があります。つまり、レプリケート元 S3 バケットに対して 1 秒あたり合計 200 個の `PUT` リクエストが実行されることになります。Amazon S3 レプリケーションでは、最大 500 件の `GET`/`HEAD` (レプリケートされたオブジェクトごとに 5 件の `GET`/`HEAD` リクエスト) を実行する可能性があります。

**注記**  
レプリケートされたオブジェクトごとに 1 つの `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 は、リクエストレートが 1 秒あたりのリクエスト数のクォータを超えているために (そうでなければ) 有効なリクエストを拒否することがあります。リクエストが抑制調整されると、AWS KMS は `ThrottlingException` エラーを返します。AWS KMS リクエストレートのクォータは、ユーザーが直接行うリクエストと、ユーザーに代わって Amazon S3 レプリケーションが行うリクエストに適用されます。

例えば、1 秒あたり 1,000 個のオブジェクトをレプリケートする場合、AWS KMS リクエストレートのクォータから 2,000 個のリクエストを差し引くことができます。差し引いた後の 1 秒あたりのリクエストレートを、レプリケーションを除く AWS KMS ワークロードで使用できます。[AWS KMSAmazon CloudWatch でリクエストメトリクス](https://docs.aws.amazon.com/kms/latest/developerguide/monitoring-cloudwatch.html)を使用して、AWS アカウント の合計 AWS KMS リクエストレートをモニタリングできます。

1 秒あたりの AWS KMS リクエストのクォータ数の増加をリクエストするには、[AWS サポート センター](https://console.aws.amazon.com/support/home#/)に問い合わせるか、[Service Quotas](https://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html) を使用します。

## S3 レプリケーション時間コントロールの有効化
<a name="replication-walkthrough-5"></a>

新しいレプリケーションルールまたは既存のレプリケーションルールで S3 Replication Time Control (S3 RTC) の使用を開始できます。レプリケーションルールを バケット全体に適用するか、特定のプレフィックスやタグを持つオブジェクトに適用するかを選択できます。S3 RTC を有効にすると、レプリケーションルールで S3 レプリケーションメトリクスも有効になります。

S3 RTC は、Amazon S3 コンソール、Amazon S3 API、AWS SDK、AWS Command Line Interface (AWS CLI) を使用して設定することができます。

**Topics**

### S3 コンソールの使用
<a name="replication-ex5-console"></a>

手順については、「[同じアカウントでのバケットのレプリケーションの設定](replication-walkthrough1.md)」を参照してください。このトピックでは、レプリケート元バケットとレプリケーション先バケットが同じまたは異なる AWS アカウントで所有されている場合に、レプリケーション設定で S3 レプリケーション RTC を有効にする手順について説明します。

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

AWS CLI を使用して S3 RTC が有効になったオブジェクトをレプリケートするには、バケットを作成し、バケットのバージョニングを有効にします。さらに、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` です。

### AWS SDK for Java の使用
<a name="replication-ex5-sdk"></a>

 有効にした S3 Replication Time Control (S3 RTC) でレプリケーション設定を追加する Java の例は、次のとおりです。

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