CloudWatchの通知を簡単にSlack,Spark,SMSに送る方法

こんにちは。大阪の市田です。
今回は、CloudWatchのアラーム通知をSlack等に簡単に送る方法をご紹介したいと思います。

背景

CloudWatchでアラーム通知を行う場合、「Amazon SNSでメール送信」という形での利用が結構多いのかなと思います。最近だと、SNSからLambda経由でSlackにPostする、という形も見られるようになりました。

しかし、通知先に応じてLambda関数を作成する必要があるので、もっと簡単にする為に「IFTTT」を使って色んなサービスに通知を送ってみます。

概要

今回は、IFTTT Maker channelの「web request」機能を使います。これは、IFTTTでWebhookが利用できるものです。Webhookを利用してLambdaからSlackなどのサービスと連携させてみます。

手順の項目

  • IFTTTのアカウントの作成
  • Slack,Sparkのアカウントの作成
  • IFTTT連携のLambda関数の作成
  • IFTTT Maker Channelの設定
  • 動作確認

手順

それではやってみたいと思います。

IFTTTアカウントの作成

まずはIFTTTのアカウントを作ります。すでにお持ちの場合はスキップして下さい。
IFTTTのサイトにアクセスして 「Sign up」 をクリックします。

Learn how IFTTT works - IFTTT

01-iftttsignup

メールアドレス、パスワードを入力して「Sign up」をクリックします。

02-signup

Maker Channelとの接続

まずはMaker channnelと接続します。画面上部の「Search」をクリックします。

03-ifttt-search

「maker」で検索して、Makerをクリックします。

04-ifttt-maker

「Connect」をクリックします。

05-iffft-maker-connect

Maker SecretKeyの確認

Webリクエストを投げる為にキー情報が必要になるので、これを確認します。
先程の画面で「Settings」をクリックします。

06-ifttt-settings

Account Infoに記載のURLにある/use/以下のランダムな文字列がキー情報になります。このURLにアクセスすると詳細情報を確認出来ます。

07-iftttmakerconnection

Amazon SNSの準備

既存のものを利用される場合はスキップして下さい。今回は下記のように「cloudwatch-ifttt」というtopicを新規作成しました。

09-createsnstopic

Lambda関数の設定

次にLambdaの設定を行います。トリガーとなるSNSは先程作成したトピックを指定します。

10-lambdatrigger

Lambda関数の設定は、それぞれ下記のように設定しました。

  • 名前:cloudwatch-2-ifttt
  • 説明:cloudwatch-2-ifttt
  • ランタイム:Node.js 4.3

コードは下記の 「CloudWatchAlarm2IFTTT」 というものを使いたいと思います。下記ページにも記載がありますが、サンプルとしてのLambda関数なのでご利用は自己責任でお願い致します。

GitHub - danilop/CloudWatchAlarm2IFTTT: A sample AWS Lambda function to push Amazon CloudWatch alarms to IFTTT via the Maker channel

変数の「iftttMakerEventName」 はIFTTTで指定するイベント名になります。適当なものをつけて下さい。デフォルトのままでも構いません。もう一つの変数「iftttMakerSecretKey」 は先程確認したMaker SecretKeyの値を入力します。

11-lambdafunction

スクリプトは下記になります。

console.log('Loading function');

var https = require('https');
var querystring = require("querystring");

// IFTTT Maker Configuration, see https://ifttt.com/maker for more info
var iftttMakerEventName = 'cloudwatch_alarm' // You can use a different IFTTT Maker EventName here
var iftttMakerSecretKey = '<YOUR IFTTT MAKER SECRET KEY>';

var iftttMakerUrl =
    'https://maker.ifttt.com/trigger/'
    + iftttMakerEventName
    + '/with/key/'
    + iftttMakerSecretKey;

exports.handler = function(event, context) {
    var messageText = event.Records[0].Sns.Message;
    console.log('From SNS:', messageText);

    var message = JSON.parse(messageText);

    // The output to send, extracting information from the CloudWatch Alarm payload in the SNS message
    var output = message.NewStateValue + ' '
        + message.Region + ' '
        + message.AlarmName;
    console.log('Output: ', output);

    // The output is send as 'value1' to IFTTT Maker 
    var params = querystring.stringify({value1: output});

    https.get(encodeURI(iftttMakerUrl) + '?' + params, function(res) {
        console.log("Got response: " + res.statusCode);
        res.setEncoding('utf8');
        res.on('data', function(d) {
            console.log('Body: ' + d);
        });
        context.succeed(res.statusCode);
    }).on('error', function(e) {
        console.log("Got error: " + e.message);
        context.fail(e.message);
    });

};

ハンドラはデフォルトのままで、ロールは専用のものを作成しました。(既存のものでも構いません)

12-lambda-handler-iam

13-lambda-role

CloudWatchの設定

アラームの通知先を先程作成したSNSトピックに設定しておきます。今回は「ifttt-test-srv」というEC2インスタンスのCPU使用率の項目を監視対象にしています。

14-cloudwatch-alarm

IFTTT Maker Channelの設定(Slack編)

ようやく準備が整いました。
それではIFTTT側の設定を行っていきます。まずはSlackにアラームを送るようにしてみたいと思います。

IFTTTの画面で「My Applets」をクリックします。移動した画面で「New Applet」をクリックします。

16-iftttnew

「+this」をクリックします。

17-newthis

検索してmakerをクリックします。

18-searchmaker

「Receive a web request」をクリックします。

19-webrequest

「Event Name」には、Lambdaで実行するスクリプトで指定した変数「iftttMakerEventName」の値を入力します。

20-ifttt-eventname

次にMakerから連携する「that」を設定します。「+that」をクリックします。

21-that

slackを検索してクリックします。

22-chooseslack

「Connect」をクリックします。

23-connectslack

Slackにアクセスするための認証画面が別ウィンドウで出ますので、アクセスしたいチームを選択して下さい。

24-oauth-slack

問題なければ「Authorize」をクリックします。

25-oauthorize

元の画面に戻り「Post to channel」をクリックします。

26-iftttchannel

slackにpostするメッセージ内容などを指定します。

27-settingpost

今回は下記のように後で修正しました。

29-slackpostchannel

最後に「Finish」をクリックします。

28-slackfinish

これで全ての設定が完了しました。CloudWatchでしきい値を変更してわざとアラーム状態にしてみます。

69-cwalarm

しばらく待てば通知が来ますが、すぐに確認したい場合はIFTTTの画面で下記の「Check now」をクリックします。

70-checknow

下記のようにSlackにメッセージがPostされました。

30-slack

次に別のサービスとも連携させてみます。作成したSlack連携のアプレットは停止しておきます。
IFTTTの画面で「My Applets」のページに移ります。自分で作成したAppletが表示されているので、先程作成したAppletをクリックします。

48-slackoff

「On」をクリックして「Off」に変えます。

49-slackoffbotton

これで停止出来ました。

50-off-myapp

IFTTT Maker Channelの設定(Spark編)

Slackだけでは面白くないので、次にCisco Sparkでも試してみたいと思います。

Cisco Sparkとは、シスコシステムズ社が提供しているコラボレーションサービスで、仮想会議やビデオ会議、チャットなどを行うことが出来ます。今回は、この仮想会議室にメッセージをpostしてみます。

Sparkのアカウントがない場合は下記ページで作成しておきます。

Cisco Spark | はじめに

41-sparksignin

次に登録したいメールアドレスを入力します。

42-sparkaddress

登録したメールアドレスに確認のメールが送られているのでメールをチェックします。

43-checkemail

下記のようなメールが送られてきますので、「Set your Password」をクリックします。

44-setpassword

パスワードを設定します。

45-makepassword

アカウント名を入力します。

46-entername

これでログイン完了です。

47-webspark

Cisco Sparkはiphoneアプリもあったので、そちらでログインしても構いません。Androidアプリもありますがそちらは未確認です。

次にIFTTT側の設定を行います。方法は簡単です。Slackの時と同じ手順になります。 先程の画面で「New Applet」をクリックして作成を開始します。

51-newapp-spark

「this」の作成はSlackの時と同じなので割愛します。「that」の設定で「spark」を検索してクリックします。

52-thatspark

「Connect」をクリックします。

53-connectspark

別ウィンドウで認証の画面が出ますので、先程登録したメールアドレスを入力します。

54-signinspark

パスワードを入力してサインインします。

55-singinspark2

Postするメッセージ設定は下記のようにしました。Roomはデフォルトで用意されている「Sample Room」を指定しています。(尚、新しくRoomを作る時は3名以上の参加がないとRoom名を好きなものに指定出来ません。)

問題なければ「Create action」をクリックします。

56-sparkaction

最後に「Finish」をクリックします。

57-sparkfinish

Slackの時と同じように、CloudWatchでわざとアラーム状態になるようにすると、下記のようにSpark側にメッセージがpostされました。(すぐに確認したい場合はIFTTT側で「Check now」をクリックして下さい)

59-postspark

モバイルアプリでも下記のように確認出来ました。

60-mobilespark

IFTTT Maker Channelの設定(SMS編)

では、最後にSMS(ショートメッセージサービス)にメッセージを送ってみたいと思います。

IFTTT側の設定はSlack,Sparkと同様の流れになります。「that」の設定で「sms」を検索してクリックします。

61-thatsms

「Connect」をクリックします。しかし、ここで気になるメッセージが表示されています。

62-connectsms

Get important notifications on your phone via SMS. 
This service has a cap of 100 SMS messages per month for users in the US and Canada and 10 per month for those outside of North America. 
To avoid having Applets paused until the next month if you hit the limit, try the Notifications service. Some carriers outside of the US are not supported yet.

簡単に言うと、「北米以外のユーザは月間10通まで」 という上限があるということです。以前は100通だったようですが、どこかのタイミングで上限値の変更があったようです。
その為、SMSとの連携はアラーム通知ではなく月間10通知にとどまる用途での利用が望ましいですね。

しかし、ここまでやったので動作確認まで行ってみたいと思います。

電話番号の入力

先程の「Connect」を押すと別ウィンドウで携帯電話との接続処理が開きます。ここで自分の携帯電話番号を入力しますが、海外からの発信になるので、国番号を指定して入力 します。

具体的には、0081を先頭に指定して、電話番号の最初の「0」を除いた数字を後に続ける形で入力します。例えば、電話番号が「090-1234-5678」の場合「00819012345678」と入力します。

63-sendpin

「Send Pin」をクリックすると携帯電話に下記のようにPIN番号の通知が来ますので、この番号を入力して「Connect」をクリックします。

71-sendpin

PIN番号を入力します。

64-sendpinconnect

元の画面に戻って「Send me an SMS」をクリックします。

65-smsaction

次の画面では、送信するメッセージの内容を設定します。今回は、下記のように設定して「Create action」をクリックします。メッセージの内容は好きな内容に変更して下さい。

66-createactionsms

最後に「Finish」をクリックします。

67-finishsms

これまでと同様にアラームを発生させると、下記のようにSMSでメッセージが届きました。

68-smsmobile

注意点

IFTTTは無料で利用できますが、リアルタイム性は保証されていません。最短で15分毎に1回実行されるようですが15分間についても保証は無いとのことです。
実際に、場合によっては30分くらいかかる場合や1時間以上かかった場合もありました。

詳細は未確認ですが、Realtime APIというものが用意されているらしく、こちらを利用すればリアルタイムに利用できるかもしれません。

最後に

IFTTTの他にも似たようなサービスがありますが、こういったサービスを利用すると簡単に色んなことができるようになりとても便利だと思います。 類似サービスの確認や、Realtime APIの件も含めて引き続き調べていきたいと思います。

ちなみに、今回紹介した「CloudWatchAlarm2IFTTT」のプログラムですが、Amazon SNSとの連携やAutoScaling通知の連携ができるプログラムもありましたので、合わせてご紹介しておきたいと思います。

以上です。

  • Khoi Thinh

    Splendid tutorial.