如何为 EventBridge 规则创建自定义事件模式?
上次更新日期:2022 年 1 月 26 日
我想使用 Amazon EventBridge 规则来捕获 AWS 服务的特定事件。但我无法创建与该事件匹配的自定义事件模式。如何创建自定义的 EventBridge 事件模式?
解决方法
注意:如果您在运行 AWS Command Line Interface (AWS CLI) 命令时遇到错误,请确保您使用的是最新版本的 AWS CLI。
AWS 服务以预定义的 JSON 格式生成事件并发送到 Amazon EventBridge。您可以创建使用事件模式来筛选传入事件,然后触发目标的规则。
确定传入事件的 JSON 格式
确定传入事件的 JSON 格式有三种方法:
1. 请参阅此事件示例列表。
2. 使用集成到 Amazon EventsBridge 控制台中的示例事件。要使用示例事件,请执行以下操作:
对于 Event matching pattern(事件匹配模式),选择 Pre-defined pattern by service(按服务分类的预定义模式)。从下拉列表中选择 Service provider(服务提供商)。从下拉列表中选择 Service name(服务名称)。从下拉列表中选择 Event type(事件类型)。选择事件是针对任何资源还是特定资源。选择事件是针对任何状态还是特定状态。Event pattern(事件模式)文本框将填充选定的示例事件模式。您可以根据需要复制或编辑模式。
3. 使用与特定服务的所有事件匹配的简单事件模式创建 EventBridge 规则。对于 Define pattern(定义模式),选择 Event Pattern(事件模式)。
注意:事件模式中不允许使用通配符。此外也不允许使用空事件模式。
例如,使用以下筛选条件来查看 Amazon Elastic Compute Cloud (Amazon EC2) 服务生成的所有事件:
{
"source": [ "aws.ec2" ]
}
使用 SNS 主题或 CloudWatch Logs 将目标附加到您的规则。这样,所有匹配的事件都将通过 SNS 主题或 CloudWatch Logs 收到。您会收到特定 AWS 服务发送的相应 JSON 事件。根据这些结果,您可以创建自定义事件模式。请确保 EventBridge 规则的输入转换器使用的是默认设置(配置输入:匹配的事件),以确保按原样转发传入的事件。
创建与传入事件具有相同 JSON 格式的事件模式
以下规则适用于创建有效的匹配事件模式:
- 您在事件模式中未指定的任何字段将会自动匹配。例如,如果事件模式中未指定 Detail(详细信息)字段,则事件模式将会匹配具有任何详细信息的所有事件。
- 要匹配 JSON 结构中的下一级字段,请使用大括号 { }。如果您要查看更大的事件结构,则 JSON 查看器可能会有帮助。
- 要从 JSON 事件匹配的字符串必须位于方括号 [ ] 中。您可以在方括号中包含多个值,以便在传入事件中具有任何一个值时触发事件。例如,要根据 Amazon EC2 或 Amazon DynamoDB 发送的每个事件触发事件,可以使用如下筛选条件:
{
"source": [ "aws.ec2", "aws.dynamodb" ]
}
注意:您必须删除服务发送的任何 JSON 事件中的方括号,以确保该事件模式被标记为有效。例如,要在为某个特定的 Amazon Route 53 托管区域创建类型 A 记录时收到通知,请使用以下筛选条件。
Route 53 发送到 EventBridge 的事件(从 SNS 主题或 CloudWatch Logs 收到的事件):
{
"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"
}
}
为您的托管区域创建类型 A 记录时事件筛选条件模式将会收到通知:
{
"source": ["aws.route53"],
"detail": {
"eventSource": ["route53.amazonaws.com"],
"eventName": ["ChangeResourceRecordSets"],
"requestParameters": {
"hostedZoneId": ["Z1RP12345WXRQD"],
"changeBatch": {
"changes":
{
"action": ["CREATE"],
"resourceRecordSet": {
"type": ["A"]
}
}
}
}
}
}
测试事件模式
使用 EventBridge 控制台进行测试
您可以在创建规则时测试事件模式。选择 Test event pattern(测试事件模式)以测试您的事件。
使用 AWS CLI 进行测试
在 AWS CLI 中,运行 test-event-pattern 命令。要确认事件模式匹配,请确保结果为 true。通过执行此操作,您可以识别 AWS 服务发送的 JSON 事件,并让您的自定义事件模式可以捕获特定的事件。