AWSのSNSでslackにアラーム通知する方法

# はじめに
AWSでアプリケーションを動かすとき、CPUやメモリの使用率が高くなった場合にアラーム通知をしたいというニーズがあると思います。

そこで今回は **CloudWatch Alarm と SNS** を利用して簡易的なアラーム通知を実現しようと思います。また、アラーム通知先をslackの特定のチャンネルにしようと思います。

# 手順
## 1. slackのチャンネルを作成する
アラーム通知先のチャンネルを作成してください。
## 2. slackチャンネルのメアドを取得する
slackチャンネルのメアドを取得します。
このメールアドレスにSNS経由でメールを送信するように設定していきます。
[Slack にメールを送信する](https://slack.com/intl/ja-jp/help/articles/206819278-Slack-%E3%81%AB%E3%83%A1%E3%83%BC%E3%83%AB%E3%82%92%E9%80%81%E4%BF%A1%E3%81%99%E3%82%8B#:~:text=%E3%80%8C%E3%82%A4%E3%83%B3%E3%83%86%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%80%8D%E3%82%BF%E3%83%96%E3%82%92%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E3%81%97,%E3%81%99%E3%82%8B%E3%80%8D%E3%82%92%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E3%81%97%E3%81%BE%E3%81%99%E3%80%82) をご覧いただくと、チャンネルのメールアドレスの取得方法がわかるのでぜひご参照ください。
## 3. AWSのSNSトピックを作成する（SNS > トピック > 「トピックの作成」）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551848/c38da4b3-8c80-0c18-bc8e-8c7ee68b9d5d.png)
    
**タイプ**
今回はslackのチャンネルにEメールを送信するので「スタンダード」に設定します。
    
**名前**
トピックの名前を入力します。AWSコンソール上でトピックを見分けるときに参照します。
    
**表示名**
トピックの表示名を入力します。slackに送られるメールの送信者として表示されます。
（最後にメールの例を紹介するので、そちらもぜひご覧ください）
    
## 4. トピックのサブスクリプションを作成する（トピック > サブスクリプションタブ > 「サブスクリプションの作成」）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551848/141bd68a-2700-9fdb-a0d2-770317f7d4c6.png)
    
**プロトコル**
今回はslackのチャンネルにEメールを送信するので「Eメール」を選択します。
    
**エンドポイント**    
ここにslackのチャンネルのメールアドレスを入れます。
    
## 5. slackチャンネルにサブスクリプションの承認をするためのメールが来るので承認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551848/f7599c01-20ef-1484-90ed-1edb5b3805eb.png)
    
上記のものがslackのチャンネルに飛んでくるので「Confirm subscription」をクリックしてサブスクリプションの承認を完了させます。

## 6. アラームを作成する（CloudWatch > すべてのアラーム > 「アラームの作成」）

今回はCPUとメモリの使用率を監視するため、アラームを2つ作成します。
    
### **ステップ１：メトリクスと条件の指定**
    
**メトリクス**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551848/f4ee02a5-f908-a4c0-f560-c03cab53c9e6.png)
    
ここでは監視対象のメトリクスを選択します。
CPUを監視するメトリクスの場合は**CPUUtilization**を、
メモリを監視するメトリクスの場合は**MemoryUtilization**を選択してください。
    
**条件**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551848/9f411191-2988-4460-bc0d-cc925477c2d1.png)

各々のプロジェクトのしきい値条件を指定してください。

### **ステップ2：アクションの設定**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551848/b7d75b98-91f5-edf4-b6cc-9565ca99f6df.png)
    
**アラーム状態トリガー**
今回はステップ１で設定したしきい値を超えたときに通知したいので「アラーム状態」を選択します。
    
**次の SNS トピックに通知を送信**    
手順3でトピックはすでに作成してあるので、「既存の SNS トピックを選択」にチェックを入れます。
    
**通知の送信先**
手順3で作成したトピックを選択してください
    
### **ステップ3：名前と説明を追加**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551848/eae24fe0-089f-ac20-796a-6d5c90ab2fe7.png)

**アラーム名**
アラームの名前を入力します。slackに送られるメールの件名に表示されたり、メール本文にも表示されます。（最後にメールの例を紹介するので、そちらもぜひご覧ください）
    
**アラームの説明**
アラームの説明を入力します。slackに送られるメールの本文に表示されます。（最後にメールの例を紹介するので、そちらもぜひご覧ください）
    
ここに「CPUの使用率が高くなっています」などを入れるとslackにメール通知がきたときわかりやすいと思います。

    
### 7. アラーム通知確認テスト
アラームのしきい値を変更してアラーム通知のテストを行い、実際にslackに通知がくるか確かめてみましょう。
※アラーム通知はしきい値を跨いだときにしかこないのでご注意ください。

以下は送信されるメールの例です。
```
    送信者：【トピックの表示名】
    宛先： Email
    件名：	ALARM: "【アラーム名】" in Asia Pacific (Tokyo)
    日付	【アラート発生日付】
    
-------------------------------------------------------------------------------
    
    You are receiving this email because your Amazon CloudWatch Alarm "【アラーム名】" in the Asia Pacific (Tokyo) region has entered the ALARM state, because "【アラート詳細（しきい値をいつ越えたか等）】" at "【アラート発生日時】".
    
    View this alarm in the AWS Management Console:
    【AWSコンソール上でのアラームのURL】
    
    Alarm Details:
    - Name: 【アラーム名】
    - Description: 【アラームの説明】
    - State Change: OK -> ALARM
    - Reason for State Change: 【アラート詳細（しきい値をいつ越えたか等）】
    - Timestamp: 【アラート発生日時】
    - AWS Account: 【アラーム作成者のAWSアカウントID】
    - Alarm Arn: 【アラームのARN】
    
    Threshold:
    - 【アラート詳細（しきい値をいつ越えたか等）】
    
    Monitored Metric:
    - MetricNamespace: 【メトリクスのソース】
    - MetricName: 【メトリクス名】
    - Dimensions: 【監視対象のコンテナ】
    - Period: 【アラームで設定した期間】
    - Statistic: 【アラームで設定した統計の種類】
    - Unit: 【メトリクスの単位】
    - TreatMissingData: 【アラームの「その他の設定」で設定する欠落データの処理方法（今回はデフォルト設定のままにしています）】
    
    State Change Actions:
    - OK:
    - ALARM: 【トピックのARN】
    - INSUFFICIENT_DATA:
```