🎯 Amazon EventBridge
イベントパターン完全図解

〜空港のセキュリティゲートで学ぶイベントフィルタリング〜

📌 30秒で分かる!イベントパターンとは

🎯
フィルターの役割
大量のイベントの中から
必要なものだけを選別する
JSON形式のルール定義
仕組み
イベントのJSONと
パターンのJSONを比較して
マッチしたら処理を実行
🛡️
メリット
不要なイベントを早期に除外
コスト削減・処理効率UP
ターゲットへの負荷軽減
🔧
演算子
完全一致/前方一致/範囲指定など
8種類以上の演算子で
柔軟なフィルタリング

🛫 空港のセキュリティゲートで理解する

✈️ EventBridge = 空港のセキュリティシステム

イベントパターンは「通過条件をチェックするゲート」です!

🧳
旅行者(イベント)
AWSイベント
➡️
🚨
セキュリティゲート
イベントパターン
➡️
条件に合致?
パターンマッチ
➡️
🛫
搭乗ゲートへ
ターゲット実行
🧳
旅行者のパスポート情報
= イベントのJSON(source, detail-type, detail)
📋
チェック項目リスト
= イベントパターン(マッチング条件)
🎫
「東京行きの乗客だけ通過OK」
= 特定の条件に一致するイベントだけ処理
🚫
条件に合わない人は通過不可
= マッチしないイベントは無視される

📦 イベントの基本構造を理解しよう

📄 イベントの例(EC2状態変更)
{
  "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"
  }
}

🔍 パターンで使う主要フィールド

source
イベントの発生源(aws.ec2, aws.s3など)
detail-type
イベントの種類を表す文字列
detail
イベント固有の詳細情報(重要!)
account / region
AWSアカウントIDとリージョン

🔧 パターンマッチング演算子一覧

🎯

完全一致(配列)

値がリストのどれかと一致

🛫 例え:「東京行き」または「大阪行き」の乗客だけ通過
{
  "detail": {
    "state": ["stopped", "terminated"]
  }
}
✅ "stopped" ✅ "terminated" ❌ "running"
📝

prefix(前方一致)

指定文字列で始まる

🛫 例え:「国際線」で始まる便名だけ通過
{
  "detail": {
    "bucket-name": [{ "prefix": "prod-" }]
  }
}
✅ "prod-images" ✅ "prod-logs" ❌ "dev-images"
🔚

suffix(後方一致)

指定文字列で終わる

🛫 例え:「.jpg」で終わるファイルだけ処理
{
  "detail": {
    "object-key": [{ "suffix": ".png" }]
  }
}
✅ "image.png" ✅ "logo.png" ❌ "data.json"
🔢

numeric(数値比較)

数値の範囲や大小を比較

🛫 例え:「荷物が20kg以上」の乗客をチェック
{
  "detail": {
    "size": [{ "numeric": [">=", 100, "<", 1000] }]
  }
}
✅ 100 ✅ 500 ❌ 50 ❌ 1000
🚫

anything-but(否定)

指定した値以外すべて

🛫 例え:「VIP以外」の乗客を通常レーンへ
{
  "detail": {
    "env": [{ "anything-but": ["production"] }]
  }
}
✅ "development" ✅ "staging" ❌ "production"

exists(存在チェック)

フィールドの有無を確認

🛫 例え:「パスポートを持っている」人だけ通過
{
  "detail": {
    "error-code": [{ "exists": true }]
  }
}
✅ error-codeあり ❌ error-codeなし

wildcard(ワイルドカード)

*と?でパターンマッチ

🛫 例え:「〇〇航空」の便名をすべて許可
{
  "detail": {
    "key": [{ "wildcard": "user-*-data" }]
  }
}
✅ "user-123-data" ✅ "user-abc-data" ❌ "admin-data"
🌐

cidr(IPアドレス範囲)

CIDR表記でIP範囲を指定

🛫 例え:「社内ネットワーク」からのアクセスのみ許可
{
  "detail": {
    "sourceIP": [{ "cidr": "10.0.0.0/24" }]
  }
}
✅ "10.0.0.50" ✅ "10.0.0.200" ❌ "192.168.1.1"

🧩 演算子の組み合わせ(AND / OR)

複数条件を組み合わせて高度なフィルタリング

AND条件 すべて満たす
異なるフィールドの条件はAND(かつ)として評価されます。
すべての条件を満たす場合のみマッチします。
{
  "source": ["aws.ec2"],
  "detail": {
    "state": ["stopped"] // 両方満たす必要あり
  }
}
OR条件 どれか1つ
同じフィールドに複数の値を配列で指定するとOR(または)として評価されます。
どれか1つに一致すればマッチします。
{
  "detail": {
    "state": ["stopped", "terminated"] // どちらかでOK
  }
}
$or 演算子 明示的OR
異なるフィールド間でOR条件を使いたい場合は$or演算子を使用します。
{
  "$or": [
    { "detail": { "state": ["stopped"] }},
    { "detail": { "env": ["production"] }}
  ]
}

🔄 イベントパターンの評価フロー

📨
イベント発生
➡️
🚌
EventBridge
イベントバス
➡️
🎯
パターン
マッチング
➡️
✅ / ❌
マッチ判定
➡️
🎯
ターゲット
実行

💡 ポイント:パターンに一致しないイベントは無視され、ターゲットは実行されません。
1つのルールに複数のターゲットを設定可能(最大5つ)

💻 実践的なパターン例

🖥️

EC2インスタンスの停止を検知

本番環境のEC2が停止したときだけ通知

📋 シナリオ:本番環境のEC2インスタンスが予期せず停止した場合に、Slack通知を送りたい
{
  "source": ["aws.ec2"],
  "detail-type": ["EC2 Instance State-change Notification"],
  "detail": {
    "state": ["stopped", "terminated"],
    "instance-id": [{ "prefix": "i-prod-" }]
  }
}
i-prod-web01 が stopped → マッチ
i-dev-test01 が stopped → 無視
i-prod-web01 が running → 無視
📦

S3への画像アップロードを検知

特定バケットへの画像ファイルアップロード時に処理

📋 シナリオ:uploadsバケットにPNG/JPG画像がアップロードされたら、Lambda でリサイズ処理を実行したい
{
  "source": ["aws.s3"],
  "detail-type": ["Object Created"],
  "detail": {
    "bucket": {
      "name": ["my-uploads-bucket"]
    },
    "object": {
      "key": [
        { "suffix": ".png" },
        { "suffix": ".jpg" },
        { "suffix": ".jpeg" }
      ]
    }
  }
}
photo.png アップロード → マッチ
image.jpg アップロード → マッチ
data.json アップロード → 無視
🛒

高額注文のカスタムイベント

10万円以上の注文をリアルタイムで検知

📋 シナリオ:ECサイトで10万円以上の注文が入ったら、VIP対応チームに即時通知したい
{
  "source": ["my.ecommerce.app"],
  "detail-type": ["Order Placed"],
  "detail": {
    "order-total": [{ "numeric": [">=", 100000] }],
    "customer-type": [{ "anything-but": ["guest"] }]
  }
}
会員が150,000円の注文 → マッチ
ゲストが120,000円の注文 → 無視
会員が50,000円の注文 → 無視

✨ ベストプラクティス

効果的なイベントパターン設計のコツ

1
できるだけ具体的に絞り込む
広すぎるパターンは不要なイベントも処理してしまいます。source、detail-type、detailの複数フィールドで絞り込みましょう。
2
prefix/suffixを活用する
命名規則(prod-、-dev など)と組み合わせることで、環境やリソースタイプ別の柔軟なフィルタリングが可能になります。
3
テスト用ルールを作成
本番適用前に、CloudWatch Logsをターゲットにしたテストルールでパターンの動作を確認しましょう。
4
サンプルイベントで検証
コンソールの「イベントパターンのテスト」機能を使って、実際のイベントがマッチするか事前に確認できます。
5
ドキュメントを確認
AWSサービスごとにイベントの構造が異なります。必ず公式ドキュメントでdetailの中身を確認してからパターンを作成しましょう。
6
コスト意識を持つ
EventBridgeは無料枠を超えると課金されます。不要なイベントを早期に除外することで、下流のLambda等の実行コストも削減できます。
⚠️

よくある落とし穴・注意点

🔤

大文字・小文字は区別される

"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が最適化されたマッチングエンジンを提供しています。

Created by SSuzuki1063

AWS SAP Learning Resources