EventBridge 규칙에 대한 사용자 지정 이벤트 패턴을 생성하려면 어떻게 해야 하나요?

최종 업데이트 날짜: 2022년 9월 27일

Amazon EventBridge 규칙을 사용하여 AWS 서비스에 대한 특정 이벤트를 캡처하려고 합니다. 하지만 이벤트와 일치하는 사용자 지정 이벤트 패턴을 생성할 수 없습니다. 사용자 지정 EventBridge 이벤트 패턴을 생성하려면 어떻게 해야 하나요?

해결 방법

참고: AWS Command Line Interface(AWS CLI) 명령을 실행할 때 오류 메시지가 표시되는 경우 AWS CLI 최신 버전을 사용 중인지 확인합니다.

EventBridge는 AWS 서비스, EventBridge 파트너의 이벤트 및 사용자 지정 이벤트를 수락합니다. 이 문서에서는 AWS 서비스에서 발생하는 JSON 이벤트에 대해 설명합니다. 이벤트 패턴을 사용하여 EventBridge 규칙을 생성하여 수신 이벤트를 필터링할 수 있습니다. 이렇게 하면 EventBridge 규칙이 원하는 이벤트만 매칭하고 해당 이벤트를 대상에 전달합니다.

수신 이벤트의 JSON 형식 결정

수신 이벤트에 대한 JSON 형식을 결정하는 방법은 다음과 같이 3가지가 있습니다.

    1. EventBridge 콘솔을 엽니다.
    2. 탐색 창의 개발자 리소스에서 샌드박스를 선택합니다.
    3. 샘플 이벤트 섹션으로 스크롤한 다음 AWS 이벤트를 선택합니다.
    4. 샘플 이벤트 메뉴에서 EC2 인스턴스 상태 변경 알림을 선택합니다. 그러면 창이 첫 번째 샘플 이벤트로 채워집니다. 특정 이벤트 유형에 대해 여러 샘플을 사용할 수 있습니다.
  • 지정 AWS 서비스의 모든 이벤트와 일치하는 간단한 이벤트 패턴을 사용하여 EventBridge 규칙을 생성합니다. 예를 들어, 이 이벤트 패턴은 모든 Amazon Elastic Compute Cloud(Amazon EC2) 이벤트와 일치합니다.
{
 "source": [ "aws.ec2" ]
}

참고: 와일드카드 및 빈 이벤트는 이벤트 패턴로 허용되지 않습니다.

다음으로 SNS 또는 CloudWatch 로그 그룹 대상을 규칙과 연결하여 인바운드 이벤트를 캡처합니다. 서비스에서 내보낸 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(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단계: 해당 EventPattern 생성

이 예제 이벤트 패턴은 여러 필드를 필터링합니다. 예: eventName, hostedZoneld, actiontype. 일치하는 이벤트는 모든 필드와 해당 값을 포함해야 합니다. 이 패턴은 특정 호스팅 영역에 대해 생성된 A 레코드를 격리합니다.

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

이벤트 패턴 테스트

EventBridge 콘솔을 사용하여 테스트

EventBridge 샌드박스 활용: 

  1. 샘플 이벤트 섹션에서 샘플 이벤트를 선택하거나 입력합니다.
  2. 이벤트 패턴 섹션에서 이벤트 패턴을 입력합니다. 이벤트 패턴 양식의 메뉴를 사용하여 이벤트 패턴을 작성하거나 사용자 지정 패턴(JSON 편집기)으로 사용자 지정 이벤트 패턴을 입력하여 이 작업을 수행할 수 있습니다.
  3. 두 섹션을 모두 채운 후 패턴 테스트를 선택하여 이벤트 패턴이 지정된 샘플 이벤트와 일치하는지 확인합니다.

AWS CLI를 사용하여 테스트

AWS CLI에서 test-event-pattern 명령을 실행합니다. 이벤트 패턴이 일치하는지 보려면 결과가 true인지 확인합니다. 이렇게 하면 AWS 서비스에서 전송한 JSON 이벤트를 식별하고 특정 이벤트를 캡처하는 사용자 지정 이벤트 패턴을 지원할 수 있습니다.