

# Amazon EventBridge를 사용하여 canary 이벤트 모니터링
<a name="monitoring-events-eventbridge"></a>

Amazon EventBridge 이벤트 규칙은 canary가 상태를 변경하거나 실행을 완료할 경우 이를 알려줄 수 있습니다. EventBridge는 AWS 리소스의 변경 사항을 설명하는 시스템 이벤트의 스트림을 거의 실시간으로 제공합니다. CloudWatch Synthetics는 이러한 이벤트를 **‘최선을 다해’ EventBridge에 전송합니다. 최선을 다한 전달이란 CloudWatch Synthetics가 모든 이벤트를 EventBridge에 전송하려고 시도하지만 드물게 이벤트가 전달되지 않을 수 있음을 의미합니다. EventBridge는 수신한 모든 이벤트를 한 번 이상 처리합니다. 또한 이벤트 리스너는 이벤트가 발생한 순서대로 이벤트를 수신하지 못할 수 있습니다.

**참고**  
Amazon EventBridge는 애플리케이션을 다양한 소스의 데이터와 연결하는 데 사용할 수 있는 이벤트 버스 서비스입니다. 자세한 내용은 *Amazon EventBridge 사용 설명서*의 [Amazon EventBridge란?](https://docs.aws.amazon.com/eventbridge/latest/userguide/what-is-amazon-eventbridge.html) 단원을 참조하세요.

CloudWatch Synthetics는 canary가 상태를 변경하거나 실행을 완료할 경우 이벤트를 내보냅니다. CloudWatch Synthetics에서 전송한 모든 이벤트 유형과 일치하거나 특정 이벤트 유형과만 일치하는 이벤트 패턴을 포함하는 EventBridge 규칙을 생성할 수 있습니다. canary가 규칙을 트리거하면 EventBridge는 규칙에 정의된 대상 작업을 호출합니다. 이렇게 하면 canary 상태 변경 또는 canary 실행 완료에 대한 응답으로 알림을 전송하고 이벤트 정보를 캡처하며 수정 작업을 수행할 수 있습니다. 예를 들어 다음 사용 사례에 대한 규칙을 생성할 수 있습니다.
+ canary 실행이 실패할 경우 조사
+ canary가 `ERROR` 상태가 된 경우 조사
+ canary의 수명 주기 추적
+ 워크플로의 일부로 canary 실행 성공 또는 실패 모니터링

## CloudWatch Synthetics의 이벤트 예
<a name="synthetics-event-examples"></a>

이 단원에서는 CloudWatch Synthetics의 이벤트 예를 설명합니다. 이벤트 형식에 대한 자세한 내용은 [EventBridge의 이벤트 및 이벤트 패턴](https://docs.aws.amazon.com/eventbridge/latest/userguide/eventbridge-and-event-patterns.html) 단원을 참조하세요.

 **canary 상태 변경** 

이 이벤트 유형에서 `current-state` 및 `previous-state` 값은 다음일 수 있습니다.

`CREATING` \$1 `READY` \$1 `STARTING` \$1 `RUNNING` \$1 `UPDATING` \$1 `STOPPING` \$1 `STOPPED` \$1 `ERROR`

```
{
                "version": "0",
                "id": "8a99ca10-1e97-2302-2d64-316c5dedfd61",
                "detail-type": "Synthetics Canary Status Change",
                "source": "aws.synthetics",
                "account": "123456789012",
                "time": "2021-02-09T22:19:43Z",
                "region": "us-east-1",
                "resources": [],
                "detail": {
                                "account-id": "123456789012",
                                "canary-id": "EXAMPLE-dc5a-4f5f-96d1-989b75a94226",
                                "canary-name": "events-bb-1",
                                "current-state": "STOPPED",
                                "previous-state": "UPDATING",
                                "source-location": "NULL",
                                "updated-on": 1612909161.767,
                                "changed-config": {
                                                "executionArn": {
                                                                "previous-value": "arn:aws:lambda:us-east-1:123456789012:function:cwsyn-events-bb-1-af3e3a05-dc5a-4f5f-96d1-989EXAMPLE:1",
                                                                "current-value": "arn:aws:lambda:us-east-1:123456789012:function:cwsyn-events-bb-1-af3e3a05-dc5a-4f5f-96d1-989EXAMPLE:2"
                                                },
                                                "vpcId": {
                                                                "current-value": "NULL"
                                                },
                                                "testCodeLayerVersionArn": {
                                                                "previous-value": "arn:aws:lambda:us-east-1:123456789012:layer:cwsyn-events-bb-1-af3e3a05-dc5a-4f5f-96d1-989EXAMPLE:1",
                                                                "current-value": "arn:aws:lambda:us-east-1:123456789012:layer:cwsyn-events-bb-1-af3e3a05-dc5a-4f5f-96d1-989EXAMPLE:2"
                                                }
                                },
                                "message": "Canary status has changed"
                }
}
```

 **성공적인 canary 실행 완료** 

```
{
                "version": "0",
                "id": "989EXAMPLE-f4a5-57a7-1a8f-d9cc768a1375",
                "detail-type": "Synthetics Canary TestRun Successful",
                "source": "aws.synthetics",
                "account": "123456789012",
                "time": "2021-02-09T22:24:01Z",
                "region": "us-east-1",
                "resources": [],
                "detail": {
                                "account-id": "123456789012",
                                "canary-id": "989EXAMPLE-dc5a-4f5f-96d1-989b75a94226",
                                "canary-name": "events-bb-1",
                                "canary-run-id": "c6c39152-8f4a-471c-9810-989EXAMPLE",
                                "artifact-location": "cw-syn-results-123456789012-us-east-1/canary/us-east-1/events-bb-1-ec3-28ddbe266797/2021/02/09/22/23-41-200",
                                "test-run-status": "PASSED",
                                "state-reason": "null",
                                "canary-run-timeline": {
                                                "started": 1612909421,
                                                "completed": 1612909441
                                },
                                "message": "Test run result is generated successfully"
                }
}
```

 **실패한 canary 실행 완료** 

```
{
                "version": "0",
                "id": "2644b18f-3e67-5ebf-cdfd-bf9f91392f41",
                "detail-type": "Synthetics Canary TestRun Failure",
                "source": "aws.synthetics",
                "account": "123456789012",
                "time": "2021-02-09T22:24:27Z",
                "region": "us-east-1",
                "resources": [],
                "detail": {
                                "account-id": "123456789012",
                                "canary-id": "af3e3a05-dc5a-4f5f-96d1-9989EXAMPLE",
                                "canary-name": "events-bb-1",
                                "canary-run-id": "0df3823e-7e33-4da1-8194-b04e4d4a2bf6",
                                "artifact-location": "cw-syn-results-123456789012-us-east-1/canary/us-east-1/events-bb-1-ec3-989EXAMPLE/2021/02/09/22/24-21-275",
                                "test-run-status": "FAILED",
                                "state-reason": "\"Error: net::ERR_NAME_NOT_RESOLVED \""
                                "canary-run-timeline": {
                                                "started": 1612909461,
                                                "completed": 1612909467
                                },
                                "message": "Test run result is generated successfully"
                }
}
```

이벤트가 중복되거나 이벤트 순서가 잘못되었을 수 있습니다. 이벤트 순서를 정하려면 `time` 속성을 사용하세요.

## EventBridge 규칙 생성을 위한 사전 조건
<a name="create-events-rule-prereqs"></a>

CloudWatch Synthetics에 대한 EventBridge 규칙을 생성하기 전에 다음을 수행해야 합니다.
+ Eventbridge의 이벤트, 규칙, 대상을 숙지해야 합니다.
+ EventBridge 규칙에 의해 간접 호출되는 대상을 생성하고 구성해야 합니다. 규칙은 다음을 비롯한 다양한 유형의 대상을 호출할 수 있습니다.
  + Amazon SNS 주제
  + AWS Lambda 함수
  + Kinesis 스트림
  + Amazon SQS 대기열

자세한 내용은 *Amazon EventBridge 사용 설명서*의 [Amazon EventBridge란?](https://docs.aws.amazon.com/eventbridge/latest/userguide/what-is-amazon-eventbridge.html) 및 [Amazon EventBridge 시작하기](https://docs.aws.amazon.com/eventbridge/latest/userguide/eventbridge-getting-set-up.html) 단원을 참조하세요.

## EventBridge 규칙 생성(CLI)
<a name="create-events-rule-cli"></a>

다음 예의 단계에서는 `us-east-1`의 `my-canary-name`이라는 canary가 실행을 완료하거나 상태를 변경할 때 Amazon SNS 주제를 게시하는 EventBridge 규칙을 생성합니다.

1. 규칙을 생성합니다.

   ```
   aws events put-rule \
     --name TestRule \
     --region us-east-1 \ 
     --event-pattern "{\"source\": [\"aws.synthetics\"], \"detail\": {\"canary-name\": [\"my-canary-name\"]}}"
   ```

   패턴에서 생략한 속성은 무시됩니다.

1. 규칙 대상으로 주제를 추가합니다.
   + *topic-arn*을 Amazon SNS 주제의 Amazon 리소스 이름(ARN)으로 바꿉니다.

   ```
   aws events put-targets \
     --rule TestRule \
     --targets "Id"="1","Arn"="topic-arn"
   ```
**참고**  
Amazon EventBridge가 대상 주제를 호출하도록 허용하려면 주제에 리소스 기반 정책을 추가해야 합니다. 자세한 내용은 *Amazon EventBridge 사용 설명서*의 [Amazon SNS 권한](https://docs.aws.amazon.com/eventbridge/latest/userguide/resource-based-policies-eventbridge.html#sns-permissions) 섹션을 참조하세요.

자세한 내용은 *Amazon EventBridge 사용 설명서*에서 [EventBridge의 이벤트 및 이벤트 패턴](https://docs.aws.amazon.com/eventbridge/latest/userguide/eventbridge-and-event-patterns.html) 섹션을 참조하세요.