ServerlessでCloudWatchのSlackアラームボットを簡単に構築

こんにちは。
この記事は [Qiita Advent Calendar Serverless(2)](http://qiita.com/advent-calendar/2016/serverless2) の **13日目**の記事、
[Fusic Advent Calendar 2016](http://qiita.com/advent-calendar/2016/fusic)の **25日目**の記事です。

先月頃から**"サーバーがない(Serveless)アーキテクチャ"** に興味深くなってちょこちょこ触って見ています。 早くこのアーキテクチァーになれるため、構築したプロジェクトのアーキテクチァーを変更してみたりしています。 

まだものすごく足りない**初心者**ですが、必ずベテランになりたい種目の一つです。 物理サーバをバットで壊して**Tim Wagner**のパフォーマンスのように私もいつか・・・w
![image](https://qiita-image-store.s3.amazonaws.com/0/108364/8e70b91e-445f-6803-9ec3-7c8468a02019.png)

この記事には、大きく二つのテーマに分けています。
######**・近かごろやっと理解できたServerless Architectureを話す**
######**・ServerlessでCloudWatchのSlackアラームボットを簡単に構築**

##目次
######近かごろやっと理解できたServerless Architectureを軽く話す
① Serverless は No Server ではない
② なぜ Serverless？

######ServerlessでCloudWatchのSlackアラームボットを簡単に構築
① 構成
② SNSトピック生成
③ CloudWatchアラーム生成
④ SlackのAPI、「Incoming WebHooks」 を生成
⑤ IAMのKMSで暗号化き−を生成
⑥ 「Webhook URL」の暗号化
⑦ Lambda関数生成
⑧ ⑦で新たに生成した「role」に「ロールポリシー」を作成する
⑨結果確認
⑩ Serverless Frameworkでやって見たかった(が...)

##近かごろやっと理解できたServerless Architectureを軽く話す
① **Serverless は No Server ではない**
もちろん、サーバレス(Serverless)という言葉自体がサーバがいらないという意味ではありません。
クラウドにもサーバは存在してあり、ただし利用者が管理するサーバやコンテナがゼロになります。
サーバリースとは、イベントによって動作するクラウド基盤の小さなサービス単位のプログラムコードだけを開発し、
配布に集中するのを意味しています。

② **なぜ Serverless？**
**理由は簡単にもっと早く取り掛かるためです。**
このような特徴はインフラ`構築`、`運用`、`拡張`、`配布`などの辛い業務を減らし、
敏捷に作って配布しようとする案件に適合します。

ま、やっぱり[ドキュメント](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-introduction-function.html)の方を読んだ方がしっかりですね。

##ServerlessでCloudWatchのSlackアラームボットを簡単に構築
で、軽く何を作って見ようか−とすると、パット！と思い出したのが
**現在メールに通報されているCludeWatchの警告をSlackに送信したい！**でした。

① 構成
![image](https://qiita-image-store.s3.amazonaws.com/0/108364/7e5e38bb-0c7e-5d93-43f5-207f56a9aa22.png)


② SNSトピック生成
SNSコンソルで新しいTopicを生成します。
![image](https://qiita-image-store.s3.amazonaws.com/0/108364/eeabef16-129b-c763-881b-fd63b2408baf.png)
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
![image](https://qiita-image-store.s3.amazonaws.com/0/108364/e42f6fa6-bc05-f4ea-14f0-39530636e775.png)
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ


③ CloudWatchアラーム生成
CloudWatchコンソルで新しいアラームを生成します。
![image](https://qiita-image-store.s3.amazonaws.com/0/108364/1d190f81-68a0-a225-c0ed-1fefa92e5ccf.png)
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
※CPU使用率の警告の対処になるインスタンスIDを選択
※CPUUtilization (CPUUtilization) メトリクスを選択
![image](https://qiita-image-store.s3.amazonaws.com/0/108364/094497bb-198d-c1d7-b383-35af8a9a4a8f.png)
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
![image](https://qiita-image-store.s3.amazonaws.com/0/108364/6b377997-a36b-acce-7390-bc0d3c0e0f67.png)
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ


④ SlackのAPI、「Incoming WebHooks」 を生成
![image](https://qiita-image-store.s3.amazonaws.com/0/108364/43b1b923-561c-7a1e-45e3-8847337b44d6.png)
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
![image](https://qiita-image-store.s3.amazonaws.com/0/108364/f2f6465e-c0f5-0e57-a4b4-7cb1ccad6c35.png)
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
※以後、暗号化して、Lambdaのコードに反映する必要がまるのでノート必要
![image](https://qiita-image-store.s3.amazonaws.com/0/108364/f5bbb9d5-da17-fdca-dabe-1fb1f4a4e894.png)
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
⑤ IAMのKMSで暗号化き−を生成
「Webhook URL」を暗号化する、IAMのKMSで暗号化き−を生成します。
※暗号化き−のリージョンと次に暗号化するときのaws_cliのリージョンが統一しないといけない
![image](https://qiita-image-store.s3.amazonaws.com/0/108364/47de4b7f-c626-6543-9220-b3b3f7fd7c77.png)
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
![image](https://qiita-image-store.s3.amazonaws.com/0/108364/1cf563de-d1e0-7e39-a72d-567217624124.png)
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

⑥ 「Webhook URL」の暗号化
※awsコマンドをインストール及び設定が必要 (以下の記事をご参考)
http://qiita.com/yukofeb/items/178277d9528fd22a3d78

```sh
$ aws kms encrypt --key-id alias/encryption_key_wu --plaintext "hooks.slack.com/services/******/*******/*****"
```
※以後、暗号化の結果も必要なので、手元にノート必要
![image](https://qiita-image-store.s3.amazonaws.com/0/108364/e4423ba9-7f08-67ac-e7c8-20c69a2cc57a.png)


⑦ Lambda関数生成
Lambdaコンソルで新しい関数を生成します。
![image](https://qiita-image-store.s3.amazonaws.com/0/108364/ccc92db2-b4d3-ee1b-e008-60beb9375adf.png)
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
※cloudwatch-alarm-to-slackというblueprintを使って動作に必要な実装は完了
![image](https://qiita-image-store.s3.amazonaws.com/0/108364/e0b604f2-6d2a-1a65-65cc-2c6b21da0bc5.png)
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
![image](https://qiita-image-store.s3.amazonaws.com/0/108364/72fb375a-60a1-7748-7c4f-7a07eca7a67b.png)
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
![image](https://qiita-image-store.s3.amazonaws.com/0/108364/9fc484cf-c619-2e64-e729-6c56ef9a48d9.png)
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
※`process.env` の要素はEnvironment variablesにもうキーがセットされている
※アラームが届くチャネル名と⑥で暗号化した「CiphertextBlob」の値を入力する
![image](https://qiita-image-store.s3.amazonaws.com/0/108364/4c4ca3b1-5027-a937-f7a2-ba65ed469e2f.png)
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
※ロールを新たに生成する
![image](https://qiita-image-store.s3.amazonaws.com/0/108364/d988f551-241f-fe3c-46e1-d13c1e50f972.png)
![image](https://qiita-image-store.s3.amazonaws.com/0/108364/9bb90d3c-f9c9-9f71-9fd9-6b3aaaada7df.png)
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
※最初は「Disable」の状態になっているので、「Enable」に変更
![image](https://qiita-image-store.s3.amazonaws.com/0/108364/1b8ed325-8c99-9eed-94d9-f09a2642d1b4.png)
※「Enable」に変更するとsubscriptionが上手く生成される
![image](https://qiita-image-store.s3.amazonaws.com/0/108364/784a9ec8-ebae-5e45-c141-8e93d4242cc4.png)
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ


⑧ ⑦で新たに生成した「role」に「ロールポリシー」を作成する
IAMコンソルで「role」に「ロールポリシー」を作成します。
![image](https://qiita-image-store.s3.amazonaws.com/0/108364/55f7efd0-af95-ab64-3076-07348c206bb3.png)
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
※ ポリシードキュメントはLambdaのコードにコメントアウトされて要るのでそのままコピーペースト
※ Resourceに⑥で暗号化して取った「KeyId」を入れる。
![image](https://qiita-image-store.s3.amazonaws.com/0/108364/01462ee2-0272-b20e-79c4-dd6d92a6c669.png)
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ


⑨結果確認
・CloudWatchのアラーム
![image](https://qiita-image-store.s3.amazonaws.com/0/108364/537d7dd4-5a8a-f1c1-f6b0-989f755a2044.png)
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
・Slackアラーム確認
![image](https://qiita-image-store.s3.amazonaws.com/0/108364/a9ddadf8-9cac-ae0a-b492-c45a32dd7afc.png)


⑩ Serverless Frameworkでやって見たかった(が...)
・以下のようにFunction Codeのサイズ制限などの色々の問題が発生され、Serverless Frameworkでは結局、上手く動かないでした。
`The deployment package of your Lambda function "aws-nodejs-dev-cwslackbot" is too large to enable inline`
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/limits.html
原因をしっかり把握して、早めにこの記事をアップデートさせて頂きます。

以上、ありがとうございました。