【Amazon S3】ストレージクラスを変更しただけなのに連動タスクが無限発生【Amazon EventBridge】

記事タイトルとURLをコピーする

こんにちは。 ディベロップメントサービス1課の山本です。

最近、リモートワークでの運動不足を感じてジムに入会しました。
基礎代謝を上げるために、下半身マッチョを目指してます。

今回はAmazon S3(以下、S3)のイベント通知をAmazon EventBridgeで受け取る際の注意点を説明します。 一歩間違えれば意図しないイベントを検知して、大量のコストがかかってしまう恐れがあります。

はじめに

下記のような構築をしていた際のことでした。

構成例

ファイルの処理も問題ないため、S3のストレージ料金を減らそうと思い加工済みのS3ファイルのストレージクラスを一括で変更致しました。

この後、とんでもない事が発生しました。

発生した問題

数百以上のファイルのストレージクラスを変更後、
翌日AWS Fargateのタスクを見ると、上限100タスクに張り付いていました。

通常運用ではありえないことなので急いで確認すると、
何故かAmazon EventBridgeがストレージクラスの変更をファイル生成とみなして、イベント通知をしていました。

原因

Amazon EventBridgeのルールをマネジメントコンソール上から作成したのですが、
この際監視イベントを安易にObject Createdに指定した事が原因です。

EventBridge_イベントパターン設定画面

Object Createdが監視するS3のAPIは下記の4つ

  • PutObject
  • POSTObject
  • CopyObject
  • CompleteMultipartUpload

docs.aws.amazon.com

ストレージクラスの変更で使用されるS3 APIを後で調査したところ、CopyObjectとなることがわかりました。

既に Amazon S3 に保存されているオブジェクトのストレージクラスを別のストレージクラスに変更するには、PUT Object - Copy API オペレーションを使用してオブジェクトのコピーを作成します。

docs.aws.amazon.com

これによって、ストレージクラスの変更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のイベントパターンをカスタムパターンに変更し、
reasonPutObjectの指定を追加する。

PutObjcetの限定方法

まとめ

  • S3のストレージクラス変更の際は、S3 APIのCopyObjectがコールされる。
  • Amazon EventBridgeが提供しているS3のイベントテンプレートにおいて、Object Createdは下記4つのS3 APIを抽出する。
    • PutObject
    • POSTObject
    • CopyObject
    • CompleteMultipartUpload
  • 使用を想定しているS3 APIのみでイベント通知が発行されるように、カスタムパターンを作成する。

さいごに

安易なテンプレート利用とストレージクラス変更はダメ絶対。

本ブログがどなかたのお役に立てれば幸いです。

山本 真大(執筆記事の一覧)

アプリケーションサービス部 ディベロップメントサービス1課

2023年8月入社。カピバラさんが好き。