eventbridge

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

AWS EventBridge

AWS EventBridge

Amazon EventBridge is a serverless event bus that connects applications using events. Route events from AWS services, custom applications, and SaaS partners.
Amazon EventBridge 是一款无服务器事件总线,可通过事件连接各类应用。能够路由来自AWS服务、自定义应用以及SaaS合作伙伴的事件。

Table of Contents

目录

Core Concepts

核心概念

Event Bus

事件总线

Channel that receives events. Types:
  • Default: Receives AWS service events
  • Custom: Your application events
  • Partner: SaaS application events
接收事件的通道。类型包括:
  • 默认总线:接收AWS服务事件
  • 自定义总线:接收您的应用事件
  • 合作伙伴总线:接收SaaS应用事件

Rules

规则

Match incoming events and route to targets. Each rule can have up to 5 targets.
匹配传入事件并路由到目标。每条规则最多可配置5个目标。

Event Patterns

事件模式

JSON patterns that define which events match a rule.
用于定义哪些事件可匹配规则的JSON模式。

Targets

目标

AWS services that receive matched events (Lambda, SQS, SNS, Step Functions, etc.).
接收匹配事件的AWS服务(如Lambda、SQS、SNS、Step Functions等)。

Scheduler

调度器

Schedule one-time or recurring events to invoke targets.
配置一次性或周期性事件以触发目标。

Common Patterns

常见模式

Create Custom Event Bus and Rule

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

AWS CLI:
bash
undefined
AWS CLI:
bash
undefined

Create custom event bus

Create custom event bus

aws events create-event-bus --name my-app-events
aws events create-event-bus --name my-app-events

Create rule

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"] }'
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

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" }]'
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

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:**

```python
import boto3

events = boto3.client('events')
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:**

```python
import boto3

events = boto3.client('events')

Create event bus

Create event bus

events.create_event_bus(Name='my-app-events')
events.create_event_bus(Name='my-app-events')

Create rule

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' )
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

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' }] )
undefined
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' }] )
undefined

Publish Custom Events

发布自定义事件

python
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'
        }
    ]
)
python
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'
        }
    ]
)

Scheduled Events

定时事件

bash
undefined
bash
undefined

Run every 5 minutes

Run every 5 minutes

aws events put-rule
--name every-5-minutes
--schedule-expression "rate(5 minutes)"
aws events put-rule
--name every-5-minutes
--schedule-expression "rate(5 minutes)"

Run at specific times (cron)

Run at specific times (cron)

aws events put-rule
--name daily-cleanup
--schedule-expression "cron(0 2 * * ? *)"
aws events put-rule
--name daily-cleanup
--schedule-expression "cron(0 2 * * ? *)"

Add target

Add target

aws events put-targets
--rule every-5-minutes
--targets '[{ "Id": "cleanup-function", "Arn": "arn:aws:lambda:us-east-1:123456789012:function:Cleanup" }]'
undefined
aws events put-targets
--rule every-5-minutes
--targets '[{ "Id": "cleanup-function", "Arn": "arn:aws:lambda:us-east-1:123456789012:function:Cleanup" }]'
undefined

EventBridge Scheduler (One-Time and Flexible)

EventBridge 调度器(一次性与灵活调度)

bash
undefined
bash
undefined

One-time schedule

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"}'
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

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}'
undefined
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}'
undefined

AWS Service Events

AWS 服务事件

bash
undefined
bash
undefined

EC2 state changes

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"] } }'
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

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/"}]} } }'
undefined
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/"}]} } }'
undefined

CLI Reference

CLI 参考

Event Buses

事件总线

CommandDescription
aws events create-event-bus
Create event bus
aws events delete-event-bus
Delete event bus
aws events list-event-buses
List event buses
aws events describe-event-bus
Get event bus details
命令描述
aws events create-event-bus
创建事件总线
aws events delete-event-bus
删除事件总线
aws events list-event-buses
列出事件总线
aws events describe-event-bus
获取事件总线详情

Rules

规则

CommandDescription
aws events put-rule
Create or update rule
aws events delete-rule
Delete rule
aws events list-rules
List rules
aws events describe-rule
Get rule details
aws events enable-rule
Enable rule
aws events disable-rule
Disable rule
命令描述
aws events put-rule
创建或更新规则
aws events delete-rule
删除规则
aws events list-rules
列出规则
aws events describe-rule
获取规则详情
aws events enable-rule
启用规则
aws events disable-rule
禁用规则

Targets

目标

CommandDescription
aws events put-targets
Add targets to rule
aws events remove-targets
Remove targets
aws events list-targets-by-rule
List rule targets
命令描述
aws events put-targets
为规则添加目标
aws events remove-targets
移除目标
aws events list-targets-by-rule
列出规则关联的目标

Events

事件

CommandDescription
aws events put-events
Publish events
命令描述
aws events put-events
发布事件

Best Practices

最佳实践

Event Design

事件设计

  • Use meaningful source names
    company.service.component
  • Use descriptive detail-types
    Order Created
    ,
    User Signed Up
  • Include correlation IDs for tracing
  • Keep events small (< 256 KB)
  • Use versioning for event schemas
python
undefined
  • 使用有意义的源名称
    company.service.component
    格式
  • 使用描述性的事件类型 — 如
    Order Created
    User Signed Up
  • 包含关联ID 用于追踪链路
  • 保持事件体积小巧(小于256 KB)
  • 对事件 schema 进行版本控制
python
undefined

Good event structure

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': {...} }) }
undefined
{ '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': {...} }) }
undefined

Reliability

可靠性

  • Use DLQs for failed deliveries
  • Implement idempotency in consumers
  • Monitor failed invocations
  • Use archive and replay for recovery
  • 使用死信队列(DLQ) 处理投递失败的事件
  • 在消费者端实现幂等性
  • 监控失败调用情况
  • 使用归档与重放功能 进行故障恢复

Security

安全性

  • Use resource policies to control access
  • Enable encryption with KMS
  • Use IAM roles for targets
  • 使用资源策略 控制访问权限
  • 启用KMS加密
  • 为目标使用IAM角色

Cost Optimization

成本优化

  • Use specific event patterns to reduce matches
  • Batch events when publishing (up to 10 per call)
  • Archive selectively — not all events
  • 使用精准的事件模式 减少匹配次数
  • 发布事件时批量处理(每次调用最多10个事件)
  • 选择性归档 — 无需归档所有事件

Troubleshooting

故障排查

Rule Not Triggering

规则未触发

Debug:
bash
undefined
调试步骤:
bash
undefined

Check rule status

Check rule status

aws events describe-rule --name my-rule
aws events describe-rule --name my-rule

Check targets

Check targets

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

Test event pattern

Test event pattern

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

**Common causes:**
- Rule disabled
- Event pattern doesn't match
- Target permissions missing
aws events test-event-pattern
--event-pattern '{"source": ["my-app"]}'
--event '{"source": "my-app", "detail-type": "Test"}'

**常见原因:**
- 规则处于禁用状态
- 事件模式不匹配
- 目标缺少权限

Lambda Not Invoked

Lambda 未被调用

Check Lambda permissions:
bash
aws lambda get-policy --function-name MyFunction
Required permission:
json
{
  "Principal": "events.amazonaws.com",
  "Action": "lambda:InvokeFunction",
  "Resource": "function-arn",
  "Condition": {
    "ArnLike": {
      "AWS:SourceArn": "rule-arn"
    }
  }
}
检查Lambda权限:
bash
aws lambda get-policy --function-name MyFunction
所需权限示例:
json
{
  "Principal": "events.amazonaws.com",
  "Action": "lambda:InvokeFunction",
  "Resource": "function-arn",
  "Condition": {
    "ArnLike": {
      "AWS:SourceArn": "rule-arn"
    }
  }
}

Events Not Reaching Custom Bus

事件未到达自定义总线

Check:
  • Publishing to correct bus name
  • Event format is valid JSON
  • Put events has proper permissions
bash
undefined
检查项:
  • 发布时使用了正确的总线名称
  • 事件格式为有效的JSON
  • 发布事件的操作拥有正确权限
bash
undefined

Test publish

Test publish

aws events put-events
--entries '[{ "Source": "test", "DetailType": "Test Event", "Detail": "{}", "EventBusName": "my-app-events" }]'
undefined
aws events put-events
--entries '[{ "Source": "test", "DetailType": "Test Event", "Detail": "{}", "EventBusName": "my-app-events" }]'
undefined

Viewing Failed Events

查看失败事件

bash
undefined
bash
undefined

Enable CloudWatch metrics

Enable CloudWatch metrics

aws events put-rule
--name my-rule
--event-pattern '...'
--state ENABLED
aws events put-rule
--name my-rule
--event-pattern '...'
--state ENABLED

Check FailedInvocations metric

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
undefined
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
undefined

References

参考资料