S3 オブジェクトのレプリケーション失敗を通知する方法
困っていた内容
- S3オブジェクトのレプリケーション失敗を通知したい
バージョニングが有効なバケットまたはバージョニングが停止されたバケットの場合、レプリケーションステータスが Pending または Failed のオブジェクトをライフサイクルによって移行や削除することはできず [1] [2]、そのままバケットに残り続けます。しかしながら、レプリケーションの失敗は設定をしない場合通知されません。
そのため、本記事ではレプリケーションの失敗を通知するよう、S3 イベント通知を設定してみます。
[1] Amazon S3 ライフサイクルを使用したオブジェクトの移行 - Amazon Simple Storage Service
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/lifecycle-transition-general-considerations.html#lifecycle-general-considerations-transition-sc
バージョニングが有効なバケットまたはバージョニングが停止されたバケットの場合、レプリケーションステータスが Pending または Failed のオブジェクトを移行することはできません。
[2] オブジェクトの有効期限 - Amazon Simple Storage Service
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/lifecycle-expire-general-considerations.html
レプリケーションステータスが Pending または Failed のオブジェクトの場合、オブジェクトの現在のバージョンまたは以前のバージョンに対して Amazon S3 はアクションを実行しません。
いきなりまとめ
S3 オブジェクトのレプリケーション失敗を通知するには、以下の設定を行います。
- レプリケーションメトリクスを有効化する、またはレプリケーション設定で S3 Replication Time Control (S3 RTC) を有効化する
- S3 イベント通知を作成し、イベントタイプで 「オブジェクトのレプリケートに失敗しました」 を選択する
では、1つずつ確認してみましょう。
準備
今回の検証で作成したリソースは以下のとおりです。
- バージョニングを有効化した S3 バケット 2つ(レプリケーション元、レプリケーション先)
- SNSトピックとサブスクリプション(今回はSNS経由でメール通知します)
SNSトピックとサブスクリプション設定
S3 イベント通知では送信先として Amazon SNS、Amazon SQS、または Lambda 通知を指定する必要があります。
今回は AmazonSNS を使用するため、事前にトピックとサブスクリプションを設定します。
SNS トピックの設定は以下のとおりです。

続いて、作成したトピックにサブスクリプションを作成します。

サブスクリプションを作成すると、ステータスが「保留中の確認」になります。
エンドポイントに指定したメールアドレス宛に確認メールが送信されるので、本文中の「Confirm subscription」を押下してサブスクリプション登録をします。
SNS の設定は以上です。
S3 レプリケーションルール作成
S3 の設定を進める前に、バージョニングを有効化した S3 バケット 2つ(レプリケーション元、レプリケーション先)用意します。今回は以下の 2 つを作成しました。
・test-replicate-source-bucket(レプリケーション元)
・test-replicate-replica-bucket(レプリケーション先)
冒頭のまとめでも記載しましたが、レプリケーションの失敗を S3 イベント通知で通知するためには、レプリケーションメトリクスを有効化する、またはレプリケーション設定で S3 Replication Time Control (S3 RTC) を有効化する必要があります。[3]
[3] Amazon S3 イベント通知によるレプリケーション失敗イベントの受信 - Amazon Simple Storage Service
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/replication-metrics-events.html
レプリケーション設定で S3 レプリケーションメトリクスを有効にしている場合は、Amazon S3 イベント通知を設定して、オブジェクトが宛先 AWS リージョンにレプリケートされない場合に通知を受けることができます。レプリケーション設定で S3 Replication Time Control (S3 RTC) を有効にしている場合、レプリケーションの 15 分間の S3 RTC しきい値内にオブジェクトがレプリケートされない場合にも通知を受け取ることができます。
今回はレプリケーションメトリクスを有効化して検証します。
レプリケーションメトリクスの有効化は、レプリケーションルール作成画面または既存のルール編集画面で設定できます。
以下のとおり、レプリケーション元のバケットにレプリケーションルールを作成します。



S3 イベント通知設定
次は レプリケーション元のバケットに S3 イベント通知を設定していきます。
今回はレプリケーション失敗を通知したいので、イベントタイプで「オブジェクトのレプリケートに失敗しました」を選択します。


送信先として、事前に作成した SNS トピックを選択します。

レプリケーションを拒否するバケットポリシーを設定
今回レプリケーションを失敗させるために、レプリケーション先のバケットポリシーで「レプリケーション先バケットへのレプリケーション」を拒否します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DenyReplicationForTesting",
"Effect": "Deny",
"Principal": "*",
"Action": [
"s3:ReplicateObject",
"s3:ReplicateDelete",
"s3:ReplicateTags"
],
"Resource": "arn:aws:s3:::test-replicate-replica-bucket/*"
}
]
}
動作確認
実際にレプリケーション元のバケットにオブジェクトをアップロードし、レプリケーションが失敗しメールで通知されるかを確認します。
レプリケーション元のバケットにオブジェクトをアップロード

しばらく時間をおいて、アップロードしたオブジェクトの詳細画面でレプリケーションステータスを確認します。

FAILED になっていますね。
メールも受信できました。

メール本文には以下のように記載がありました。
"s3":{"s3SchemaVersion":"1.0","configurationId":"replication-failed","bucket":{"name":"test-replicate-source-bucket","ownerIdentity":{"principalId":"XXXXXXXXXXXX"},"arn":"arn:aws:s3:::test-replicate-source-bucket"},"object":{"key":"test1.txt","size":5,
(中略)
"replicationEventData":{"replicationRuleId":"replication-rule","destinationBucket":"arn:aws:s3:::test-replicate-replica-bucket","s3Operation":"OBJECT_PUT","requestTime":"2026-06-01T12:31:04.565Z","failureReason":"DstPutObjectNotPermitted"}}]}
メール本文から以下のような情報が分かります。
- イベント通知元バケット
- オブジェクトのキー
- 失敗した理由
など...
レプリケーション失敗の原因については、以下のドキュメントをご参照ください。
Amazon S3 イベント通知によるレプリケーション失敗イベントの受信 - Amazon Simple Storage Service
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/replication-metrics-events.html#replication-failure-codes
DstPutObjectNotPermitted
Amazon S3 は、レプリケート先バケットにオブジェクトをレプリケートできません。これは、レプリケート先バケットに必要なアクセス許可 (s3:ReplicateObject または s3:ObjectOwnerOverrideToBucketOwner アクセス許可) がない場合、または AWS KMS キーポリシーによってソースのレプリケーションロールが宛先バケットで AWS KMS キー (kms:Decrypt および kms:GenerateDataKey* アクション) を使用することが許可されていない場合に発生する可能性があります。
今回はレプリケーション先のバケットポリシーでレプリケーションを拒否しているので、正常に動作していると見受けられます。
まとめ
今回は S3 イベント通知を設定することでレプリケーション失敗を通知することができました。
冒頭でも触れましたが、レプリケーションに失敗したオブジェクトに対してはライフサイクルが適用されずそのまま残ってしまいます。それを防ぐためにも、ぜひ S3 イベント通知の動作確認をしてみてください。





