AWSのイベントをslackに通知する

## はじめに
AWSでなにか起きたら、できるだけ早く気づきたいですよね。
ということで今回はタイトルの通り、AWSのイベントをSlackに通知する方法をご紹介していきます。
`Amazon SNS`と`AWS Chatbot`というサービスを利用すると、いとも簡単にSlack通知を実装することができるんです。
本記事では、Slack通知の概要をざっと説明した後に、「CloudWatchのアラームが発生したらSlackに通知がいく」というような実装をしていきます。
※ 今回はCloudWatchのアラーム通知ですが、他のサービスの通知にも参考になるかと思います。

**目次**

- [Slack通知の概要](#slack通知の概要)
- [通知サービスの設定](#通知サービスの設定)
- [CloudWatchのアラーム通知設定](#cloudwatchのアラーム通知設定)



## Slack通知の概要
冒頭でも記載しましたが、通知には`Amazon SNS`（Simple Notification Service、以下SNSと記載）と`AWS Chatbot`（以下Chatbotと記載）というサービスを利用します。

それぞれざっくり以下のようなサービスです。

|サービス名|説明|
|:--|:--|
|SNS|メッセージを受信&送信してくれる橋渡し的存在。<br>具体的には<b>AWSサービスからメッセージを受け取り</b>、他のAWSサービスやメール, SMS等に<b>メッセージやイベントを受け渡すサービス。</b>|
|Chatbot|AWSのイベント情報をSlackに通知するサービス。<br>具体的には、まずSNSから通知イベントを受け取り、各種AWSサービスからアラームの内容を取得する。そして<b>アラームの内容をSlack</b>またはAmazon Chime<b>に対してメッセージを送信するサービス。</b>|

今回は以下のような流れで通知が行われます（以下の図参照）。
CloudWatchでアラームが発生すると、まずはSNSに通知がいきます。その通知がきたということをSNSはChatbotに送ります。そして最後にChatbotはCloudWatchから情報を取得し、その情報をSlackに送ります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/799854/ea35d872-69f6-66d2-c32c-7fdb71e734f0.jpeg" width="60%">

※ AWSのサービスとしてCloudWatchを例として挙げていますが、他のサービスもほぼ同じ流れです。



## 通知サービスの設定
ここでは以下の3つのことをしていきます。

- Slackチャンネルの作成
- SNSの設定
- Chatbotの設定

#### Slackのチャンネル作成
まずは通知を受信するためのチャンネルを作りましょう。
本記事では`test`というチャンネルを作成しました。

**【補足】** Slackチャンネルについて
>異なるイベントを同じチャンネルに通知することも可能です。
例えば、CloudWatchのアラームとCodePipelineの通知を一緒のチャンネルに通知させることができます。どの範囲の通知を受け取るかでチャンネル名を決めるのが良いかもしれません。

#### SNSの設定
[Slack通知の概要](#slack通知の概要)でも説明しましたが、SNSはメッセージを受け取り、それを各受信者に送信するサービスです。
SNSではメッセージを受信または、送信するポイントをトピックと呼びます。

- まずはSNSトピックを作成していきます。<br>
今回は以下のような設定で進めます。画像外の部分はデフォルトの設定で進めていきます。

![SNSトピック作成中身.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/799854/c4575f75-62dc-8b5c-1cdf-07450b7caf8b.jpeg)

**【補足】** トピックの種類について
>|サービス名|説明|
|:--|:--|
|FIFO|受信したメッセージの順序付けが厳密に行われる。Amazon SQS（Simple Queue Service）と組み合わせて使用する|
|スタンダード|FIFOほど厳密なメッセージに順序付けはされない。様々な送信先を選択することができる|


- 次に作成したトピックが受け取ったメッセージを、どこに配信するのかという設定をしていきます。<br>
この設定をサブスクリプションと呼びます。
今回の配信先はChatbotになります。配信先がChatbotの場合はChatbot側でサブスクリプションを設定するため、SNSの画面上では設定しません。
そのため、一旦Chatbotの設定をしていきます。

#### Chatbotの設定
- Chatbotのトップ画面からメッセージを送る先を設定していきます。<br>
チャットクライアントをSlackに設定して、送信先のSlackを設定していきます（今回はtestという名前のワークスペースを用いています）。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/799854/80da34f0-09c8-6d4b-9b39-20a301da3c8a.jpeg" width="30%">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/799854/58d30696-124d-9134-10d4-d49933caed78.jpeg" width="50%">

連携が完了すると、Chatbotの画面に連携したSlackのワークスペースが表示されます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/799854/2ef75cd1-6868-cf47-051c-a929478e66de.jpeg" width="30%">

ワークスペースの部分をクリックすると、チャンネルの設定をすることができます。
![Chatbot チャンネルの指定.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/799854/3ed7f9c6-3574-09aa-df3e-50a9fb715c74.jpeg)

それではワークスペース内のチャンネルについて設定していきます。
ここでは、設定するのは以下の3つです。

1. どのSlackチャンネルに通知するか
2. Slackのユーザーにどのようなアクセス制限を設けるか
3. どのSNSトピックからメッセージを受け取るか

順番に画面を見ていきます。

1. どのSlackチャンネルに通知するか
今回は先ほど作成した`test`というパブリックなチャンネルを指定しました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/799854/1c26fbce-6381-9b86-8acb-73df4db9c185.jpeg" width="70%">

2. Slackのユーザーにどのようなアクセス制限を設けるか
今回は画像のような設定を組んでいます。
Channelガードレール（Slackのチャンネルメンバーに与えられる権限）はあまり権限を与えたくなかったので、とりあえず`AmazonSNSReadOnlyAccess`を設定しました（とりあえず感がすごいですが。。。）

今回は、チャンネルIAMロールを設定します。ロール名は`test-alarm-role`としました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/799854/1a0f663e-253c-a6f1-a5d6-3c8a70aeef29.jpeg" width="70%">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/799854/aefbf7ca-951b-aa48-473e-115930d258b3.jpeg" width="70%">

これでChatbotの設定は以上になります。

## CloudWatchのアラーム通知設定
※ここでは、アラームの詳細な設定方法の説明はしません。あくまで通知の設定のみ説明します。

- それではCloudWatchの通知を設定していきます<br>
すでにアラームを作成している場合は編集ボタンから、そうでない場合はアラームの作成ボタンを押します。
通知の設定をする箇所で、先ほど作成したSNSトピックを選択します（今回は`test-topic`）。

![Cloudwatch 通知設定.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/799854/f0a1d0e1-e355-45c1-6f28-b5b7c5444bbc.jpeg)

選択し終わったら通知の設定は完了です。
アラームの設定自体を完了させてください。

- 最後に動作確認をしてみましょう<br>
今回はEC2インスタンスのメモリ使用率が80%以上だとアラームが出るように設定したので、メモリに負荷をかけてアラームを出していきます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/799854/e0047542-e3a3-838a-78c1-55dee146dd4f.jpeg" width="70%">

しばらくすると、Slackに通知がきました。
これで問題なく設定できたことがわかりました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/799854/b7691835-8b5f-1074-572b-99783ea93f56.jpeg" width="70%">

これで以上となります。
最後まで読んでいただきありがとうございました。

## 参考文献
- [Amazon SNS(公式)](https://docs.aws.amazon.com/ja_jp/sns/latest/dg/welcome.html)
- [AWS Chatbot（公式）](https://docs.aws.amazon.com/chatbot/latest/adminguide/what-is.html)