Lambdaの「Blueprint」で簡単にSlackとCloudWatchを連携してみた(2017年版)

AmazonLambda

まいど、大阪の市田です。
CloudWatchのアラームをSlackに通知するという構成は、最近ではよくある話でその方法もたくさんあります。
今回は、ゼロからLambda関数を作るのではなく、事前に用意されている「Blueprint」を使います。

このBlueprintは昨年から公開されていますが、Blueprintの内容は随時アップデートされており、現在はKMSを使って、SlackにPOSTするURLを暗号化しています。
その設定もマネジメントコンソール上で簡単にできるようになっていたので、最新内容を踏まえてご紹介したいと思います。

概要

今回利用するBlueprintは「Cloudwatch-alarm-to-slack」 です。
構成は下記の通りで、「CloudWatchのアラームをAmazon SNSに送り、Lambdaを起動する」という形になります。

構成図

作業手順

大まかな作業手順です。

  • SlackのWebhookの準備
  • KMSの準備(暗号化キーの作成)
  • Lambda Functionの作成
    • IAM RoleのPolicy追加
    • Webhook URLの暗号化
    • Webhook URLの復号化設定(IAM Role)
  • CloudWatchアラームの作成
  • 動作確認

やってみる

それでは実際の内容を見ていきたいと思います。

SlackのWebhookの準備

まず、Slackのアカウントがなければ作成して下さい。作成できたらhttps://[team名].slack.com/services/newにアクセスします。
ページ上部にある検索窓に「Incoming WebHooks」と入力して検索すると、検索窓の下に候補が出てくるのでこれをクリックして下さい。

次の画面で「Add Configuration」をクリックします。

02-addconfig

通知をPOSTしたいChannelを指定します。既存のものから選択するか新規に作成して下さい。今回は「#cloudwatch」というChannelにしました。
Channleの指定ができれば、緑色の「Add incoming WebHooks integration」をクリックします。

03-posttochannel

最後のページで「Webhook URL」が表示されるので、コピーして控えておきましょう。Lambda Functionの作成時に必要になります。

04-webhookurl

後は好みでアイコンなどを設定して「Save Settings」をクリックして保存します。

05-customizeicon

KMSの準備(暗号化キーの作成)

次にWebhook URLを暗号化するキーを作成します。環境に合わせて対象のリージョンを選択して、キーを作成して下さい。
後は全てデフォルトで作成しました。

06-createkey

Lambda Functionの作成

ようやくLambda Functionの作成です。Blueprintの選択時に「slack」で検索すると「Cloudwatch-alarm-to-slack」が3種類出てきます。
利用言語が異なるだけなので使いやすいものを選択して下さい。今回はPython2.7のものを選択しました。

07-selectblueprint

SNSとの連携になるので対象となる「SNS Topic」を選択して下さい。「Enable trigger」にチェックを入れて「Next」をクリックします。

08-config-triggers

Lambda関数のコード自体はBlueprintで用意されているので、コードの部分はそのままにしておきます。作業が必要になるのは環境変数の設定です。

09-environmentvariables

Blueprintで用意されているコードでは「通知をPOSTするSlackのチャンネル名」と「Webhook URL」を環境変数としています。
この内、「Webhook URL」を暗号化するので、まず「Enable encryption helpers」 にチェックを入れます。

次に暗号化に使う暗号化キー(Encryption key)を選択します。これは先程作成した暗号化キーを選択します。

環境変数は次のように設定します。

  • slackChannel:通知をPOSTするSlack Channnel (今回は「#cloudwatch」チャンネルの指定。)
  • kmsEncryptedHookUrl:hooks.stack.com/service/xxxxxxxx
    • 「https://」 のプロトコルの部分を除外したものを指定します。

設定できたら「kmsEncryptedHookUrl」「Encrypt」 ボタンで暗号化します。

10-encrypt

KMSによって「Webhook URL」が暗号化されました。

11-encrypted

次にLambda関数で利用するためのIAM Roleの作成です。今回は新規に作成しました。

12-createrole

Role名は適宜付けて下さい。ポリシーの編集には「Edit」をクリックします。
暗号化した「Webhook URL」を復号化する為に、ARNの指定は先程作成したKMSのものを指定しましょう。

13-role

{
         "Version": "2012-10-17",
         "Statement": [
           {
             "Effect": "Allow",
             "Action": [
               "kms:Decrypt"
             ],
             "Resource": [
               "<your KMS key ARN>"
             ]
           }
         ]
}

レビューで問題なければ「Create function」で作成します。

14-createfunction

動作確認

これで準備ができたので、実際にCloudWatchでアラームを飛ばしてみます。CloudWatchのアラーム通知はLambda関数で指定したSNSトピックに飛ぶようにしましょう。
CPU使用率で監視しているので、閾値を「0以上」等にしてわざとアラーム状態にします。

15-cloudwatch

こんな感じで「#cloudwatch」のChannelにアラームがpostされました。Saas系の連携サービスを使うと通知までに時間がかかる場合がありますが、監視間隔のタイミングで通知されるのは嬉しいですね。

16-slack-alarm

最後に

Lambdaには多くのBlueprintが用意されています。既存のBlueprintもAWSの各種リリースに合わせてアップデートされるので、是非チェックしてみて下さい。

以上です。