Amazon CloudWatch のアラームを Microsoft Teams に投稿してみた

Amazon Lambda の blueprint に「cloudwatch-alarm-to-slack」というのがあったので、
これを少し改良して CloudWatch のアラームを Microsoft Teams に投稿してみました。

こんなイメージです。
![2016-12-15_15h42_11.png](https://qiita-image-store.s3.amazonaws.com/0/134613/2d341626-f368-3787-280b-fcdb01da5332.png)

# SNS のトピックを作成
最初に、SNS のトピックを作成します。
![2016-12-15_11h43_04.png](https://qiita-image-store.s3.amazonaws.com/0/134613/e98ec2c4-b789-8842-8eb9-9f8277178e45.png)

# CloudWatch のアラームを作成
次に、CloudWatch のアラームを作成します。
何でもいいので、今回は EC2 の CPU 使用率のアラームを作成しました。
![2016-12-15_11h56_45.png](https://qiita-image-store.s3.amazonaws.com/0/134613/eaa5d3ad-d969-c94d-6267-86496d4bc340.png)

# Microsoft Teams のコネクタを作成
コネクタを追加するには、チャネル名の横にあるその他のオプションのアイコン … を
クリックしてから [コネクタ] をクリックします。
![2016-12-15_12h34_19.png](https://qiita-image-store.s3.amazonaws.com/0/134613/b7ff145e-dd76-6da0-536f-9dc65952d445.png)

**Incomming Webhook** を追加します。
![2016-12-15_12h43_50.png](https://qiita-image-store.s3.amazonaws.com/0/134613/782a657f-27bd-786c-19ed-b205b6e40dcf.png)

コネクタ名を入力します。
イメージを設定しておくと、メッセージの投稿者がわかりやすくなりますね。
![2016-12-15_12h53_05.png](https://qiita-image-store.s3.amazonaws.com/0/134613/6ed59701-30ca-d613-5c2b-ffc882413d34.png)

「作成」ボタンを押下すると、以下のように **Webhook URL** が表示されるので、コピーしておきます。
![2016-12-15_12h55_06.png](https://qiita-image-store.s3.amazonaws.com/0/134613/d85500f9-8a87-7213-9508-247ac48dffdc.png)

# AWS KMSで Webhook URL を暗号化
Microsoft Teams の Incomming Webhook を作成したときに生成された **Webhook URL** を
**AWS KMS (Key Management Service)** で暗号化します。

## AWS KMS でマスターキーを作成
暗号化するためのマスターキーを作成します。
![2016-12-15_15h51_14.png](https://qiita-image-store.s3.amazonaws.com/0/134613/eec69922-61fe-c048-bb4f-45f7de10193b.png)

エイリアスを入力。
![2016-12-15_15h56_52.png](https://qiita-image-store.s3.amazonaws.com/0/134613/8a60c892-5a60-f1f6-0e4d-fe1d9c8fddcf.png)

作成できました。
![2016-12-15_16h02_04.png](https://qiita-image-store.s3.amazonaws.com/0/134613/a9bf8577-1d2e-8842-b84c-e094f6f1aa44.png)

## AWS CLI で Webhook URL を暗号化
暗号化は、AWS CLI で行います。
インストールしていない場合は、[ここ](https://aws.amazon.com/jp/cli/)から取得できます。

マスターキーの「エイリアス名」を指定して、Webhook URL を暗号化します。

コマンド形式は以下の通り。

```bash
aws kms encrypt --key-id alias/＜作成したエイリアス名＞ --plaintext="＜WebhookURL＞"
```
＜作成したエイリアス名＞と ＜WebhookURL＞ は置き換えてください。
ただし、＜WebhookURL＞ の先頭の **https://** は取り除きます。
そうしないとエラーになります。
私はここでハマりました。

 例）
 
```bash
AWSCLI>aws kms encrypt --key-id alias/WebhookURL-MsTeams
--plaintext="outlook.office365.com/webhook/xxxx/IncomingWebhook/xxxxxx"
{
    "KeyId": "arn:aws:kms:us-east-1:xxxx:key/xxxxxxx",
    "CiphertextBlob": "〇〇〇〇〇〇"
}
```

出力された "CiphertextBlob" の値が「暗号化されたWebhook URL」となりますので、
必ず控えておきましょう。
<u>※ 忘れてしまうと、後で見ることができないので、再度暗号化が必要になります。</u>

# Amazon Lambda の作成
Select blueprint 画面で「cloudwatch-alarm-to-slack-python」を選びます。
![2016-12-15_17h15_22.png](https://qiita-image-store.s3.amazonaws.com/0/134613/c518ad73-0cfd-7679-2c79-4b30e78962a6.png)

トリガーは SNS で、トピックは最初に作成したものを選択します。
![2016-12-15_17h18_38.png](https://qiita-image-store.s3.amazonaws.com/0/134613/88b2712b-0c2c-ec75-cd47-a34653473092.png)

コードを編集します。
slack channel は不要なので、以下の選択した行は削除します。
![2016-12-15_17h35_55.png](https://qiita-image-store.s3.amazonaws.com/0/134613/3b6dce61-ff78-4e5d-8174-1e07558a0354.png)

後は、slack へのメッセージと Microsoft Teams へのメッセージはフォーマットが違うので、
その部分も変更します。

変更前

```py
    slack_message = {
        'channel': SLACK_CHANNEL,
        'text': "%s state is now %s: %s" % (alarm_name, new_state, reason)
    }

    req = Request(HOOK_URL, json.dumps(slack_message))
```

変更後

```py
    notification_message = {
        'title': "CloudWatchからのお知らせ",
        'text': "%s state is now %s: %s" % (alarm_name, new_state, reason)
    }

    req = Request(HOOK_URL, json.dumps(notification_message))
```

Lambda Function の完成
![2016-12-15_17h40_08.png](https://qiita-image-store.s3.amazonaws.com/0/134613/34155c09-2576-a305-d6db-97ad39301439.png)

トリガーを有効にします。
![2016-12-15_18h09_36.png](https://qiita-image-store.s3.amazonaws.com/0/134613/b9c4cfbd-0a1c-bcac-e098-0bba63241ee8.png)

# 確認してみる
どうやったら確認できるのか悩んだのですが、Amazon CloudWatch のドキュメントに載ってました。

AWS CLI でアラームの状態を **ALARM** に変更してしまいます。

```bash
AWSCLI>aws cloudwatch set-alarm-state --alarm-name Jenkins_CPU-70% --state-reason "test" --state-value ALARM
```

ちゃんと投稿されました。
![2016-12-15_19h06_26.png](https://qiita-image-store.s3.amazonaws.com/0/134613/f83b6b9e-7052-75c7-2748-c9dffd24d24d.png)

# まとめ
今回は blueprint を少しだけいじっただけで、Microsoft Teams へ投稿することができました。
簡単に実現できるので、色々なことに使っていけるんじゃなかと思いました。

slack や Microsoft Teams などに情報を集約すると、とても便利ですよね。