S3イベント通知に追加されたaws-generated-tagsをEventBridgeでフィルタリングしてみた
はじめに
Amazon S3のイベント通知にaws-generated-tagsフィールドが追加されました。AWSサービスによるシステム生成タグがバケットに付与されている場合、そのタグがイベントに含まれるようになり、EventBridgeでのフィルタリングに利用できます。
| 観点 | 従来 | アップデート後 |
|---|---|---|
| イベントに含まれる情報 | バケット名、オブジェクトキー、サイズ等 | 左記 + aws-generated-tags(バケットのシステム生成タグ) |
| フィルタリング方法 | バケット名の個別列挙 | aws-generated-tagsのタグ値(スタック名等)でフィルタリング可能 |
実際に何が含まれるのか気になったので、3パターンのバケットで確認し、EventBridgeでのフィルタリング動作も検証してみました。
検証内容
検証環境・構成
以下の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-name、aws:cloudformation:stack-id、aws:cloudformation:logical-id - 含まれなかったもの:
AWS::S3::BucketのTagsプロパティで定義したユーザータグ、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ルールを変更せずにイベントを捕捉できました。バケットの追加が想定されるスタックで、バケット名の個別管理を減らしたい場合に有効です。








