입력 변환기를 사용하여 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"
	}
}

예제 해결 방법

다음의 예제 해결 방법을 모델로 삼아 CloudWatch Events에서 JSON 형식으로 사람이 읽을 수 있는 사용자 지정 알림을 생성할 수 있습니다.

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>."

참고: 줄 바꿈을 포함하여 템플릿을 저장했을 때 Invalid InputTemplate 오류가 발생한다면 각 줄을 큰따옴표로 닫으세요. 예:

"<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.    [규칙 생성]을 선택합니다.


이 문서가 도움이 되었습니까?

AWS에서 개선해야 할 부분이 있습니까?


도움이 필요하십니까?