Slackにアラート通知（CloudWatch＋SNS＋Lambda＋incoming-webhook）

#### 目的
サーバのアラートをSlackの特定の部屋に投稿したい

#### 使用サービス
- slack
- incoming-webhook(slack apps)
- cloudwatch(aws)
- sns(aws)
- lambda(aws)
- iam(aws)
- ec2(aws)

#### 要件
サンプルとしてCPU使用率が閾値を超えたらSlackの部屋に投稿するという機能を作成する

#### 設定その１：incoming-webhook

"Make a Custom Integration"から"Incoming Webhooks"でWebhooksを作成。外部から Slack へ投稿する手段として"incoming-webhook"を使用。左のメニューから”Apps&Integrations”を選択。ブラウザで”AppDirectory”ページが表示されるので"incoming-webhook"を検索して"Add Configuration"を実行。設定は以下のようにする

---
- Integration Settings
 - Post to Channel：任意のSlackチャンネル
 - Webhook URL：コピーしておく（Lambdaコード内で使用する）
 - Descriptive Label：特になし
 - Customize Name：必ず変える必要はない
 - Customize Icon：必ず変える必要はない
 - Preview Message：必ず変える必要はない

##### 接続テスト
"incoming-webhook"を組み込んだだけでSlackに投稿可能であるか確認する
端末エミュレータから以下接続テストコマンド（curl ~)を実行する

![image](https://qiita-image-store.s3.amazonaws.com/0/57350/2d9a273c-5e78-7742-f09d-c412b4820020.png)

#### 設定その２：SNSのTopic作成
プッシュ通知サービスAmazon Simple Notification Serviceを設定する。CloudWatchでアラート発生したらSNSのTopicに連携されLambdaでコードを実行できるようにする。SNSは細かい設定は必要なくTopicを作成するだけで良い。

---

- ”SNS DashBoard”→"Create Topics"
 - Topic name "EC2_CPU_Util"
 - Display name "EC2_CPU_Util"
上記入力完了したら"Create topic"を押下

![image](https://qiita-image-store.s3.amazonaws.com/0/57350/54842ba7-2845-11d5-a8e7-32b01210222a.png)

- Topic detail: EC2_CPU_Util画面で"Publish to topic"を押下

#### 設定その３：CloudWatchのアラーム作成

"Cloudwatch"→"xxx_dashboard"(なければ作成）→"アラームの作成"→"EC2メトリクス"から任意のインスタンスIDを検索→当該インスタンスの"CPUUtilization (CPUUtilization)"を選択し以下のように入力

- アラームのしきい値
名前:CPU_Utilization
説明:CPU_Utilization
次の時:CPUUtilization (CPUUtilization)
が:>=10
を:1回連続した場合
※アラートを意図的に発報させるため閾値は低く設定しておく。本番の場合は別途考慮する。

- アクション
通知
アラームが次の時:	状態：OK
通知の送信先:	EC2_CPU_Util　※SNSTopic

通知
アラームが次の時:	状態：OK
通知の送信先:	EC2_CPU_Util_Email
メールリスト:hoge@alertmail.jp

通知
アラームが次の時:	状態：警告
通知の送信先:	EC2_CPU_Util　※SNSTopic

通知
アラームが次の時:	状態：警告
通知の送信先:	EC2_CPU_Util_Email
メールリスト:hoge@alertmail.jp

※通知を追加する場合は"+通知"を押下

- アラームのプレビュー

インスタンス ID (Instance­Id): 任意のインスタンスID
インスタンス名:任意のインスタンス名
メトリクス名:CPUUtilization

間隔：5分間
統計:	Standard
平均


![image](https://qiita-image-store.s3.amazonaws.com/0/57350/6cf52a1f-2448-86ef-175f-1fa9ab12ad6b.png)



#### 設定その４：Lambda functionの作成

"Dashboard"→"Create a Lambda function"→"Configure triggers"→□をクリックしSNSを探し選択。SNS topic"EC2_CPU_Util"を選択→"Enable trigger"にチェックを入れ"Next"を押下→"Configure function"で以下のように設定する

![image](https://qiita-image-store.s3.amazonaws.com/0/57350/365abcbd-2f65-d974-1112-ff251c11ea5a.png)

Configure function
- Name: Func_Alert_CPU_Util
- Description: Alert_CPU_Util
- Runtime: Python 2.7
- Handler: lambda_function.lambda_handler

Lambda function code
- Code entry type: Edit code inline

```python
import urllib

def lambda_handler(event, context):
    endpoint = 'https://hooks.slack.com/services/XXXX/XXXX/XXXX'
    parameter = urllib.urlencode({"payload": {"text": "ALERT:CPU Utilization"}})
    function = urllib.urlopen(endpoint, parameter)
    print function.read()
    return
```

Lambda function handler and role
- lambda_function.lambda_handler
- Choose an existing role
- service-role/lambda_exec_role ※IAMで作成してあること

Advanced settings
- Memory (MB): 128
- Timeout 0 min 3 sec

DLQ Resource
- なし

VPC
- No VPC

KMS key
- (default)aws/lambda


"Next" → "Create function"でLambdafunctionの作成完了

"Triggers"→”Test”を実行


![image](https://qiita-image-store.s3.amazonaws.com/0/57350/c1f65153-d36e-7ff6-e789-8218dafeea7d.png)

#### 設定その5：SNSのSubscription作成

- Lambda連携用
Topic ARN:arn:aws:sns:ap-northeast-1:XXX:EC2_CPU_Util ※作成したSNSTopicのARNを入力
Protocol:AWS Lambda
Endpoint:arn:aws:lambdaxxxfunctionname ※上のプロトコルを選ぶと自動入力される
Version or alias:default

- Email連携用
Topic ARN:arn:aws:sns:ap-northeast-1:XXX:EC2_CPU_Util_Email ※作成したSNSTopicのARNを入力
Protocol:Email
Endpoint:通知先メールアドレスを入力
Version or alias:default

上記を入力したら"create subscription"を入力

![image](https://qiita-image-store.s3.amazonaws.com/0/57350/8d3bb13e-990e-6226-0c3c-a686ef7bd671.png)

#### 実行・確認

- 意図的にCPU負荷を上昇させる。※1回で足りなければ並列で実行

```bash
# 負荷開始
$ yes >> /dev/null &
[1] 18593
# 負荷停止
$ kill -9 18593
[1]+  Killed                  yes >> /dev/null
```
- CloudWatchでCPU使用率を確認
閾値を超えていることを確認

- Emailにアラートが届いていることを確認
- Slackの指定したチャンネルにアラートが投稿されていることを確認

![image](https://qiita-image-store.s3.amazonaws.com/0/57350/225ad6ec-b01f-7b2e-3420-fdf1f922f8c3.png)