MackerelのアラートをAWS Event Bridgeに通知してみる

# はじめに
AWSのEventBridgeで、外部Saasからの通知を受け取れると記載があったので、試してみました。
Meckerel初めて使うので、お作法は良く分かっていません。。。

# 事前準備
## EC2インスタンスをMackerelの監視対象に
* EC2インスタンスを適当な設定で構築
    * OSはAmazonLinux 2  
    * Public IPを振る（NAT Gateway等があれば不要）
* EC2にログインし、Mackerelエージェントをインストール、APIKEYも設定しておく

```bash
curl -fsSL https://mackerel.io/file/script/amznlinux/setup-all-yum-v2.sh | MACKEREL_APIKEY='AABBCCDD' sh
※APIKEYはお使いの環境によって異なるので注意

*************************************
     Done! Welcome to Mackerel!
*************************************
※上記が表示されたらOK
```
* MackerelのUIで監視対象になっているか確認
![mc-mon-01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428042/1196786b-a64d-ba1f-92e0-878231594b5f.png)

# MackerelとEventBridgeの連携
Mackerelの公式の手順に沿って設定すれば問題ありません。一応、実施した内容を記載していきます。
[Amazon EventBridgeにアラートを通知する](https://mackerel.io/ja/docs/entry/howto/alerts/eventbridge)
## 通知Channelの作成
MackerelのChannelメニューから、EventBridgeを選択して追加します。
イベント名は任意でOKです。（AWSコンソール側で表示される名前になります。）
![mc-mon-02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428042/b79d44e7-b459-0220-607b-d90bb5a38a90.png)
## 監視対象の追加
続いて、Monitorsメニューから、`ホスト死活監視`を追加。
細かい設定は分からなかったので、全てデフォルトのままです。
![mc-mon-03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428042/8d5ef781-6e85-fee9-701e-21dd5b74903b.png)
## AWSコンソールで連携設定をする
AWSコンソールのEventBridgeの画面を開くと、先ほど追加したイベントソースが表示されています。`イベントバスと関連付ける`を実施してください。
関連付けを行うと、ステータスが`アクティブ`に変更されます。
![mc-mon-04.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428042/5abf4f61-9207-4701-9418-e8dd4af10067.png)
## アラート通知時に起動されるLambdaを作成
今回はテスト用なので、単純にログ出力するだけのLambda Function`EventBridgeConsoleLog`を定義しました。

```python:lambda_function
import json

def lambda_handler(event, context):
    print('A alarm was notified  from Mackerel service.')
    print(event)
    return 'OK'
```

## Event Bridgeにルールを作成
EventBridgeに新規でルールを作成し、上記で作成したLambda Functionをターゲットに設定します。詳細はキャプチャを参照してください。
`ルール MackerelMonitoringRule を作成しました`と表示されれば完了です。
![mc-mon-05.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428042/2ca8c0d9-7f74-a550-9801-78df51b95031.png)
![mc-mon-06.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428042/f0dd9338-7a04-d9ce-3b30-a0ffbe1bfd26.png)
![mc-mon-07.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428042/daf857da-2f56-7006-c3b3-27e849b25318.png)

## アラート通知→EventBridge→Lambda起動
では、実際にアラートを発生させてみます。
一番最初に構築したEC2インスタンスを、AWSコンソールからStopさせます。

しばらく放置すると、Mackerel側でアラートが発生しました。
![mc-mon-08.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428042/222e4752-bec1-cfcc-4d89-e32879babe0b.png)

CloudWatchで作成したルール`MackerelMonitoringRule`が呼ばれているか確認します。
![mc-mon-09.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428042/39c8c8aa-bb0f-97ec-e5aa-c631f80b610a.png)

最後に、CloudWatch LogsでLambdaのログを確認します。
`print(event)`で出力したイベント情報が確認できればOKです。
この情報を元に、EC2の再起動や入れ替えなどを自動化できそうですね。

```json
{
    "version": "0",
    "id": "ee6c34a9-ed85-e47d-e510-a355e2d9160f",
    "detail-type": "alert",
    "source": "aws.partner/mackerel.io/ys-dev-web/MackerelMonitoring",
    "account": "xxxxxxxx",
    "time": "2020-02-10T13:05:04Z",
    "region": "us-west-2",
    "resources": [],
    "detail": {
        "orgName": "ys-dev-web",
        "alert": {
            "createdAt": 1581339903296,
            "isOpen": "True",
            "monitorName": "connectivity",
            "trigger": "monitor",
            "closedAt": "None",
            "url": "https://mackerel.io/orgs/ys-dev-web/alerts/xxxxxxx",
            "openedAt": 1581339903,
            "status": "critical"
        },
        "host": {
            "name": "ip-10-0-0-102.us-west-2.compute.internal",
            "memo": "",
            "isRetired": "False",
            "id": "xxxxxx",
            "url": "https://mackerel.io/orgs/ys-dev-web/hosts/xxxxxxx",
            "status": "working",
            "roles": []
        },
        "event": "alert",
        "user": "None"
    }
}
```


# 最後に
Mackerel自体が良く分かっていないので、手順飛んでいたらすみません。。
ただ、慣れてきたらSaas監視ツールとの連携が便利になるのは間違いなさそうです。

次回は、自作のアプリケーションからカスタムイベントを登録してみたいと思います！