バケット間にレプリケーションを設定しましたが、新しいオブジェクトがレプリケートされません。この問題をトラブルシューティングするにはどうすればよいですか?

最終更新日: 2022 年 3 月 30 日

Amazon Simple Storage Service (Amazon S3) バケット間でクロスリージョンレプリケーション (CRR) または同一リージョンレプリケーション (SRR) を設定しましたが、オブジェクトがレプリケート先バケットにレプリケートされません。どうすれば修正できますか?

解決方法

レプリケート先バケットにレプリケートされないオブジェクトをトラブルシューティングするには、バケット用のさまざまな種類の許可を確認します。また、パブリックアクセス設定とバケット所有権設定も確認します。

ヒント: レプリケート元バケットにオブジェクトをアップロードして、設定を変更するたびにレプリケーションをテストするようにしてください。レプリケーション設定の問題を特定するために、一度に 1 つの構成変更を行うのがベストプラクティスです。

レプリケーションが失敗する原因となっている問題の解決後に、レプリケートされなかったオブジェクトがレプリケート元バケットに存在している可能性があります。デフォルトでは、S3 レプリケーションは、既存のオブジェクトや、レプリケーションステータスが [FAILED] または [REPLICA] のオブジェクトをレプリケートしません。S3 バッチレプリケーションを使用して、これらのオブジェクトをレプリケートします。

Amazon S3 の最小限の許可

AWS Identity Access Management (IAM) ロールに正しい許可があることを確認します。レプリケート元バケットとレプリケート先バケットが異なるアカウントにある場合は、レプリケート先アカウントのバケットポリシーがレプリケーションロールにも十分な許可を付与していることを確認します。

以下の例は、レプリケーションに最小限必要な許可を持つ 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/*"
        }
    ]
}

: SourceBucketDestinationBucket は、S3 バケットの名前に置き換えてください。

IAM ロールには、Amazon S3 がオブジェクトをレプリケートするロールを引き受けることを許可する信頼ポリシーが必要です。例:

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

レプリケート先バケットが別のアカウントにある場合、レプリケート先バケットポリシーは次の許可を付与する必要があります。

{
    "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"
            ],
            "Resource": "arn:aws:s3:::DestinationBucket/*"
        }
    ]
}

: arn:aws:iam::123456789101:role/s3-replication-role をレプリケーションロールの ARN に置き換えてください。    

Amazon S3 のその他の許可

レプリケーションルールが [Change object ownership to the destination bucket owner] (オブジェクト所有者をレプリケート先のバケット所有者に変更) に設定されている場合、IAM ロールには s3:ObjectOwnerOverrideToBucketOwner 許可が必要です。この許可は S3 オブジェクトリソースに付与されます。例:

{
    "Effect":"Allow",
         "Action":[
       "s3:ObjectOwnerOverrideToBucketOwner"
    ],
    "Resource":"arn:aws:s3:::DestinationBucket/*"
}

また、レプリケート先アカウントは、バケットポリシーを通じて s3:ObjectOwnerOverrideToBucketOwner 許可を付与する必要があります。

{
  "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:::DestinationBucket/*"
    }
  ]
}

注: レプリケート先バケットのオブジェクト所有者設定に [Bucket owner enforced] (バケット所有者の強制) が含まれている場合、レプリケーションルールでオブジェクトの所有権をレプリケート先のバケット所有者に変更する必要はありません。この変更はデフォルトで行われます。

レプリケーションルールで削除マーカーレプリケーションがアクティブ化されている場合、IAM ロールには s3:ReplicateDelete 許可が必要です。レプリケート先バケットが別のアカウントにある場合、レプリケート先のバケット所有者はバケットポリシーを通じてこの許可を付与する必要もあります。例:

{
    "Effect":"Allow",
         "Action":[
       "s3:ReplicateDelete"
    ],
    "Resource":"arn:aws:s3:::DestinationBucket/*"

}

: DestinationBucket を、ご利用の S3 バケットの名前に置き換えてください。

レプリケート先バケットのバケットポリシーを通じて、同じ許可を付与する必要もあります。

{
  "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",
        "s3:ReplicateDelete"
      ],
      "Resource": "arn:aws:s3:::DestinationBucket/*"
    }
  ]
}

AWS KMS 許可

バケットのソースオブジェクトが AWS Key Management Service (AWS KMS) キーで暗号化されている場合、KMS で暗号化されたオブジェクトを含めるようにレプリケーションルールを設定する必要があります。

AWS KMS で暗号化されたオブジェクトを含めるには:

1.    Amazon S3 コンソールを開きます。

2.    レプリケート元オブジェクトを含む S3 バケットを選択します。

3.    [Management] (管理) タブで、レプリケーションルールを選択します。

5.    [Edit] (編集) を選択します。

6.    [Encryption] (暗号化) で、[Replicate objects encrypted with AWS KMS] (AWS KMS で暗号化されたオブジェクトをレプリケートする) を選択します。

7.    [AWS KMS key for encrypting destination objects] (レプリケート先オブジェクトを暗号化するための AWS KMS キー) で、AWS KMS キーを選択します。デフォルトでは、AWS KMS キー (aws/S3) を使用するオプションが選択されています。

重要: レプリケート先バケットが別の AWS アカウントにある場合は、レプリケート先アカウントが所有する KMS カスタマーマネージドキーを指定します。デフォルトの aws/S3 キーは使用しないでください。これにより、レプリケート元アカウントが所有する AWS マネージドキーでオブジェクトが暗号化され、別のアカウントと共有することはできません。その結果、レプリケート先アカウントはレプリケート先バケット内のオブジェクトにアクセスできなくなります。

レプリケート先アカウントに属する AWS KMS キーを使用してレプリケート先オブジェクトを暗号化するには、レプリケート先アカウントが KMS キーポリシーでレプリケーションロールを付与する必要があります。

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

注: AWS KMS キーポリシーで Resource にアスタリスク (*) を使用すると、このポリシーは KMS キーの許可をレプリケーションロールにのみ付与します。このポリシーでは、レプリケーションロールが許可を昇格させることは許可されていません。

さらに、レプリケート元アカウントは、レプリケーションロールの IAM ポリシーに次の最小限の許可を追加する必要があります。

{
    "Effect": "Allow",
    "Action": [
        "kms:Decrypt",
        "kms:GenerateDataKey"
    ],
    "Resource": [
        "SourceKmsKeyArn"
    ]
},
{
    "Effect": "Allow",
    "Action": [
        "kms:GenerateDataKey",
        "kms:Encrypt"
    ],
    "Resource": [
        "DestinationKmsKeyArn"
    ]
}

デフォルトでは、KMS キーポリシーは、キーに対する完全な許可をルートユーザーに付与します。これらの許可は、同じアカウント内の他のユーザーに委任できます。レプリケート元の KMS キーポリシーに拒否ステートメントが含まれていない限り、IAM ポリシーを使用してレプリケーションロールにレプリケート元の KMS キーへの許可を付与するだけで十分です。

明示的拒否および条件付き許可のステートメント

許可を検証してもオブジェクトがレプリケートされない場合は、明示的拒否のステートメントがないかを確認します。

  • レプリケート先バケットポリシーの拒否ステートメント、または特定の CIDR 範囲、VPC エンドポイント、もしくは S3 アクセスポイントへのアクセスを制限する KMS キーポリシーを使用すると、レプリケーションが失敗することがあります。
  • IAM ロールにアタッチされた拒否ステートメントまたは許可の境界が原因で、レプリケーションが失敗することがあります。
  • AWS Organizations サービスコントロールポリシーの拒否ステートメントがレプリケート元アカウントまたはレプリケート先アカウントにアタッチされると、レプリケーションが失敗することがあります。

ヒント: 明示的拒否のステートメントを削除する前に、拒否を使用する理由を確認し、そのステートメントがデータセキュリティに影響を及ぼしているかどうかを判断してください。

レプリケート元またはレプリケート先の KMS キーが暗号化コンテキストに基づいて許可を付与する場合は、バケット用に 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_NAMEDESTINATION_BUCKET_NAME を、レプリケート元バケットとレプリケート先バケットの名前に置き換えてください。    

レプリケート元またはレプリケート先のバケットでバケットキーがオンになっていない場合、暗号化コンテキストはオブジェクトレベルのリソースである必要があります。

"kms:EncryptionContext:aws:s3:arn": [
     "arn:aws:s3:::SOURCE_BUCKET_NAME/*"
     ]
"kms:EncryptionContext:aws:s3:arn": [
     "arn:aws:s3:::DESTINATION_BUCKET_NAME/*"
     ]

: SOURCE_BUCKET_NAMEDESTINATION_BUCKET_NAME を、レプリケート元バケットとレプリケート先バケットの名前に置き換えてください。

オブジェクト ACL とブロックパブリックアクセス

レプリケート元バケットとレプリケート先バケットで ACL が使用されているかどうかを確認します。オブジェクトにパブリックアクセスを許可する ACL がアタッチされているが、レプリケート先バケットがブロックパブリックアクセスを使用している場合、レプリケーションは失敗します。

レプリケート元オブジェクト所有者

レプリケート元バケット内のオブジェクトが別の AWS アカウントによってアップロードされた場合、レプリケート元アカウントにはそれらのオブジェクトに対する許可がない可能性があります。レプリケート元バケットで ACL が非アクティブ化されていないかを確認します。レプリケート元バケットの ACL が非アクティブ化されている場合、レプリケート元アカウントはバケット内のすべてのオブジェクトの所有者です。レプリケート元バケットの ACL が非アクティブ化されていない場合は、[Object Ownership] (オブジェクト所有者) が [Object owner preferred] (オブジェクト所有者優先) または [Bucket owner preferred] (バケット所有者優先) に設定されているかどうかを確認します。バケットが [Bucket owner preferred] (バケット所有者優先) に設定されている場合、バケット所有者がオブジェクト所有者になるには、レプリケート元バケットオブジェクトに bucket-owner-full-control ACL が必要です。

レプリケート元アカウントは ACL を非アクティブ化することで、バケット内のすべてのオブジェクトの所有権を取得できます。ほとんどのユースケースでは、アクセス管理に ACL を使用する必要はありません。IAM とバケットポリシーを使用して S3 リソースへのアクセスを管理するのがベストプラクティスです。S3 バケットの ACL を非アクティブ化するには、「オブジェクトの所有権の制御とバケットの ACL の無効化」を参照してください。バケットとオブジェクトにおける ACL の現在の使用状況を必ず評価してください。現在のバケットと IAM ポリシーでは、Amazon S3 アクセスに影響を与えずに ACL を非アクティブ化できるように、十分な許可を付与する必要があります。


この記事はお役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?