eventbridge について
Amazon EventBridgeを扱う開発者向けのリファレンススキルです。イベントルーティングやスケジュール設定に加え、CLIとboto3の例、運用上の注意点、トラブルシューティングを扱います。
主な機能
- 01イベントバス、ルール、ターゲット
- 02JSONイベントパターンの解説
- 03定期および単発スケジュール
- 04AWS CLIとboto3の例
- 05信頼性とセキュリティの実践項目
- 06イベント配信のトラブルシューティング
活用シーン
- 01AWSサービスやカスタムアプリのイベントをルーティング
- 02ターゲットの定期または単発呼び出しを設定
- 03起動しないルールの原因を調査
- 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
参考資料
コメント
Markdown 対応