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

  • 6
    いいね
  • 0
    コメント

こんにちは。
この記事は Qiita Advent Calendar Serverless(2)13日目の記事、
Fusic Advent Calendar 201625日目の記事です。

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

まだものすごく足りない初心者ですが、必ずベテランになりたい種目の一つです。 物理サーバをバットで壊してTim Wagnerのパフォーマンスのように私もいつか・・・w
image

この記事には、大きく二つのテーマに分けています。

・近かごろやっと理解できた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?
理由は簡単にもっと早く取り掛かるためです。
このような特徴はインフラ構築運用拡張配布などの辛い業務を減らし、
敏捷に作って配布しようとする案件に適合します。

ま、やっぱりドキュメントの方を読んだ方がしっかりですね。

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

で、軽く何を作って見ようか−とすると、パット!と思い出したのが
現在メールに通報されているCludeWatchの警告をSlackに送信したい!でした。

① 構成
image

② SNSトピック生成
SNSコンソルで新しいTopicを生成します。
image
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
image
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

③ CloudWatchアラーム生成
CloudWatchコンソルで新しいアラームを生成します。
image
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
※CPU使用率の警告の対処になるインスタンスIDを選択
※CPUUtilization (CPUUtilization) メトリクスを選択
image
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
image
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

④ SlackのAPI、「Incoming WebHooks」 を生成
image
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
image
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
※以後、暗号化して、Lambdaのコードに反映する必要がまるのでノート必要
image
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
⑤ IAMのKMSで暗号化き−を生成
「Webhook URL」を暗号化する、IAMのKMSで暗号化き−を生成します。
※暗号化き−のリージョンと次に暗号化するときのaws_cliのリージョンが統一しないといけない
image
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
image
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

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

$ aws kms encrypt --key-id alias/encryption_key_wu --plaintext "hooks.slack.com/services/******/*******/*****"

※以後、暗号化の結果も必要なので、手元にノート必要
image

⑦ Lambda関数生成
Lambdaコンソルで新しい関数を生成します。
image
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
※cloudwatch-alarm-to-slackというblueprintを使って動作に必要な実装は完了
image
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
image
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
image
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
process.env の要素はEnvironment variablesにもうキーがセットされている
※アラームが届くチャネル名と⑥で暗号化した「CiphertextBlob」の値を入力する
image
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
※ロールを新たに生成する
image
image
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
※最初は「Disable」の状態になっているので、「Enable」に変更
image
※「Enable」に変更するとsubscriptionが上手く生成される
image
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

⑧ ⑦で新たに生成した「role」に「ロールポリシー」を作成する
IAMコンソルで「role」に「ロールポリシー」を作成します。
image
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
※ ポリシードキュメントはLambdaのコードにコメントアウトされて要るのでそのままコピーペースト
※ Resourceに⑥で暗号化して取った「KeyId」を入れる。
image
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

⑨結果確認
・CloudWatchのアラーム
image
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
・Slackアラーム確認
image

⑩ 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
原因をしっかり把握して、早めにこの記事をアップデートさせて頂きます。

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

この投稿は Serverless(2) Advent Calendar 201613日目の記事です。