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. 01路由 AWS 服务及自定义应用事件
  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 等)。

调度器

安排一次性或定期事件,以调用目标。

常见模式

创建自定义事件总线和规则

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