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」 をクリックします。
メールアドレス、パスワードを入力して「Sign up」をクリックします。
Maker Channelとの接続
まずはMaker channnelと接続します。画面上部の「Search」をクリックします。
「maker」で検索して、Makerをクリックします。
「Connect」をクリックします。
Maker SecretKeyの確認
Webリクエストを投げる為にキー情報が必要になるので、これを確認します。 先程の画面で「Settings」をクリックします。
Account Infoに記載のURLにある/use/
以下のランダムな文字列がキー情報になります。このURLにアクセスすると詳細情報を確認出来ます。
Amazon SNSの準備
既存のものを利用される場合はスキップして下さい。今回は下記のように「cloudwatch-ifttt」というtopicを新規作成しました。
Lambda関数の設定
次にLambdaの設定を行います。トリガーとなるSNSは先程作成したトピックを指定します。
Lambda関数の設定は、それぞれ下記のように設定しました。
- 名前:cloudwatch-2-ifttt
- 説明:cloudwatch-2-ifttt
- ランタイム:Node.js 4.3
コードは下記の 「CloudWatchAlarm2IFTTT」 というものを使いたいと思います。下記ページにも記載がありますが、サンプルとしてのLambda関数なのでご利用は自己責任でお願い致します。
変数の「iftttMakerEventName」 はIFTTTで指定するイベント名になります。適当なものをつけて下さい。デフォルトのままでも構いません。もう一つの変数「iftttMakerSecretKey」 は先程確認したMaker SecretKeyの値を入力します。
スクリプトは下記になります。
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 = ''; 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); }); };
ハンドラはデフォルトのままで、ロールは専用のものを作成しました。(既存のものでも構いません)
CloudWatchの設定
アラームの通知先を先程作成したSNSトピックに設定しておきます。今回は「ifttt-test-srv」というEC2インスタンスのCPU使用率の項目を監視対象にしています。
IFTTT Maker Channelの設定(Slack編)
ようやく準備が整いました。 それではIFTTT側の設定を行っていきます。まずはSlackにアラームを送るようにしてみたいと思います。
IFTTTの画面で「My Applets」をクリックします。移動した画面で「New Applet」をクリックします。
「+this」をクリックします。
検索してmakerをクリックします。
「Receive a web request」をクリックします。
「Event Name」には、Lambdaで実行するスクリプトで指定した変数「iftttMakerEventName」の値を入力します。
次にMakerから連携する「that」を設定します。「+that」をクリックします。
slackを検索してクリックします。
「Connect」をクリックします。
Slackにアクセスするための認証画面が別ウィンドウで出ますので、アクセスしたいチームを選択して下さい。
問題なければ「Authorize」をクリックします。
元の画面に戻り「Post to channel」をクリックします。
slackにpostするメッセージ内容などを指定します。
今回は下記のように後で修正しました。
最後に「Finish」をクリックします。
これで全ての設定が完了しました。CloudWatchでしきい値を変更してわざとアラーム状態にしてみます。
しばらく待てば通知が来ますが、すぐに確認したい場合はIFTTTの画面で下記の「Check now」をクリックします。
下記のようにSlackにメッセージがPostされました。
次に別のサービスとも連携させてみます。作成したSlack連携のアプレットは停止しておきます。 IFTTTの画面で「My Applets」のページに移ります。自分で作成したAppletが表示されているので、先程作成したAppletをクリックします。
「On」をクリックして「Off」に変えます。
これで停止出来ました。
IFTTT Maker Channelの設定(Spark編)
Slackだけでは面白くないので、次にCisco Sparkでも試してみたいと思います。
Cisco Sparkとは、シスコシステムズ社が提供しているコラボレーションサービスで、仮想会議やビデオ会議、チャットなどを行うことが出来ます。今回は、この仮想会議室にメッセージをpostしてみます。
Sparkのアカウントがない場合は下記ページで作成しておきます。
次に登録したいメールアドレスを入力します。
登録したメールアドレスに確認のメールが送られているのでメールをチェックします。
下記のようなメールが送られてきますので、「Set your Password」をクリックします。
パスワードを設定します。
アカウント名を入力します。
これでログイン完了です。
Cisco Sparkはiphoneアプリもあったので、そちらでログインしても構いません。Androidアプリもありますがそちらは未確認です。
次にIFTTT側の設定を行います。方法は簡単です。Slackの時と同じ手順になります。 先程の画面で「New Applet」をクリックして作成を開始します。
「this」の作成はSlackの時と同じなので割愛します。「that」の設定で「spark」を検索してクリックします。
「Connect」をクリックします。
別ウィンドウで認証の画面が出ますので、先程登録したメールアドレスを入力します。
パスワードを入力してサインインします。
Postするメッセージ設定は下記のようにしました。Roomはデフォルトで用意されている「Sample Room」を指定しています。(尚、新しくRoomを作る時は3名以上の参加がないとRoom名を好きなものに指定出来ません。)
問題なければ「Create action」をクリックします。
最後に「Finish」をクリックします。
Slackの時と同じように、CloudWatchでわざとアラーム状態になるようにすると、下記のようにSpark側にメッセージがpostされました。(すぐに確認したい場合はIFTTT側で「Check now」をクリックして下さい)
モバイルアプリでも下記のように確認出来ました。
IFTTT Maker Channelの設定(SMS編)
では、最後にSMS(ショートメッセージサービス)にメッセージを送ってみたいと思います。
IFTTT側の設定はSlack,Sparkと同様の流れになります。「that」の設定で「sms」を検索してクリックします。
「Connect」をクリックします。しかし、ここで気になるメッセージが表示されています。
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」と入力します。
「Send Pin」をクリックすると携帯電話に下記のようにPIN番号の通知が来ますので、この番号を入力して「Connect」をクリックします。
PIN番号を入力します。
元の画面に戻って「Send me an SMS」をクリックします。
次の画面では、送信するメッセージの内容を設定します。今回は、下記のように設定して「Create action」をクリックします。メッセージの内容は好きな内容に変更して下さい。
最後に「Finish」をクリックします。
これまでと同様にアラームを発生させると、下記のようにSMSでメッセージが届きました。
注意点
IFTTTは無料で利用できますが、リアルタイム性は保証されていません。最短で15分毎に1回実行されるようですが15分間についても保証は無いとのことです。 実際に、場合によっては30分くらいかかる場合や1時間以上かかった場合もありました。
詳細は未確認ですが、Realtime APIというものが用意されているらしく、こちらを利用すればリアルタイムに利用できるかもしれません。
最後に
IFTTTの他にも似たようなサービスがありますが、こういったサービスを利用すると簡単に色んなことができるようになりとても便利だと思います。 類似サービスの確認や、Realtime APIの件も含めて引き続き調べていきたいと思います。
ちなみに、今回紹介した「CloudWatchAlarm2IFTTT」のプログラムですが、Amazon SNSとの連携やAutoScaling通知の連携ができるプログラムもありましたので、合わせてご紹介しておきたいと思います。
以上です。