多くのAWS顧客が、コスト効率の高く高いスケーラビリティを誇る永続化領域として、また一時的なオブジェクトストレージとしてAmazon Simple Storage Service (S3)を利用して、アプリケーションを構築しています。 その中の顧客から、オブジェクトがS3に入ったときに、何かしらの初期化プロセスを行いたいという要望を持っています。 またトラッキングやセキュリティのため、オブジェクトについて、ログを取りたいという要望を持っています。 これらの顧客から、S3オブジェクトが作成された時または上書きされたとき、どのようにして信頼性が高くスケーラブルな方法で通知を受けられるかという質問を頂くことがあります。
S3 Event Notifications
本日、我々はS3の新しいイベント通知機能をローンチします。あるバケットのオーナー(もしくはIAMで権限を許可されたユーザー)は、新しいオブジェクトがバケットに追加されたり、既存オブジェクトが上書きされたときに通知を送る先として、Amazon Simple Queue Service (SQS) もしくは Amazon Simple Notification Service (SNS) を選択することができます。また通知は、Lambda functionで処理するためにAWS Lambdaに通知を送ることも出来ます。以下がよく使われる処理フローです。
以下が、あなたのアプリケーションでこの新しい機能を利用するための手順です。
- ターゲットとして、キュー、トピックもしくは必要であればLambda functionを作成する
- 各ターゲットへのパブリッシュ、もしくはLambda function呼び出しが出来るよう、S3の権限を設定する。SNSとSQSについては、トピックやキューにポリシーを適用する。Lambdaについては、IAMロールを作成し、Lambda functionに適用する
- あなたのアプリケーションを、各ターゲットのアクティビティが発生した際に呼び出されるように設定する。これについてはいくつか選択肢があります
- バケットの通知設定を行い、ターゲットを設定する
S3で発生したイベントは、適切なターゲットに送信されます。 通知はバケットレベルで設定され、そのバケット内のすべてのオブジェクトにその設定が適用されます。(我々はより細かいレベルでのコントロールも検討しています)
以下のイベントのうち、いくつかもしくはすべての通知を受信することができます:
- s3:ObjectCreated:Put - HTTP PUTの操作により、オブジェクトが作成された時
- s3:ObjectCreated:Post - HTTP POSTの操作により、オブジェクトが作成された時
- s3:ObjectCreated:Copy - S3コピーの操作により、オブジェクトが作成された時
- s3:ObjectCreated:CompleteMultipartUpload - S3マルチパートアップロードが完了し、オブジェクトが作成された時
- s3:ObjectCreated:* - オブジェクトが、上記のイベントもしくは将来的に追加されるイベントで作成された時
- s3:ReducedRedundancyObjectLost - 低冗長化で保存されているS3オブジェクトがロストした時
通知についての詳細
各通知は以下の内容を含むJSONオブジェクトとして送信されます:
- Region
- Timestamp
- Event Type (上記のリストで示したイベント)
- Request Actor Principal ID
- リクエストのSource IP
- Request ID
- Host ID
- Notification Configuration Destination ID
- バケット名
- バケットARN
- Bucket Owner Principal ID
- オブジェクトのキー(オブジェクトの名前)
- オブジェクトのサイズ
- オブジェクトのETag
- オブジェクトのバージョンID(もしバケットでバージョニングを有効に為ていた場合)
また既にご存じかと思いますが、S3は結果整合性をもって動作します。オブジェクトが作成された通知を受けたとき、 新しいオブジェクトがレプリケーションされておらず、GET操作時に古いコピーが返される可能性もあります。
この場合に古いオブジェクトかどうかを確認する方法として、通知に含まれている新しいオブジェクトのETagを利用できます。 あなたのコードがGET操作をした時に、処理前にETagを使って確認をする事ができます。ETagがマッチしない場合は、 処理を遅らせるためにターゲットのSNSやSQSにメッセージを再度ポストすることができます。 なおこの結果整合性は、既存のオブジェクトが上書きされた場合に発生します。
コンソールを使った通知設定
以下に、AWS Management Consoleを使ったイベント通知の設定方法を紹介します。
私は、jbarr-uploadという名前のバケットを持っており、イベント通知をjbarr-upload-notifyと名付けたSNSトピックに送りたいとします。 既にこのトピックが私にメールを送る設定が済んでいます。
S3がこのトピックに通知を送れるよう権限設定するところから開始します:
そして、私のトピックにバケットが通知を送るように設定します:
メニューを使って、どのイベント種類を利用するかを設定します:
試しに、コンソールを使ってオブジェクトをアップロードしてみます:
以下が、メールで受け取った結果です(読みやすくするために、JSONをフォーマットしています):
私は、皆さんがこの機能を使ってご自身のアプリケーションに活用頂けることを確信しています。またもちろん、AWS SDKを使って通知の設定や管理をして頂くことも可能です。
知っておきべき事
以下に、皆様のアプリケーションでこの通知機能を使う際に知っておいた方がよい項目を列挙します:
- 配送遅延 - 通知はターゲットに対して数秒の内に通知されます コスト - この機能を利用するのは無料です。SQSやSNS、そしてLambdaの利用については費用が必要です(ただし多くのアプリケーションはAWSの無料利用枠に収まると思います)
- リージョン - バケットとターゲット(SQS,SNSもしくはLambda)は同一のAWSリージョン内にある必要があります
- イベント種類 - 1つのバケットに対して、1つのイベント種類と1つの通知を設定できます 送信の信頼性 - S3は非常に高い信頼性での配送を行います。さまざまなターゲットへの配送時に起こる問題へ対応するため、リトライやバックオフの機能が組み込まれています
- 追加のイベント種類 - 我々は将来的に、イベント種類を追加しますが、皆様からのフィードバックが、優先順位付けをするときに非常に参考になります。是非S3フォーラムへのフィードバックをお願いします。
お使い頂けます!
この機能は今日からご利用頂けます!この機能をどのように使ったか、そのフィードバックを楽しみにしています!