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

上次更新时间:2020 年 2 月 3 日

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

解决方法

AWS 服务以预定义的 JSON 格式生成事件并发送到 Amazon CloudWatch Events。您可以创建使用事件模式来筛选传入事件,然后触发目标的规则。

确定传入事件的 JSON 格式

请参阅此事件示例列表。您也可完成下列操作来查看您的传入事件:

1.    使用与特定服务的所有事件匹配的简单事件模式创建 CloudWatch 事件规则。对于事件源,选择事件模式
注意:事件模式中不允许使用通配符。此外也不允许使用空事件模式。

例如,使用以下筛选条件来查看 Amazon Elastic Compute Cloud (Amazon EC2) 服务生成的所有事件:

{
 "source": [ "aws.ec2" ]
}

2.    使用 SNS 主题或 CloudWatch Logs 将目标附加到您的规则。这样,所有匹配的事件都将通过 SNS 主题或 CloudWatch Logs 收到。您会收到特定 AWS 服务发送的相应 JSON 事件。根据这些结果,您可以创建自定义事件模式。请确保 CloudWatch 规则的输入转换器使用的是默认设置(配置输入:匹配的事件),以确保按原样转发传入的事件。

创建与传入事件具有相同 JSON 格式的事件模式

以下规则适用于创建有效的匹配事件模式:

  • 您在事件模式中未指定的任何字段将会自动匹配。例如,如果事件模式中未指定详细信息字段,则事件模式将会匹配具有任何详细信息的所有事件。
  • 要匹配 JSON 结构中的下一级字段,请使用大括号 { }。如果您要查看更大的事件结构,则 JSON 查看器可能会有帮助。
  • 要从 JSON 事件匹配的字符串必须位于方括号 [ ] 中。您可以在方括号中包含多个值,以便在传入事件中具有任何一个值时触发事件。例如,要根据 Amazon EC2 或 Amazon DynamoDB 发送的每个事件触发事件,可以使用如下筛选条件:
{
 "source": [ "aws.ec2", "aws.dynamodb" ]
}

注意:您必须删除服务发送的任何 JSON 事件中的方括号,以确保该事件模式被标记为有效。例如,要在为某个特定的 Amazon Route 53 托管区域创建类型 A 记录时收到通知,请使用以下筛选条件。

Route 53 发送到 CloudWatch Events 的事件(从 SNS 主题或 CloudWatch Logs 收到的事件):

{
    "version": "0",
    "id": "d857ae5c-cc83-3742-ab88-d825311ee4e9",
    "detail-type": "AWS API Call via CloudTrail",
    "source": "aws.route53",
    "account": "756022511916",
    "time": "2019-12-05T16:50:53Z",
    "region": "us-east-1",
    "resources": [

    ],
    "detail": {
        "eventVersion": "1.05",
        "userIdentity": {
            "type": "AssumedRole",
            "principalId": "AROAIVOJE6CTAWGSJQUP2:patsusha-Isengard",
            "arn": "arn:aws:sts::756022511916:assumed-role/Admin/patsusha-Isengard",
            "accountId": "756022511916",
            "accessKeyId": "ASIA3ABTUBEWCHWLUGFI",
            "sessionContext": {
                "sessionIssuer": {
                    "type": "Role",
                    "principalId": "AROAIVOJE6CTAWGSJQUP2",
                    "arn": "arn:aws:iam::756022511916:role/Admin",
                    "accountId": "756022511916",
                    "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": "72.21.196.66",
        "userAgent": "console.amazonaws.com",
        "requestParameters": {
            "hostedZoneId": "Z1RP9G2VYLRY8V",
            "changeBatch": {
                "changes": [
                    {
                        "action": "CREATE",
                        "resourceRecordSet": {
                            "type": "A",
                            "tTL": 300,
                            "resourceRecords": [
                                {
                                    "value": "4.4.4.4"
                                }
                            ],
                            "name": "test4.sushantpatil.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": ["Z1RP9G2VYLRY8V"],
            "changeBatch": {
                "changes":
                    {
                        "action": ["CREATE"],
                        "resourceRecordSet": {
                            "type": ["A"]
                        }
                    }
            }
        }
    }
}

使用 AWS 命令行界面 (AWS CLI) 测试事件模式

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


这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助?