📌 30秒で分かる!イベントパターンとは
必要なものだけを選別する
JSON形式のルール定義
パターンのJSONを比較して
マッチしたら処理を実行
コスト削減・処理効率UP
ターゲットへの負荷軽減
8種類以上の演算子で
柔軟なフィルタリング
🛫 空港のセキュリティゲートで理解する
✈️ EventBridge = 空港のセキュリティシステム
イベントパターンは「通過条件をチェックするゲート」です!
📦 イベントの基本構造を理解しよう
"version": "0",
"id": "abc123...",
"source": "aws.ec2",
"detail-type": "EC2 Instance State-change Notification",
"account": "123456789012",
"region": "ap-northeast-1",
"time": "2024-01-15T10:30:00Z",
"detail": {
"instance-id": "i-0123456789",
"state": "stopped"
}
}
🔍 パターンで使う主要フィールド
🔧 パターンマッチング演算子一覧
完全一致(配列)
値がリストのどれかと一致
"detail": {
"state": ["stopped", "terminated"]
}
}
prefix(前方一致)
指定文字列で始まる
"detail": {
"bucket-name": [{ "prefix": "prod-" }]
}
}
suffix(後方一致)
指定文字列で終わる
"detail": {
"object-key": [{ "suffix": ".png" }]
}
}
numeric(数値比較)
数値の範囲や大小を比較
"detail": {
"size": [{ "numeric": [">=", 100, "<", 1000] }]
}
}
anything-but(否定)
指定した値以外すべて
"detail": {
"env": [{ "anything-but": ["production"] }]
}
}
exists(存在チェック)
フィールドの有無を確認
"detail": {
"error-code": [{ "exists": true }]
}
}
wildcard(ワイルドカード)
*と?でパターンマッチ
"detail": {
"key": [{ "wildcard": "user-*-data" }]
}
}
cidr(IPアドレス範囲)
CIDR表記でIP範囲を指定
"detail": {
"sourceIP": [{ "cidr": "10.0.0.0/24" }]
}
}
🧩 演算子の組み合わせ(AND / OR)
複数条件を組み合わせて高度なフィルタリング
すべての条件を満たす場合のみマッチします。
"source": ["aws.ec2"],
"detail": {
"state": ["stopped"] // 両方満たす必要あり
}
}
どれか1つに一致すればマッチします。
"detail": {
"state": ["stopped", "terminated"] // どちらかでOK
}
}
"$or": [
{ "detail": { "state": ["stopped"] }},
{ "detail": { "env": ["production"] }}
]
}
🔄 イベントパターンの評価フロー
イベントバス
マッチング
実行
💡 ポイント:パターンに一致しないイベントは無視され、ターゲットは実行されません。
1つのルールに複数のターゲットを設定可能(最大5つ)
💻 実践的なパターン例
EC2インスタンスの停止を検知
本番環境のEC2が停止したときだけ通知
{
"source": ["aws.ec2"],
"detail-type": ["EC2 Instance State-change Notification"],
"detail": {
"state": ["stopped", "terminated"],
"instance-id": [{ "prefix": "i-prod-" }]
}
}
S3への画像アップロードを検知
特定バケットへの画像ファイルアップロード時に処理
{
"source": ["aws.s3"],
"detail-type": ["Object Created"],
"detail": {
"bucket": {
"name": ["my-uploads-bucket"]
},
"object": {
"key": [
{ "suffix": ".png" },
{ "suffix": ".jpg" },
{ "suffix": ".jpeg" }
]
}
}
}
高額注文のカスタムイベント
10万円以上の注文をリアルタイムで検知
{
"source": ["my.ecommerce.app"],
"detail-type": ["Order Placed"],
"detail": {
"order-total": [{ "numeric": [">=", 100000] }],
"customer-type": [{ "anything-but": ["guest"] }]
}
}
✨ ベストプラクティス
効果的なイベントパターン設計のコツ
よくある落とし穴・注意点
大文字・小文字は区別される
"Stopped"と"stopped"は別物です。正確な値を指定しましょう。(equals-ignore-caseで回避可能)
パターンサイズの制限
イベントパターンは最大2048文字までです。複雑すぎるパターンは分割を検討しましょう。
ネストしたフィールドの指定方法
detailの中のオブジェクトは、そのままネスト構造で指定します。ドット記法(detail.state)は使えません。
配列フィールドのマッチング
イベント内の配列フィールドは、配列内のどれか1つでもパターンに一致すればマッチします。
❓ よくある質問(FAQ)
🤔 パターンに指定しないフィールドはどうなる?
+パターンに指定しないフィールドは「ワイルドカード扱い」となり、どんな値でもマッチします。つまり、指定したフィールドだけがチェックされ、それ以外は無視されます。
🤔 null値をチェックしたい場合は?
+{"field": [null]} で null 値にマッチできます。また、{"exists": false} でフィールドが存在しないことをチェックできます。
🤔 カスタムイベントでも同じパターンが使える?
+はい!PutEvents APIで送信するカスタムイベントでも、同じパターンマッチング機能が使えます。source、detail-type、detailを自由に設計して、柔軟なイベント駆動アーキテクチャを構築できます。
🤔 複数のルールが同じイベントにマッチしたら?
+すべてのマッチしたルールのターゲットが実行されます。1つのイベントが複数のルールにマッチすることは問題なく、それぞれ独立して処理されます。
🤔 パターンマッチングのパフォーマンスは?
+EventBridgeのパターンマッチングは非常に高速で、ルール数が増えてもパフォーマンスへの影響は最小限です。AWSが最適化されたマッチングエンジンを提供しています。