You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CloudWatch EventBridge输入转换异常:WAF事件通知仅时间有效

问题描述

为了在WAF规则更新时接收通知,已创建CloudTrail管理事件,并在CloudWatch EventBridge中配置规则,事件模式如下:

{
  "source": ["aws.waf", "aws.wafv2"],
  "detail-type": ["AWS API Call via CloudTrail"],
  "detail": {
    "eventSource": ["waf.amazonaws.com", "wafv2.amazonaws.com"],
    "eventName": ["UpdateWebACL", "CreateWebACL", "DeleteWebACL", "UpdateRule", "CreateRule", "DeleteRule", "UpdateRuleGroup", "CreateRuleGroup", "DeleteRuleGroup"]
  }
}

目标设置为SNS主题,同时配置了以下输入转换:

{
    "eventName": "$.details.eventName",
    "timestamp": "$.time",
    "user": "$.details.userIdentity.userName",
    "webACLName": "$.details.requestParameters.name"
}

以及模板:

"EventName: <eventName>"
"WebACL: <webACLName>"
"Time: \"<timestamp>\""
"User: <user>"

触发WebACL更新时能收到通知,但除时间外其他字段均为空。在“AWS事件”下无法找到API Trail,但选择“匹配事件的一部分”并指定$.details时,能看到完整事件详情(示例如下):

{
    "eventVersion": "1.08",
    "userIdentity": {
        "type": "IAMUser",
        "principalId": "xxxxxx",
        "arn": "arn:aws:iam::xxx:user/test",
        "accountId": "xxxx",
        "accessKeyId": "xxxx",
        "userName": "test",
        "sessionContext": {
            "sessionIssuer": {},
            "webIdFederationData": {},
            "attributes": {
                "creationDate": "2024-09-03T17:45:01Z",
                "mfaAuthenticated": "false"
            }
        }
    },
    "eventTime": "2024-09-04T05:44:42Z",
    "eventSource": "wafv2.amazonaws.com",
    "eventName": "CreateWebACL",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "xx.xx.xx.xx",
    "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36",
    "requestParameters": {
        "name": "testwaf",
        "scope": "REGIONAL",
        "defaultAction": {
            "allow": {}
        },
        "rules": [
            {
                "name": "AWS-AWSManagedRulesCommonRuleSet",
                "priority": 0,
                "statement": {
                    "managedRuleGroupStatement": {
                        "vendorName": "AWS",
                        "name": "AWSManagedRulesCommonRuleSet",
                        "excludedRules": [],
                        "ruleActionOverrides": [
                            {
                                "name": "CrossSiteScripting_BODY",
                                "actionToUse": {
                                    "count": {}
                                }
                            },
                            {
                                "name": "UserAgent_BadBots_HEADER",
                                "actionToUse": {
                                    "count": {}
                                }
                            }
                        ]
                    }
                },
                "overrideAction": {
                    "none": {}
                },
                "visibilityConfig": {
                    "sampledRequestsEnabled": true,
                    "cloudWatchMetricsEnabled": true,
                    "metricName": "AWS-AWSManagedRulesCommonRuleSet"
                }
            }
        ],
        "visibilityConfig": {
            "sampledRequestsEnabled": true,
            "cloudWatchMetricsEnabled": true,
            "metricName": "testwaf"
        },
        "associationConfig": {}
    },
    "responseElements": {
        "summary": {
            "name": "testwaf",
            "id": "xxxe",
            "description": "",
            "lockToken": "xxxx",
            "aRN": "arn:aws:wafv2:us-east-1:xxxx:regional/webacl/testwaf/xxx"
        }
    },
    "requestID": "xxx",
    "eventID": "xxx",
    "readOnly": false,
    "eventType": "AwsApiCall",
    "apiVersion": "2019-04-23",
    "managementEvent": true,
    "recipientAccountId": "xxx",
    "eventCategory": "Management",
    "tlsDetails": {
        "tlsVersion": "TLSv1.3",
        "cipherSuite": "TLS_AES_128_GCM_SHA256",
        "clientProvidedHostHeader": "wafv2.us-east-1.amazonaws.com"
    },
    "sessionCredentialFromConsole": "true"
}

询问是否有直接的转换方式提取事件值,还是需要使用Lambda编写自定义逻辑。

解决方法

不需要使用Lambda,直接修正输入转换里的JSON路径即可,问题出在路径拼写和字段定位错误:

  • 路径拼写错误:输入转换里写的$.details是错误的,EventBridge中CloudTrail事件的相关内容实际在$.detail字段下(单数形式,而非复数)。
  • 时间字段错误:时间字段应取$.detail.eventTime,而非$.time。

修正后的输入转换如下:

{
    "eventName": "$.detail.eventName",
    "timestamp": "$.detail.eventTime",
    "user": "$.detail.userIdentity.userName",
    "webACLName": "$.detail.requestParameters.name"
}

模板可保持不变,也可调整为更简洁的格式:

EventName: <eventName>
WebACL: <webACLName>
Time: <timestamp>
User: <user>

修正后,SNS通知就能正确提取所有字段的值。

内容的提问来源于stack exchange,提问作者user14013917

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 18:55:08