1回の操作に対して複数の S3 イベント通知が発生する事象への対処方法

S3 イベント通知は、1 つの操作につき 1 つのイベント配信ではなく、1 つの操作につき「少なくとも」1 つのイベント配信となります。
2024.05.01

困っていること

Amazon S3 バケットへ新しいオブジェクトを保存した際に、イベント通知をする設定を行いました。

また、イベントの通知メッセージの送信先として、AWS Lambda を指定しました。

稀に、1 つのオブジェクトの保存操作に対して、複数のイベント通知が発生し、Lambda 関数の実行が重複する事象が発生します。

どう解消すれば良いでしょうか。

どう対応すればいいの?

始めに、Amazon S3 イベント通知は 1 つのイベントに対して、少なくとも 1 回配信される設計となっています。

そのため、重複することを前提とした設計が必要となります。

対処法として、重複したイベント通知は sequencer キーが同一となるため、値を保存して比較し、各イベント通知が処理されるたびに重複をチェックする機構を作成ください。

参考資料

Amazon S3 イベント通知 - Amazon Simple Storage Service

Amazon S3 イベント通知は、少なくとも 1 回配信されるように設計されています。通常、イベント通知は数秒で配信されますが、1 分以上かかる場合もあります。

同じ S3 イベントの重複メッセージを SQS で解決する | AWS re:Post

特定のオブジェクトイベントの重複イベント通知の値は、シーケンサーキーの値と同じです。

イベントメッセージの構造 - Amazon Simple Storage Service

イベントのシーケンスを決定する方法の 1 つとして、sequencer キーがあります。イベントが発生した順序でイベント通知が届く保証はありません。ただし、オブジェクト (PUT) を作成するイベントからの通知 と削除オブジェクトは sequencer を含みます。これは、特定のオブジェクトキーのイベントの順序を決定するために使用できます。

同じオブジェクトキーに対する 2 つのイベント通知の sequencer の文字列を比較すると、sequencer の 16 進値が大きいほうのイベント通知が後に発生したイベントであることがわかります。イベント通知を使用して Amazon S3 オブジェクトの別のデータベースまたはインデックスを維持している場合は、イベント通知を処理するたびに sequencer の値を比較し、保存することを推奨します。

Amazon S3のイベント通知は「稀に失われる」から「少なくとも1回配信」になっていました | DevelopersIO