如何为 EventBridge 规则创建自定义事件模式?

上次更新日期:2022 年 9 月 27 日

我想使用 Amazon EventBridge 规则来捕获 AWS 服务的特定事件。但我无法创建与该事件匹配的自定义事件模式。如何创建自定义的 EventBridge 事件模式?

解决方法

注意:如果您在运行 AWS 命令行界面(AWS CLI)命令时遇到错误,请确保您使用的是最新版本的 AWS CLI

EventBridge 接受来自 AWS 服务、EventBridge 合作伙伴和自定义事件的事件。本文讨论源自 AWS 服务的 JSON 事件。您可以使用事件模式创建 EventBridge 规则来筛选传入的事件。这样,EventBridge 规则仅匹配所需的事件并将这些事件转发给目标。

确定传入事件的 JSON 格式

确定传入事件的 JSON 格式有三种方法:

    1. 打开 EventBridge 控制台
    2. 在导航窗格的 Developer resources(开发人员资源)下,选择 Sandbox(沙盒)。
    3. 滚动到 Sample event(示例事件)部分,然后选择 AWS events(AWS 事件)。
    4. Sample event(示例事件)菜单中,选择 EC2 Instance State-change Notification(EC2 实例状态更改通知)。这将使用第一个示例事件填充该窗口。对于给定的事件类型,可能有多个示例可用。
  • 使用与给定 AWS 服务的所有事件匹配的简单事件模式创建 EventBridge 规则。例如,此事件模式匹配所有 Amazon Elastic Compute Cloud (Amazon EC2) 事件:
{
 "source": [ "aws.ec2" ]
}

注意:事件模式中不允许使用通配符和空事件。

接下来,将 SNSCloudWatch 日志组目标与捕获入站事件的规则关联起来。目标必须将 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:创建相应的事件模式

此示例事件模式筛选多个字段。例如,eventNamehostedZoneldactiontype。匹配事件必须包含所有字段和相应的值。该模式隔离针对特定托管区域创建的 A 记录。

{
  "source": [
    "aws.route53"
  ],
  "detail": {
    "eventSource": [
      "route53.amazonaws.com"
    ],
    "eventName": [
      "ChangeResourceRecordSets"
    ],
    "requestParameters": {
      "hostedZoneId": [
        "Z1RP12345WXRQD"
      ],
      "changeBatch": {
        "changes": {
          "action": [
            "CREATE"
          ],
          "resourceRecordSet": {
            "type": [
              "A"
            ]
          }
        }
      }
    }
  }
}

测试事件模式

使用 EventBridge 控制台进行测试

利用 EventBridge 沙盒: 

  1. Sample event(示例事件)部分中,选择或输入示例事件。
  2. Event pattern(事件模式)部分下,提供事件模式。为此,您可以使用 Event pattern form(事件模式表单)中的菜单构建事件模式,也可以使用 Custom patterns (JSON editor)(自定义模式(JSON 编辑器))输入自定义事件模式。
  3. 填充这两个部分后,选择 Test pattern(测试模式)以确认事件模式与给定的示例事件相匹配。

使用 AWS CLI 进行测试

在 AWS CLI 中,运行 test-event-pattern 命令。要确认事件模式匹配,请确保结果为 true。通过执行此操作,您可以识别 AWS 服务发送的 JSON 事件,并协助您的自定义事件模式捕获特定的事件。