こんにちは。 ディベロップメントサービス1課の山本です。
最近、リモートワークでの運動不足を感じてジムに入会しました。
基礎代謝を上げるために、下半身マッチョを目指してます。
今回はAmazon S3(以下、S3)のイベント通知をAmazon EventBridgeで受け取る際の注意点を説明します。 一歩間違えれば意図しないイベントを検知して、大量のコストがかかってしまう恐れがあります。
はじめに
下記のような構築をしていた際のことでした。
ファイルの処理も問題ないため、S3のストレージ料金を減らそうと思い加工済みのS3ファイルのストレージクラスを一括で変更致しました。
この後、とんでもない事が発生しました。
発生した問題
数百以上のファイルのストレージクラスを変更後、
翌日AWS Fargateのタスクを見ると、上限100タスクに張り付いていました。
通常運用ではありえないことなので急いで確認すると、
何故かAmazon EventBridgeがストレージクラスの変更をファイル生成とみなして、イベント通知をしていました。
原因
Amazon EventBridgeのルールをマネジメントコンソール上から作成したのですが、
この際監視イベントを安易にObject Created
に指定した事が原因です。
Object Created
が監視するS3のAPIは下記の4つ
- PutObject
- POSTObject
- CopyObject
- CompleteMultipartUpload
ストレージクラスの変更で使用されるS3 APIを後で調査したところ、CopyObject
となることがわかりました。
既に Amazon S3 に保存されているオブジェクトのストレージクラスを別のストレージクラスに変更するには、PUT Object - Copy API オペレーションを使用してオブジェクトのコピーを作成します。
これによって、ストレージクラスの変更はObject Created
だとAmazon EventBridgeが判断して過剰なタスク実行が発生しました。
参考として、下記にストレージクラス変更時のログを抜粋して記載します。
{ "version": "0", "id": "*****", "detail-type": "Object Created", "source": "aws.s3", "account": "*****", "time": "2023-09-27T06: 19: 34Z", "region": "ap-northeast-1", "resources": [ "arn:aws:s3: : :sample-s3-event" ], "detail": { "version": "0", "bucket": { "name": "sample-s3-event" }, "object": { "key": "sample.txt", "size": 0, "etag": "*****", "sequencer": "*****" }, "request-id": "*****", "requester": "*****", "source-ip-address": "*****", "reason": "CopyObject" } }
対策
Amazon EventBridgeのイベントパターンをカスタムパターンに変更し、
reason
にPutObject
の指定を追加する。
まとめ
- S3のストレージクラス変更の際は、S3 APIの
CopyObject
がコールされる。 - Amazon EventBridgeが提供しているS3のイベントテンプレートにおいて、Object Createdは下記4つのS3 APIを抽出する。
- PutObject
- POSTObject
- CopyObject
- CompleteMultipartUpload
- 使用を想定しているS3 APIのみでイベント通知が発行されるように、カスタムパターンを作成する。
さいごに
安易なテンプレート利用とストレージクラス変更はダメ絶対。
本ブログがどなかたのお役に立てれば幸いです。