S3イベント通知に追加されたaws-generated-tagsをEventBridgeでフィルタリングしてみた

S3イベント通知に追加されたaws-generated-tagsをEventBridgeでフィルタリングしてみた

S3イベント通知に追加された`aws-generated-tags`の内容を、CloudFormationで作成したバケットで検証しました。さらに、EventBridgeでスタック名を条件にし、同一スタックにEventBridge通知を有効化したバケットを追加しても、ルール変更なしで`Object Created`イベントを捕捉できることを確認しました。
2026.07.17

はじめに

Amazon S3のイベント通知にaws-generated-tagsフィールドが追加されました。AWSサービスによるシステム生成タグがバケットに付与されている場合、そのタグがイベントに含まれるようになり、EventBridgeでのフィルタリングに利用できます。

https://aws.amazon.com/about-aws/whats-new/2026/07/amazon-s3-event-notifications-system-generated-tags/

観点 従来 アップデート後
イベントに含まれる情報 バケット名、オブジェクトキー、サイズ等 左記 + aws-generated-tags(バケットのシステム生成タグ)
フィルタリング方法 バケット名の個別列挙 aws-generated-tagsのタグ値(スタック名等)でフィルタリング可能

実際に何が含まれるのか気になったので、3パターンのバケットで確認し、EventBridgeでのフィルタリング動作も検証してみました。

https://docs.aws.amazon.com/AmazonS3/latest/userguide/notification-content-structure.html

検証内容

検証環境・構成

以下のCloudFormationテンプレートで3種類のバケットとEventBridgeルールを作成しました。

CloudFormationテンプレート抜粋(S3バケット・EventBridgeルール部分)
Resources:
  # Pattern 1: CFnシステムタグのみ(Tagsプロパティなし)
  BucketCfnTagsOnly:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Sub 's3-evt-verify-cfn-only-${Suffix}'
      NotificationConfiguration:
        EventBridgeConfiguration:
          EventBridgeEnabled: true

  # Pattern 2: ユーザー定義タグ付き
  BucketWithUserTags:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Sub 's3-evt-verify-user-tags-${Suffix}'
      NotificationConfiguration:
        EventBridgeConfiguration:
          EventBridgeEnabled: true
      Tags:
        - Key: Project
          Value: blog-verification
        - Key: Team
          Value: devio

  # Pattern 3: 手動タグ追加用(デプロイ後にput-bucket-tagging)
  BucketManualTag:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Sub 's3-evt-verify-manual-tag-${Suffix}'
      NotificationConfiguration:
        EventBridgeConfiguration:
          EventBridgeEnabled: true

  # aws-generated-tagsでフィルタリングするEventBridgeルール
  FilterRule:
    Type: AWS::Events::Rule
    Properties:
      Name: !Sub 's3-evt-verify-filter-rule-${Suffix}'
      State: ENABLED
      EventPattern:
        source:
          - aws.s3
        detail-type:
          - Object Created
        detail:
          bucket:
            aws-generated-tags:
              aws:cloudformation:stack-name:
                - s3-evt-awsgentags-verify
      Targets:
        - Id: FilterSQSTarget
          Arn: !GetAtt FilterQueue.Arn

  # FilterQueue (AWS::SQS::Queue) および QueuePolicy は省略

3パターンのバケットはそれぞれ異なるタグ状態で作成し、aws-generated-tagsに何が含まれるかを検証しました。

パターン バケット タグ状態 検証観点
1 BucketCfnTagsOnly aws:cloudformation:*のみ(Tagsプロパティなし) システムタグだけでaws-generated-tagsに何が入るか
2 BucketWithUserTags aws:cloudformation:* + Project, Team(CFn Tags) ユーザー定義タグがaws-generated-tagsに含まれるか
3 BucketManualTag aws:cloudformation:* + ManualTag(手動追加) 手動追加タグがaws-generated-tagsに含まれるか

aws-generated-tagsフィールドの中身

各パターンでオブジェクトをPUTし、受信したイベントのaws-generated-tagsフィールドを比較しました。

パターン バケットのタグ状態 aws-generated-tagsに含まれたタグ
1. CFnシステムタグのみ aws:cloudformation:*のみ aws:cloudformation:stack-name, stack-id, logical-id
2. CFn Tags経由ユーザー定義タグ付き aws:cloudformation:* + Project, Team aws:cloudformation:stack-name, stack-id, logical-id(Project, Teamは含まれない)
3. 手動タグ追加 aws:cloudformation:* + ManualTag aws:cloudformation:stack-name, stack-id, logical-id(ManualTagは含まれない)

今回検証したCloudFormation管理下のバケットでは、aws-generated-tagsに含まれたのはCloudFormationが付与するシステム生成タグのみでした。具体的には以下のとおりです。

  • 含まれたもの: aws:cloudformation:stack-nameaws:cloudformation:stack-idaws:cloudformation:logical-id
  • 含まれなかったもの: AWS::S3::BucketTagsプロパティで定義したユーザータグ、put-bucket-taggingで手動追加したタグ

パターン1のイベントでは、aws-generated-tagsに3つのCloudFormationシステムタグが含まれていました。

"bucket": {
  "name": "s3-evt-verify-cfn-only-20260717",
  "aws-generated-tags": {
    "aws:cloudformation:stack-id": "arn:aws:cloudformation:ap-northeast-1:123456789012:stack/s3-evt-awsgentags-verify/aa15e5b0-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "aws:cloudformation:logical-id": "BucketCfnTagsOnly",
    "aws:cloudformation:stack-name": "s3-evt-awsgentags-verify"
  }
}

パターン2では、バケットにProject・Teamタグを付与していましたが、aws-generated-tagsに含まれるタグキーの種類はパターン1と同じでした。

"bucket": {
  "name": "s3-evt-verify-user-tags-20260717",
  "aws-generated-tags": {
    "aws:cloudformation:stack-id": "arn:aws:cloudformation:ap-northeast-1:123456789012:stack/s3-evt-awsgentags-verify/aa15e5b0-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "aws:cloudformation:logical-id": "BucketWithUserTags",
    "aws:cloudformation:stack-name": "s3-evt-awsgentags-verify"
  }
}

パターン3でも、put-bucket-taggingでManualTagを手動追加していましたが、aws-generated-tagsに含まれるタグキーの種類はパターン1、2と同じでした。

"bucket": {
  "name": "s3-evt-verify-manual-tag-20260717",
  "aws-generated-tags": {
    "aws:cloudformation:stack-id": "arn:aws:cloudformation:ap-northeast-1:123456789012:stack/s3-evt-awsgentags-verify/aa15e5b0-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "aws:cloudformation:logical-id": "BucketManualTag",
    "aws:cloudformation:stack-name": "s3-evt-awsgentags-verify"
  }
}
イベントJSON全文(パターン1: CFnシステムタグのみ)
{
  "version": "0",
  "id": "167f17bc-a5c7-74a0-b542-6f66e8007f69",
  "detail-type": "Object Created",
  "source": "aws.s3",
  "account": "123456789012",
  "time": "2026-07-16T19:46:12Z",
  "region": "ap-northeast-1",
  "resources": ["arn:aws:s3:::s3-evt-verify-cfn-only-20260717"],
  "detail": {
    "version": "0",
    "event-version": "1.1",
    "bucket": {
      "name": "s3-evt-verify-cfn-only-20260717",
      "aws-generated-tags": {
        "aws:cloudformation:stack-id": "arn:aws:cloudformation:ap-northeast-1:123456789012:stack/s3-evt-awsgentags-verify/aa15e5b0-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
        "aws:cloudformation:logical-id": "BucketCfnTagsOnly",
        "aws:cloudformation:stack-name": "s3-evt-awsgentags-verify"
      }
    },
    "object": {
      "key": "test-cfn-only.txt",
      "size": 14,
      "etag": "0c78c972ee4ad0cc767914a4a9235b55",
      "sequencer": "006A593504D0B0A5C4"
    },
    "request-id": "4E4R5T282H6KN86C",
    "requester": "123456789012",
    "source-ip-address": "203.0.113.1",
    "reason": "PutObject"
  }
}
イベントJSON全文(パターン2: CFn Tags経由ユーザー定義タグ付き)
{
  "version": "0",
  "id": "7ca7ec54-8fd1-daf6-562c-37b2940f5a86",
  "detail-type": "Object Created",
  "source": "aws.s3",
  "account": "123456789012",
  "time": "2026-07-16T19:46:13Z",
  "region": "ap-northeast-1",
  "resources": ["arn:aws:s3:::s3-evt-verify-user-tags-20260717"],
  "detail": {
    "version": "0",
    "event-version": "1.1",
    "bucket": {
      "name": "s3-evt-verify-user-tags-20260717",
      "aws-generated-tags": {
        "aws:cloudformation:stack-id": "arn:aws:cloudformation:ap-northeast-1:123456789012:stack/s3-evt-awsgentags-verify/aa15e5b0-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
        "aws:cloudformation:logical-id": "BucketWithUserTags",
        "aws:cloudformation:stack-name": "s3-evt-awsgentags-verify"
      }
    },
    "object": {
      "key": "test-user-tags.txt",
      "size": 15,
      "etag": "a9cd14919053d9c5045b54398d42009d",
      "sequencer": "006A5935054DC23AD2"
    },
    "request-id": "SZ06S3BAMTXTF0JH",
    "requester": "123456789012",
    "source-ip-address": "203.0.113.1",
    "reason": "PutObject"
  }
}
イベントJSON全文(パターン3: 手動タグ追加)
{
  "version": "0",
  "id": "f487191c-2aa0-397c-707c-3722670de533",
  "detail-type": "Object Created",
  "source": "aws.s3",
  "account": "123456789012",
  "time": "2026-07-16T19:46:13Z",
  "region": "ap-northeast-1",
  "resources": ["arn:aws:s3:::s3-evt-verify-manual-tag-20260717"],
  "detail": {
    "version": "0",
    "event-version": "1.1",
    "bucket": {
      "name": "s3-evt-verify-manual-tag-20260717",
      "aws-generated-tags": {
        "aws:cloudformation:stack-id": "arn:aws:cloudformation:ap-northeast-1:123456789012:stack/s3-evt-awsgentags-verify/aa15e5b0-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
        "aws:cloudformation:logical-id": "BucketManualTag",
        "aws:cloudformation:stack-name": "s3-evt-awsgentags-verify"
      }
    },
    "object": {
      "key": "test-manual-tag.txt",
      "size": 16,
      "etag": "975330f671d4c7fae808cf1e95a901ef",
      "sequencer": "006A593505C645201C"
    },
    "request-id": "SZ03VKFY5AY8DXSV",
    "requester": "123456789012",
    "source-ip-address": "203.0.113.1",
    "reason": "PutObject"
  }
}

EventBridgeでスタック名ベースのフィルタリング

aws-generated-tagsを利用して、特定のCloudFormationスタックで作成されたバケットのイベントのみを捕捉するEventBridgeルールを設定しました。フィールド名はケバブケース(aws-generated-tags)で、イベントのトップレベルではなくdetail.bucket配下に配置されています。そのため、イベントパターンではdetail.bucket.aws-generated-tagsのパスで指定します。

{
  "source": ["aws.s3"],
  "detail-type": ["Object Created"],
  "detail": {
    "bucket": {
      "aws-generated-tags": {
        "aws:cloudformation:stack-name": ["s3-evt-awsgentags-verify"]
      }
    }
  }
}

このルールで3つのテストを実施しました。テスト2では、同じスタックにEventBridge通知を有効化した新しいバケット(BucketNewAdded)を追加してスタック更新をデプロイし、EventBridgeルールは変更せずにイベントが捕捉されるかを確認しました。

テスト 操作 期待 結果
1. スタック内バケットにPUT filter-v2-test1.txt を BucketCfnTagsOnly にPUT フィルタリングキューに到達 ✅ PASS
2. 新規追加バケット(ルール変更なし)にPUT filter-v2-test2.txt を BucketNewAdded にPUT フィルタリングキューに到達 ✅ PASS
3. スタック外バケット(CFnタグなし)にPUT external-test.txt を外部バケットにPUT フィルタリングキューに到達しない ✅ PASS

同じスタックにEventBridge通知を有効化したバケットを追加すれば、ルールを変更せずにそのバケットのイベントも捕捉できます。

まとめ

aws-generated-tagsを利用すると、S3イベントをバケット名ではなくCloudFormationスタック単位でフィルタリングできます。

同じスタックで複数のS3バケットを管理し、それらのObject Createdイベントを共通の処理先へ集約する構成では、スタック名を条件にすることでルールを簡潔に保てます。今回の検証では、同一スタックにEventBridge通知を有効化したバケットを追加しても、EventBridgeルールを変更せずにイベントを捕捉できました。バケットの追加が想定されるスタックで、バケット名の個別管理を減らしたい場合に有効です。

この記事をシェアする

AWSのお困り事はクラスメソッドへ

関連記事