关于 eventbridge
面向 Amazon EventBridge 开发者的参考技能,涵盖事件路由、计划调度、CLI 与 boto3 示例,以及运维建议和故障排查。
主要功能
- 01事件总线、规则与目标
- 02JSON 事件模式指南
- 03周期性与单次计划
- 04AWS CLI 和 boto3 示例
- 05可靠性与安全实践
- 06事件投递故障排查
适用场景
- 01路由 AWS 服务及自定义应用事件
- 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 等)。
调度器
安排一次性或定期事件,以调用目标。
常见模式
创建自定义事件总线和规则
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(一次性和灵活调度)
# 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 角色
成本优化
- 使用特定的事件模式减少匹配数
- 发布时批量处理事件(每次调用最多 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