ちょっと話題の記事

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

こんにちは。サービス部の武田です。Amazon S3 イベント通知は、以前は「稀に失われる」と書かれていましたが現在は「少なくとも1回配信」となっています。ドキュメントの更新履歴を追ってみました。
2022.08.09

こんにちは。サービス部の武田です。

AWSではサービスのアップデートなどによって、それまでの常識やベストプラクティスは日々変化します。Amazon S3には イベント通知 という機能があり、オブジェクト作成や削除などをトリガーとして、Lambda関数などを実行できます。

さてこのイベント通知ですが、「たまに抜けることがある」という仕様上の注意がかつて存在しており、頭を抱えた開発者も多いのではないでしょうか。とはいえそれが常識でした。「かつて」と書いたように、実は現在の仕様ではその部分は削除され、代わりに At least once(少なくとも1回配信) となっています。

最近まで知らなかったので、確認も兼ねてドキュメントの修正履歴を追ってみました。

2020-02-14のドキュメント修正

まずこの修正で「イベントが失われる可能性がある」の一文が削除されました。

修正前の原文がこちら。

Amazon S3 event notifications typically deliver events in seconds but can sometimes take a minute or longer. On very rare occasions, events might be lost. If your application requires particular semantics (for example, ensuring that no events are missed, or that operations run only once), we recommend that you account for missed and duplicate events when designing your application. You can audit for missed events by using the LIST Objects API or Amazon S3 Inventory reports. The LIST Objects API and Amazon S3 inventory reports are subject to eventual consistency and might not reflect recently added or deleted objects.

機械翻訳したものはこちらです。

Amazon S3のイベント通知は、通常数秒でイベントを配信しますが、時には1分以上かかることがあります。非常に稀なケースとして、イベントが失われる可能性があります。 アプリケーションが特定のセマンティクス(例えば、イベントが見逃されないようにする、または操作が一度だけ実行されるようにする)を必要とする場合、アプリケーションを設計する際に、見逃されたイベントと重複するイベントを考慮することをお勧めします。LIST Objects APIまたはAmazon S3インベントリレポートを使用して、見逃したイベントを監査することができます。LIST Objects API と Amazon S3 インベントリレポートは、最終的な整合性に左右されるため、最近追加または削除されたオブジェクトが反映されない場合があります。

続いて修正後の原文がこちら。

Amazon S3 event notifications typically deliver events in seconds but can sometimes take a minute or longer. If two writes are made to a single non-versioned object at the same time, it is possible that only a single event notification will be sent. If you want to ensure that an event notification is sent for every successful write, you can enable versioning on your bucket. With versioning, every successful write will create a new version of your object and will also send an event notification.

機械翻訳したものはこちら。「非常に稀なケースとして、イベントが失われる可能性があります」の部分が削除されていますね。また、この時点では At least once は明言されていません。

Amazon S3のイベント通知は、通常数秒でイベントを配信しますが、時には1分以上かかることがあります。 もし、バージョン管理されていない1つのオブジェクトに同時に2つの書き込みが行われた場合、1つのイベント通知しか送信されない可能性があります。もし、書き込みが成功するたびにイベント通知が送られるようにしたい場合は、Bucket のバージョニングを有効にすることができます。バージョニングを有効にすると、書き込みが成功するたびにオブジェクトの新しいバージョンが作成され、イベント通知も送信されます。

2020-05-08のドキュメント修正

その約3ヵ月後に、 At least once の一文が追加されました。

修正されたのは先ほどの文章の一文目です。原文を再掲します。

Amazon S3 event notifications typically deliver events in seconds but can sometimes take a minute or longer.

機械翻訳したものはこれでした。

Amazon S3のイベント通知は、通常数秒でイベントを配信しますが、時には1分以上かかることがあります。

これが次のように修正されています。

Amazon S3 event notifications are designed to be delivered at least once. Typically, event notifications are delivered in seconds but can sometimes take a minute or longer.

機械翻訳したものはこちら。「少なくとも一度は配信されるように」と書かれるようになりました。2022年8月現在、この文章が最新版となっています。

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

まとめ

At least onceに仕様変更されていたことを知らなかったので調べてみました。これが明示されたことによって、これまで諦めていた構成を構築できるようになるシステムもあるのではないでしょうか。ただし重複してイベント通知される可能性はあるため、システム側で同じメッセージを複数回受け取っても大丈夫なようにする必要があります。また、Amazon S3の障害が必ず起きないという保証はありません。その場合は通知されない可能性があることも念頭に置く必要がありますので注意してください。

参考リンク

おまけ

仕様変更に伴い、ナレッジセンターの記事は削除されていました。

  • https://aws.amazon.com/jp/premiumsupport/knowledge-center/s3-verify-event-notification/