如何为 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 事件,并让您的自定义事件模式可以捕获特定的事件。