mcpField
E
eventbridge

eventbridge

github.com/itsmostafaクラウド・DevOps1.2k120 回インストール2 日前に更新
リポジトリ

eventbridge について

Amazon EventBridgeを扱う開発者向けのリファレンススキルです。イベントルーティングやスケジュール設定に加え、CLIとboto3の例、運用上の注意点、トラブルシューティングを扱います。

主な機能

  1. 01イベントバス、ルール、ターゲット
  2. 02JSONイベントパターンの解説
  3. 03定期および単発スケジュール
  4. 04AWS CLIとboto3の例
  5. 05信頼性とセキュリティの実践項目
  6. 06イベント配信のトラブルシューティング

活用シーン

  1. 01AWSサービスやカスタムアプリのイベントをルーティング
  2. 02ターゲットの定期または単発呼び出しを設定
  3. 03起動しないルールの原因を調査
  4. 04配信の信頼性とアクセス制御を確認

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/itsmostafa/aws-agent-skills --skill eventbridge

インストール後、Claude Code で/eventbridgeを入力して読み込まれたか確認します。

同梱ファイルevent-patterns.md

詳細

AWS EventBridge

Amazon EventBridge は、イベントを使用してアプリケーションを接続するサーバーレスイベントバスです。AWS サービス、カスタムアプリケーション、SaaS パートナーからのイベントをルーティングします。

目次

主要な概念

イベントバス

イベントを受信するチャネルです。種類は次のとおりです。

  • デフォルト:AWS サービスのイベントを受信します
  • カスタム:アプリケーションのイベントです
  • パートナー:SaaS アプリケーションのイベントです
ルール

受信イベントを照合し、ターゲットにルーティングします。各ルールには最大 5 つのターゲットを設定できます。

イベントパターン

ルールに一致するイベントを定義する JSON パターンです。

ターゲット

一致したイベントを受信する AWS サービスです(Lambda、SQS、SNS、Step Functions など)。

スケジューラー

ターゲットを呼び出すための、1 回限りまたは定期的なイベントをスケジュールします。

一般的なパターン

カスタムイベントバスとルールを作成する

AWS CLI:

# Create custom event bus
aws events create-event-bus --name my-app-events

# Create rule
aws events put-rule \
  --name order-created-rule \
  --event-bus-name my-app-events \
  --event-pattern '{
    "source": ["my-app.orders"],
    "detail-type": ["Order Created"]
  }'

# Add Lambda target
aws events put-targets \
  --rule order-created-rule \
  --event-bus-name my-app-events \
  --targets '[{
    "Id": "process-order",
    "Arn": "arn:aws:lambda:us-east-1:123456789012:function:ProcessOrder"
  }]'

# Add Lambda permission
aws lambda add-permission \
  --function-name ProcessOrder \
  --statement-id eventbridge-order-created \
  --action lambda:InvokeFunction \
  --principal events.amazonaws.com \
  --source-arn arn:aws:events:us-east-1:123456789012:rule/my-app-events/order-created-rule

boto3:

import boto3

events = boto3.client('events')

# Create event bus
events.create_event_bus(Name='my-app-events')

# Create rule
events.put_rule(
    Name='order-created-rule',
    EventBusName='my-app-events',
    EventPattern=json.dumps({
        'source': ['my-app.orders'],
        'detail-type': ['Order Created']
    }),
    State='ENABLED'
)

# Add target
events.put_targets(
    Rule='order-created-rule',
    EventBusName='my-app-events',
    Targets=[{
        'Id': 'process-order',
        'Arn': 'arn:aws:lambda:us-east-1:123456789012:function:ProcessOrder'
    }]
)
カスタムイベントを発行する
import boto3
import json

events = boto3.client('events')

events.put_events(
    Entries=[
        {
            'Source': 'my-app.orders',
            'DetailType': 'Order Created',
            'Detail': json.dumps({
                'order_id': '12345',
                'customer_id': 'cust-789',
                'total': 99.99,
                'items': [
                    {'product_id': 'prod-1', 'quantity': 2}
                ]
            }),
            'EventBusName': 'my-app-events'
        }
    ]
)
スケジュールされたイベント
# Run every 5 minutes
aws events put-rule \
  --name every-5-minutes \
  --schedule-expression "rate(5 minutes)"

# Run at specific times (cron)
aws events put-rule \
  --name daily-cleanup \
  --schedule-expression "cron(0 2 * * ? *)"

# Add target
aws events put-targets \
  --rule every-5-minutes \
  --targets '[{
    "Id": "cleanup-function",
    "Arn": "arn:aws:lambda:us-east-1:123456789012:function:Cleanup"
  }]'
EventBridge Scheduler(1 回限りおよび柔軟なスケジュール)
# One-time schedule
aws scheduler create-schedule \
  --name send-reminder \
  --schedule-expression "at(2024-12-25T09:00:00)" \
  --target '{
    "Arn": "arn:aws:lambda:us-east-1:123456789012:function:SendReminder",
    "RoleArn": "arn:aws:iam::123456789012:role/scheduler-role",
    "Input": "{\"message\": \"Merry Christmas!\"}"
  }' \
  --flexible-time-window '{"Mode": "OFF"}'

# Recurring with flexible window
aws scheduler create-schedule \
  --name hourly-sync \
  --schedule-expression "rate(1 hour)" \
  --target '{
    "Arn": "arn:aws:lambda:us-east-1:123456789012:function:SyncData",
    "RoleArn": "arn:aws:iam::123456789012:role/scheduler-role"
  }' \
  --flexible-time-window '{"Mode": "FLEXIBLE", "MaximumWindowInMinutes": 15}'
AWS サービスのイベント
# EC2 state changes
aws events put-rule \
  --name ec2-state-change \
  --event-pattern '{
    "source": ["aws.ec2"],
    "detail-type": ["EC2 Instance State-change Notification"],
    "detail": {
      "state": ["stopped", "terminated"]
    }
  }'

# S3 object created
aws events put-rule \
  --name s3-upload \
  --event-pattern '{
    "source": ["aws.s3"],
    "detail-type": ["Object Created"],
    "detail": {
      "bucket": {"name": ["my-bucket"]},
      "object": {"key": [{"prefix": "uploads/"}]}
    }
  }'

CLI リファレンス

イベントバス
コマンド説明
aws events create-event-busイベントバスを作成
aws events delete-event-busイベントバスを削除
aws events list-event-busesイベントバスを一覧表示
aws events describe-event-busイベントバスの詳細を取得
ルール
コマンド説明
aws events put-ruleルールを作成または更新
aws events delete-ruleルールを削除
aws events list-rulesルールを一覧表示
aws events describe-ruleルールの詳細を取得
aws events enable-ruleルールを有効化
aws events disable-ruleルールを無効化
ターゲット
コマンド説明
aws events put-targetsルールにターゲットを追加
aws events remove-targetsターゲットを削除
aws events list-targets-by-ruleルールのターゲットを一覧表示
イベント
コマンド説明
aws events put-eventsイベントを発行

ベストプラクティス

イベント設計
  • 意味のあるソース名を使用する — company.service.component
  • 内容がわかる detail-type を使用する — Order Created、User Signed Up
  • トレース用に相関 ID を含める
  • イベントを小さく保つ(< 256 KB)
  • イベントスキーマにバージョン管理を使用する
# Good event structure
{
    'Source': 'mycompany.orders.api',
    'DetailType': 'Order Created',
    'Detail': json.dumps({
        'version': '1.0',
        'correlation_id': 'req-abc-123',
        'timestamp': '2024-01-15T10:30:00Z',
        'order_id': '12345',
        'data': {...}
    })
}
信頼性
  • 配信に失敗した場合に備えてDLQ を使用する
  • コンシューマーに冪等性を実装する
  • 呼び出しの失敗を監視する
  • 復旧にはアーカイブとリプレイを使用する
セキュリティ
  • アクセス制御にはリソースポリシーを使用する
  • KMS による暗号化を有効にする
  • ターゲットにはIAM ロールを使用する
コストの最適化
  • 一致を減らすため、具体的なイベントパターンを使用する
  • 発行時にイベントをバッチ処理する(1 回の呼び出しにつき最大 10 件)
  • 必要なイベントのみをアーカイブする — すべてのイベントをアーカイブしない

トラブルシューティング

ルールがトリガーされない

デバッグ:

# Check rule status
aws events describe-rule --name my-rule

# Check targets
aws events list-targets-by-rule --rule my-rule

# Test event pattern
aws events test-event-pattern \
  --event-pattern '{"source": ["my-app"]}' \
  --event '{"source": "my-app", "detail-type": "Test"}'

よくある原因:

  • ルールが無効になっている
  • イベントパターンが一致しない
  • ターゲットの権限が不足している
Lambda が呼び出されない

Lambda の権限を確認する:

aws lambda get-policy --function-name MyFunction

必要な権限:

{
  "Principal": "events.amazonaws.com",
  "Action": "lambda:InvokeFunction",
  "Resource": "function-arn",
  "Condition": {
    "ArnLike": {
      "AWS:SourceArn": "rule-arn"
    }
  }
}
イベントがカスタムバスに届かない

確認事項:

  • 正しいバス名に発行している
  • イベント形式が有効な JSON である
  • Put events に適切な権限がある
# Test publish
aws events put-events \
  --entries '[{
    "Source": "test",
    "DetailType": "Test Event",
    "Detail": "{}",
    "EventBusName": "my-app-events"
  }]'
失敗したイベントを表示する
# Enable CloudWatch metrics
aws events put-rule \
  --name my-rule \
  --event-pattern '...' \
  --state ENABLED

# Check FailedInvocations metric
aws cloudwatch get-metric-statistics \
  --namespace AWS/Events \
  --metric-name FailedInvocations \
  --dimensions Name=RuleName,Value=my-rule \
  --start-time $(date -d '1 hour ago' -u +%Y-%m-%dT%H:%M:%SZ) \
  --end-time $(date -u +%Y-%m-%dT%H:%M:%SZ) \
  --period 300 \
  --statistics Sum

参考資料

コメント