バケット間のレプリケーションを設定したにもかかわらず、Amazon S3 オブジェクトが複製されない原因を教えてください。
Amazon Simple Storage Service (Amazon S3) 汎用バケット間にレプリケーションを設定しましたが、AWS リージョンが同一かどうかにかかわらず、オブジェクトは宛先バケットに複製されません。
簡単な説明
注: Amazon S3 レプリケーションは汎用バケットにのみ使用できます。ディレクトリバケットとテーブルバケットにはレプリケーションを使用できません。
クロスリージョンレプリケーション (CRR) または同一リージョンレプリケーション (SRR) でAmazon S3 オブジェクトが複製されない問題をトラブルシューティングするには、宛先バケットの権限を確認します。さらに、パブリックアクセスとバケット所有権の設定を確認します。
レプリケーション失敗の原因を解決した後も、依然として複製されないオブジェクトがソースバケットに存在する可能性があります。Amazon S3 レプリケーションは、デフォルトでは既存オブジェクトとレプリケーションステータスが FAILED または REPLICA であるオブジェクトを複製しません。オブジェクトのレプリケーションステータスを確認する方法については、「Amazon S3 バケット間でレプリケーションに失敗したオブジェクトを確認する方法を教えてください」を参照してください。これらのオブジェクトには、S3 Batch Replication を実行します。
解決策
レプリケーション設定の問題を特定する
ソースバケットにオブジェクトをアップロードし、構成変更ごとにレプリケーションをテストします。レプリケーション設定の問題を特定するには、一度に 1 つずつ構成項目を変更することをおすすめします。
さらに、s3:Replication:OperationFailedReplication イベントタイプ通知を有効にし、障害の原因を判断します。
最低限の Amazon S3 権限を付与する
レプリケーションルールで使用した AWS Identity Access Management (IAM) ロールに正しい権限が付与されていることを確認します。ソースバケットと宛先バケットが別々の AWS アカウントに配置されている場合は、宛先アカウントのバケットポリシーがレプリケーションロールに権限を付与していることを確認します。次の例では、IAM ポリシーにはレプリケーションに必要な、最小限の権限が含まれています。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetReplicationConfiguration", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::SourceBucket" ] }, { "Effect": "Allow", "Action": [ "s3:GetObjectVersionForReplication", "s3:GetObjectVersionAcl", "s3:GetObjectVersionTagging" ], "Resource": [ "arn:aws:s3:::SourceBucket/*" ] }, { "Effect": "Allow", "Action": [ "s3:ReplicateObject", "s3:ReplicateTags" ], "Resource": "arn:aws:s3:::DestinationBucket/*" } ] }
注: SourceBucket をソースバケットに、DestinationBucket を宛先バケットに置き換えてください。
レプリケーションルールのオプションによっては、追加の権限を付与する必要が生じる場合があります。
IAM ロールには、Amazon S3 がオブジェクトをレプリケートするロールを引き受けることを許可する信頼ポリシーが必要です。信頼ポリシーの例:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "s3.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
追加の Amazon S3 権限を付与する
レプリケーションルールを [オブジェクト所有権を宛先バケット所有者に変更] に変更する場合、追加の権限を構成する必要があります。
注:宛先バケットのオブジェクト所有権設定がバケット所有者強制である場合は、レプリケーションルールでオブジェクトの所有権を宛先バケット所有者に変更する必要はありません。この変更は、デフォルトで行われます。
IAM ロールに s3:ObjectOwnerOverrideToBucketOwner 権限を付与するには、次の権限を Amazon S3 オブジェクトポリシーに追加します。
{ "Effect": "Allow", "Action": [ "s3:ObjectOwnerOverrideToBucketOwner" ], "Resource": "arn:aws:s3:::DestinationBucket/*" }
注: DestinationBucket を宛先バケットに置き換えてください。
さらに、次の s3:ObjectOwnerOverrideToBucketOwner 権限を宛先アカウントのバケットポリシーに追加します。
{ "Sid": "1", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::SourceBucket-account-ID:role/service-role/source-account-IAM-role" }, "Action": [ "s3:ObjectOwnerOverrideToBucketOwner" ], "Resource": "arn:aws:s3:::DestinationBucket/*" }
注: SourceBucket-account-ID をソースバケットのアカウントに、source-account-IAM-role をソースアカウントの IAM ロールに、DestinationBucket を宛先バケットに置き換えてください。
レプリケーションルールで削除マーカーのレプリケーションが有効になっている場合、IAM ロールには次の s3:ReplicateDelete 権限が必要です。
{ "Effect": "Allow", "Action": [ "s3:ReplicateDelete" ], "Resource": "arn:aws:s3:::DestinationBucket/*" }
注: DestinationBucket を宛先バケットに置き換えてください。
宛先バケットが別のアカウントに配置されている場合、宛先バケットの所有者もバケットポリシーに次の権限を追加する必要があります。
{ "Version": "2012-10-17", "Id": "PolicyForDestinationBucket", "Statement": [ { "Sid": "Permissions on objects", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::SourceBucket-account-ID:role/service-role/source-account-IAM-role" }, "Action": [ "s3:ReplicateObject", "s3:ReplicateTags", "s3:ObjectOwnerOverrideToBucketOwner", "s3:ReplicateDelete" ], "Resource": "arn:aws:s3:::DestinationBucket/*" }, { "Sid": "Permissions on bucket", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::SourceBucket-account-ID:role/service-role/source-account-IAM-role" }, "Action": [ "s3:GetBucketVersioning", "s3:PutBucketVersioning" ], "Resource": "arn:aws:s3:::DestinationBucket" } ] }
注: arn:aws:iam::SourceBucket-account-ID:role/service-role/source-account-IAM-role をレプリケーションロールの Amazon リソースネーム (ARN) に、DestinationBucket を宛先バケットに置き換えてください。
AWS KMS 権限を付与する
バケットのソースオブジェクトを AWS Key Management Service (AWS KMS) キーで暗号化した場合は、レプリケーションルールには、KMS 暗号化が必要です。
必須権限を構成するには、次の手順を実行します。
- Amazon S3 コンソールを開きます。
- ソースバケットを選択します。
- [管理] タブを選択し、[レプリケーションルール] で目的のレプリケーションルールを選択します。
- [編集] を選択します。
- [暗号化] で [AWS KMS で暗号化されたオブジェクトをレプリケートする] を選択します。
- [宛先オブジェクトの暗号化に使用する AWS KMS キー] で AWS KMS キーを選択します。デフォルトのオプションでは、AWS KMS キー (aws/S3) を使用します。
レプリケーションポリシーの例は、「ポリシー例 - レプリケーションで SSE-S3 と SSE-KMS を使用する」を参照してください。
注: 宛先バケットが別のアカウントに属する場合は、宛先アカウントが所有する AWS KMS カスタマーマネージドキーを指定します。デフォルトの aws/S3 キーは、ソースアカウントが所有する AWS マネージドキーを使用してオブジェクトを暗号化します。なお、AWS マネージドキーは別のアカウントと共有できません。
クロスアカウントのシナリオにおいて、追加の AWS KMS 権限を付与する
宛先アカウントの AWS KMS キーを使用して宛先オブジェクトを暗号化するには、宛先アカウントはキーポリシーでレプリケーションロールを許可する必要があります。ポリシー例:
{ "Sid": "AllowS3ReplicationSourceRoleToUseTheKey", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::SourceBucket-account-ID:role/service-role/source-account-IAM-role" }, "Action": [ "kms:GenerateDataKey", "kms:Encrypt" ], "Resource": "*" }
注: arn:aws:iam::SourceBucket-account-ID:role/service-role/source-account-IAM-role をレプリケーションロールの ARN に置き換えてください。Resource にアスタリスク (*) を使用した場合、ポリシーは権限をレプリケーションロールにのみ付与します。なお、このポリシーでは、レプリケーションロールが権限を拡張することはできません。
また、次の最小特権をソースアカウントからレプリケーションロールの IAM ポリシーに追加する必要があります。
[ { "Effect": "Allow", "Action": [ "kms:Decrypt", "kms:GenerateDataKey" ], "Resource": [ "SourceKmsKeyArn" ] }, { "Effect": "Allow", "Action": [ "kms:GenerateDataKey", "kms:Encrypt" ], "Resource": [ "DestinationKmsKeyArn" ] } ]
デフォルトでは、AWS KMS キーポリシーはキーに対するすべてのアクセス許可をルートユーザーに付与します。これらのアクセス許可は、同じアカウントの他のユーザーに委任することができます。IAM ポリシーを使用することで、ソース KMS キーにレプリケーションロール権限を付与することもできます。この構成は、ソースの AWS KMS キーポリシーに Deny ステートメントが存在する場合を除き、必須のアクセス権を許可します。
明示的 deny ステートメントおよび条件付き allow ステートメントの有無を確認する
重要: 明示的 Deny ステートメントを削除する前に、そのステートメントが存在する根拠と、そのステートメントがデータセキュリティに影響するかどうかを確認してください。
権限の検証後、オブジェクトが依然として複製されない場合は、レプリケーション失敗の原因となる Deny ステートメントの有無を確認します。
宛先バケットのポリシーまたは AWS KMS キーポリシーにおいて、次のリソースへのアクセスを制限している Deny ステートメントを削除します。
- 特定の CIDR 範囲
- 仮想プライベートクラウド (VPC) エンドポイント
- Amazon S3 アクセスポイント
さらに、ソースアカウントと宛先アカウントの両方において、IAM ロールポリシーと AWS Organizations サービスコントロールポリシー (SCP) から Deny ステートメントまたは権限境界を削除します。
S3 バケットキーの有無を確認する
ソースまたは宛先の AWS KMS キーが暗号化コンテキストに基づき権限を付与する場合は、S3 バケットキーが使用されているかどうかを確認します。バケットが S3 バケットキーを使用している場合、暗号化コンテキストはバケットレベルのリソースを対象とする必要があります。暗号化コンテキストの例:
"kms:EncryptionContext:aws:s3:arn": ["arn:aws:s3:::SOURCE_BUCKET_NAME"] "kms:EncryptionContext:aws:s3:arn": ["arn:aws:s3:::DESTINATION_BUCKET_NAME"]
注: SOURCE_BUCKET_NAME をソースバケットに、DESTINATION_BUCKET_NAME を宛先バケットに置き換えてください。
ソースバケットにも宛先バケットにも S3 バケットキーを使用していない場合、暗号化コンテキストはオブジェクトレベルのリソースである必要があります。暗号化コンテキストの例:
"kms:EncryptionContext:aws:s3:arn": ["arn:aws:s3:::SOURCE_BUCKET_NAME/*"] "kms:EncryptionContext:aws:s3:arn": ["arn:aws:s3:::DESTINATION_BUCKET_NAME/*"]
注: SOURCE_BUCKET_NAME をソースバケットに、DESTINATION_BUCKET_NAME を宛先バケットに置き換えてください。
オブジェクト ACL を確認する
ソースバケットと宛先バケットがアクセスをブロックする原因となるアクセス制御リスト (ACL) を使用しているかどうかを確認します。オブジェクトにはパブリックアクセスを許可する ACL が存在するものの、宛先バケットは S3 Block Public Access を使用している場合、レプリケーションは失敗します。
ソースオブジェクトの所有権を確認する
別の AWS アカウントからソースバケットにオブジェクトをアップロードした場合、ソースアカウントはそれらのオブジェクトへのアクセス権を持たない可能性があります。ソースバケットで ACL が有効になっていることを確認します。
ソースバケットで ACL が無効化されている場合、ソースアカウントがバケット内のすべてのオブジェクトの所有者です。ソースバケットで ACL が有効な場合は、オブジェクト所有権がオブジェクト所有者優先、バケット所有者優先のどちらであるか確認します。所有権がバケット所有者優先に設定されている場合、ソースバケットのオブジェクトには ACL 権限 bucket-owner-full-control が必要です。
ソースアカウントは、ACL を無効化することで、バケット内のすべてのオブジェクトの所有権を取得することができます。ほとんどのユースケースでは、アクセス管理に ACL は必須ではありません。Amazon S3 リソースへのアクセスを管理するには、代わりに IAM とバケットポリシーを使用することをおすすめします。ACL を無効にする前に、バケットと IAM ポリシーは、既存の Amazon S3 アクセスを維持するために必要な権限を付与していることを確認してください。
正しいレプリケーションルールのフィルターを指定する
レプリケーションルールのフィルターを正しく指定したことを確認します。
ルールフィルターをキープレフィックスとオブジェクトタグを組み合わせて指定した場合、Amazon S3 は論理 AND 演算を行います。ルールは、特定のキープレフィックスと特定のタグを持つオブジェクトのサブセットに適用されます。

