如何使用输入转换器为 API 调用设置人类可读的 CloudWatch Events 通知?

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

我想在 Amazon CloudWatch Events 中收到有关 Amazon Elastic Compute Cloud (Amazon EC2) 安全组 API 调用的人类可读的通知。如何使用输入转换器设置通知,但不接收完整的 JSON 日志事件详细信息?

简短描述

您可以使用事件模式为 AWS CloudTrail 日志数据中的安全组相关 API 调用创建 Amazon CloudWatch Events 通知。然后,您可以使用输入转换器将来自 JSON 的事件转换为人类可读的自定义通知。有关更多信息,请参阅教程:使用输入转换器自定义要传递给事件目标的内容

解决方法

示例事件

在下面的示例事件中,当用户在 Virtual Private Cloud (VPC) 中使用 CreateSecurityGroup 创建了一个安全组时,系统捕获了一个 CloudTrail 日志事件。然后系统以 JSON 格式将此事件发布到 CloudWatch,如下所示: 

{
	"version": "0",
	"id": "41dff147-cfbc-492a-9a98-9dd00d082417",
	"detail-type": "AWS API Call via CloudTrail",
	"source": "aws.ec2",
	"account": "123456789012",
	"time": "2017-07-14T16:36:23Z",
	"region": "us-east-1",
	"resources": [],
	"detail": {
		"eventVersion": "1.05",
		"userIdentity": {
			"type": "Root",
			"principalId": "123456789012",
			"arn": "arn:aws:iam::123456789012:root",
			"accountId": "123456789012",
			"accessKeyId": "ASIAIRP4G1234567891Q",
			"userName": "iamuser",
			"sessionContext": {
				"attributes": {
					"mfaAuthenticated": "false",
					"creationDate": "2017-07-14T16:27:38Z"
				}
			}
		},
		"eventTime": "2017-07-14T16:36:23Z",
		"eventSource": "ec2.amazonaws.com",
		"eventName": "CreateSecurityGroup",
		"awsRegion": "us-east-1",
		"sourceIPAddress": "72.21.196.64",
		"userAgent": "console.ec2.amazonaws.com",
		"requestParameters": {
			"groupName": "test",
			"groupDescription": "test",
			"vpcId": "vpc-54a4232d"
		},
		"responseElements": {
			"_return": true,
			"groupId": "sg-82d531f3"
		},
		"requestID": "a4609e55-69ac-4a2d-8057-843dc8b4658b",
		"eventID": "7774b898-59c1-48a5-9c41-af1bcaa04612",
		"eventType": "AwsApiCall"
	}
}

示例解决方法

以下面的示例解决方法为模型,利用 JSON 格式的 CloudWatch Events 事件创建人类可读的自定义通知。

1.    为安全组相关的 API 调用创建 CloudWatch Events 规则。对于事件模式,选择生成自定义事件模式。请务必根据您的使用案例修改示例事件模式。请注意,虽然示例通知是针对 CreateSecurityGroup 的,下面的示例事件模式包含了所有安全组相关的 API 调用操作:

{
  "source": [
    "aws.ec2"
  ],
  "detail-type": [
    "AWS API Call via CloudTrail"
  ],
  "detail": {
    "eventSource": [
      "ec2.amazonaws.com"
    ],
    "eventName": [
      "CreateSecurityGroup",
      "AuthorizeSecurityGroupEgress",
      "AuthorizeSecurityGroupIngress",
      "DeleteSecurityGroup",
      "RevokeSecurityGroupEgress",
      "RevokeSecurityGroupIngress",
      "DescribeStaleSecurityGroups",
      "DescribeSecurityGroups",
      "DescribeSecurityGroupReferences"
    ]
  }
}

2.    对于规则的目标,选择配置输入下的输入转换器

3.    在第一个输入框中,配置您的输入路径。其中应包含将您的通知中使用的任何键值对。请务必根据您的使用案例修改以下示例输入路径:

{"sgname":"$.detail.requestParameters.groupName","sourceip":"$.detail.sourceIPAddress","vpcid":"$.detail.requestParameters.vpcId","action":"$.detail.eventName","sgid":"$.detail.responseElements.groupId","time":"$.detail.eventTime","region":"$.detail.awsRegion","user":"$.detail.userIdentity.userName","reqid":"$.detail.requestID"}

注意:CloudWatch Events 目前支持在输入路径图中使用不超过 10 个变量。要提取 10 个以上的变量,请将整个事件传送到一个 AWS Lambda 函数以进行解析。然后,按要求的格式构建消息正文以发布到 Amazon Simple Notification Service (Amazon SNS)。

4.    在第二个输入框中,配置输入模板。其中应包含一个用占位符来代表您的输入路径值的字符串。此字符串是您的通知的人类可读文本。请务必根据您的使用案例修改以下示例输入模板:

"User <user>  has executed API call <action> from source IP <sourceip> on security group <sgid>/<sgname> that belongs to vpc <vpcid> in region <region> at time(UTC) <time>. The Request ID is <reqid>."

注意:如果您在保存含有换行符的模板时收到输入模板无效错误消息,请确保每行都以上引号结尾。例如:

"<type> <arn> has executed action API <action> on Security Group <sgid> located in AWS region <region> at <time> (UTC)."
"Event Details:"
"Request ID: <requestid>"
"Event ID: <eventid>"
"Event Source: <eventsource>"
"Event Type: <eventtype>"

5.    选择配置详细信息

6.    指定规则的名称和描述。

7.    选择创建规则


这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助?