如何为 EventBridge 规则创建自定义事件模式?
上次更新日期:2022 年 9 月 27 日
我想使用 Amazon EventBridge 规则来捕获 AWS 服务的特定事件。但我无法创建与该事件匹配的自定义事件模式。如何创建自定义的 EventBridge 事件模式?
解决方法
注意:如果您在运行 AWS 命令行界面(AWS CLI)命令时遇到错误,请确保您使用的是最新版本的 AWS CLI。
EventBridge 接受来自 AWS 服务、EventBridge 合作伙伴和自定义事件的事件。本文讨论源自 AWS 服务的 JSON 事件。您可以使用事件模式创建 EventBridge 规则来筛选传入的事件。这样,EventBridge 规则仅匹配所需的事件并将这些事件转发给目标。
确定传入事件的 JSON 格式
确定传入事件的 JSON 格式有三种方法:
- 请参阅此 EventBridge 接收的来自 AWS 服务的示例事件列表。
- EventBridge 提供 EventBridge 沙盒工具来帮助用户创建和验证事件模式。例如,如果您对 EC2 实例状态更改事件感兴趣,则可以执行以下操作:
- 打开 EventBridge 控制台。
- 在导航窗格的 Developer resources(开发人员资源)下,选择 Sandbox(沙盒)。
- 滚动到 Sample event(示例事件)部分,然后选择 AWS events(AWS 事件)。
- 在 Sample event(示例事件)菜单中,选择 EC2 Instance State-change Notification(EC2 实例状态更改通知)。这将使用第一个示例事件填充该窗口。对于给定的事件类型,可能有多个示例可用。
- 使用与给定 AWS 服务的所有事件匹配的简单事件模式创建 EventBridge 规则。例如,此事件模式匹配所有 Amazon Elastic Compute Cloud (Amazon EC2) 事件:
{
"source": [ "aws.ec2" ]
}
注意:事件模式中不允许使用通配符和空事件。
接下来,将 SNS 或 CloudWatch 日志组目标与捕获入站事件的规则关联起来。目标必须将 Configure target input(配置目标输入)选项设置为 Matched events(匹配的事件),这样才能正确接收服务发出的 JSON。
创建与传入事件具有相同 JSON 格式的事件模式
以下规则适用于创建有效的匹配事件模式:
- 您在事件模式中未指定的任何字段将会自动匹配。例如,如果事件模式中未指定 Detail(详细信息)字段,则事件模式将会匹配具有任何详细信息的所有事件。
- 要匹配 JSON 结构中的下一级字段,请使用大括号 { }。如果您要查看更大的事件结构,则 JSON 查看器可能会有帮助。
- 要从 JSON 事件匹配的字符串必须位于方括号 [ ] 中。您可以在方括号中包含多个值,以便在传入事件中具有任何一个值时调用事件。例如,要根据 Amazon EC2 或 Amazon DynamoDB 发送的每个事件调用事件,可以使用如下筛选条件:
{
"source": [ "aws.ec2", "aws.dynamodb" ]
}
步骤 1:使用 SNS /CloudWatch 目标获取传入的事件
此示例显示了向 EventBridge 发出的 Route 53 事件。ChangeResourceRecordSets API 调用表示在 Amazon Route 53 托管区域中创建 A 记录。Amazon Simple Notification Service (Amazon SNS) 主题或 Amazon CloudWatch 日志组目标捕获以下事件:
{
"version": "0",
"id": "d857ae5c-cc83-3742-ab88-d825311ee4e9",
"detail-type": "AWS API Call via CloudTrail",
"source": "aws.route53",
"account": "123456789012",
"time": "2019-12-05T16:50:53Z",
"region": "us-east-1",
"resources": [],
"detail": {
"eventVersion": "1.05",
"userIdentity": {
"type": "AssumedRole",
"principalId": "AROAABCDEFGHIJKLMNOPQ:Admin",
"arn": "arn:aws:sts::123456789012:assumed-role/Admin",
"accountId": "123456789012",
"accessKeyId": "ASIAABCDEFGH12345678",
"sessionContext": {
"sessionIssuer": {
"type": "Role",
"principalId": "AROAABCDEFGHIJKLMNOPQ",
"arn": "arn:aws:iam::123456789012:role/Admin",
"accountId": "123456789012",
"userName": "Admin"
},
"webIdFederationData": {},
"attributes": {
"mfaAuthenticated": "false",
"creationDate": "2019-12-05T16:28:27Z"
}
}
},
"eventTime": "2019-12-05T16:50:53Z",
"eventSource": "route53.amazonaws.com",
"eventName": "ChangeResourceRecordSets",
"awsRegion": "us-east-1",
"sourceIPAddress": "12.34.56.78",
"userAgent": "console.amazonaws.com",
"requestParameters": {
"hostedZoneId": "Z1RP12345WXRQD",
"changeBatch": {
"changes": [
{
"action": "CREATE",
"resourceRecordSet": {
"type": "A",
"tTL": 300,
"resourceRecords": [
{
"value": "4.4.4.4"
}
],
"name": "test.example.us."
}
}
]
}
},
"responseElements": {
"changeInfo": {
"status": "PENDING",
"id": "/change/C271P4WIKN511J",
"submittedAt": "Dec 5, 2019 4:50:53 PM"
}
},
"additionalEventData": {
"Note": "Do not use to reconstruct hosted zone"
},
"requestID": "bbbf9847-96cb-45ef-b617-d535b9fe83d8",
"eventID": "74e2d2c8-7497-4292-94d0-348272dbc4f7",
"eventType": "AwsApiCall",
"apiVersion": "2013-04-01"
}
}
步骤 2:创建相应的事件模式
此示例事件模式筛选多个字段。例如,eventName、hostedZoneld、action 和 type。匹配事件必须包含所有字段和相应的值。该模式隔离针对特定托管区域创建的 A 记录。
{
"source": [
"aws.route53"
],
"detail": {
"eventSource": [
"route53.amazonaws.com"
],
"eventName": [
"ChangeResourceRecordSets"
],
"requestParameters": {
"hostedZoneId": [
"Z1RP12345WXRQD"
],
"changeBatch": {
"changes": {
"action": [
"CREATE"
],
"resourceRecordSet": {
"type": [
"A"
]
}
}
}
}
}
}
测试事件模式
使用 EventBridge 控制台进行测试
利用 EventBridge 沙盒:
- 在 Sample event(示例事件)部分中,选择或输入示例事件。
- 在 Event pattern(事件模式)部分下,提供事件模式。为此,您可以使用 Event pattern form(事件模式表单)中的菜单构建事件模式,也可以使用 Custom patterns (JSON editor)(自定义模式(JSON 编辑器))输入自定义事件模式。
- 填充这两个部分后,选择 Test pattern(测试模式)以确认事件模式与给定的示例事件相匹配。
使用 AWS CLI 进行测试
在 AWS CLI 中,运行 test-event-pattern 命令。要确认事件模式匹配,请确保结果为 true。通过执行此操作,您可以识别 AWS 服务发送的 JSON 事件,并协助您的自定义事件模式捕获特定的事件。