

# 使用 Amazon EventBridge 监控金丝雀事件
<a name="monitoring-events-eventbridge"></a>

在金丝雀更改状态或完成运行时，Amazon EventBridge 事件规则可以通知您。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 会在金丝雀改变状态或完成运行时发出事件。您可以创建一个包含事件模式的 EventBridge 规则，以匹配从 CloudWatch Synthetics 发送的所有事件类型，或者仅匹配特定事件类型。当金丝雀触发规则时，EventBridge 会调用规则中定义的目标操作。这样，您就可以发送通知、捕获事件信息以及采取纠正操作，以响应金丝雀的状态更改或完成运行。例如，您可以为以下使用案例创建规则：
+ 在金丝雀运行失败时执行调查
+ 在金丝雀变为 `ERROR` 状态时执行调查
+ 跟踪金丝雀的生命周期
+ 作为工作流程的一部分监控金丝雀运行成功或故障

## CloudWatch Synthetics 发送的事件示例
<a name="synthetics-event-examples"></a>

本节列出了 CloudWatch Synthetics 发送的事件示例。有关事件格式的更多信息，请参阅 [EventBridge 中的事件和事件模式](https://docs.aws.amazon.com/eventbridge/latest/userguide/eventbridge-and-event-patterns.html)。

 **金丝雀状况更改** 

在此事件类型中，`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"
                }
}
```

 **已完成的成功金丝雀运行** 

```
{
                "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"
                }
}
```

 **已完成的失败金丝雀运行** 

```
{
                "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 Streams
  + 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>

以下示例中的步骤将创建一条 EventBridge 规则，该规则会在 `us-east-1` 中名为 `my-canary-name` 的金丝雀完成一次运行或更改状态时发布 Amazon SNS 主题。

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 Resource Name (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)。