CloudWatchのAlermをLambda通じてchatworkにPOSTする

More than 1 year has passed since last update.

インフラの監視、してますか?

僕が管理しているサービスは、Zabbix使っているので基本そちらでコントロールすればいいんですが、そこまでじゃない&カジュアルにやりたいときにはCloudWatchを使いたくなります。CloudWatchは設定が非常に簡単で、Alermの通知先もメールやSNSが設定できてとても便利です。

というわけで今回はELBを監視して、問題があればchatworkにPOSTするようにしてみました。

注意点として、chatworkのAPIはリクエストヘッダにX-ChatWorkTokenというAPIキーを埋め込む必要があるため、SNSから直接HTTPSポストはできません。そこでAWS Lambdaの登場です。SNSからの通知をいったんLambdaで受け取って、chatworkAPIへPOSTする流れです。

Untitled Diagram.png


AWS Lambdaスクリプト

requestモジュールはzipで上げないといけないので、httpsモジュールを使用しています。

var https = require('https');

var querystring = require('querystring');

exports.handler = function(event, context) {
var message = JSON.parse(event.Records[0].Sns.Message);
var state = (message.NewStateValue == 'ALARM') ? 'error' : 'ok';

var post_message = "(" + state + ")\n"
+ "[code]\n"
+ message.NewStateValue + "\n"
+ "\n"
+ message.AlarmName + "\n"
+ message.AlarmDescription + "\n"
+ message.NewStateReason + "\n"
+ "[/code]\n";

var postData = querystring.stringify({
body: post_message
});

var options = {
host: 'api.chatwork.com',
port: 443,
method: 'POST',
path: '/v2/rooms/【部屋ID】/messages',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': postData.length,
'X-ChatWorkToken': '【APIキー】'
}
};

var req = https.request(options, function (res) {
res.on('data', function (d) {
process.stdout.write(d);
});
res.on('end', function () {
context.done();
});
});

req.on('error', function (err) {
console.log(err);
});

req.write(postData);
req.end();

};

【部屋ID】と【APIキー】を適宜変更してください。

また、SNSからの通知メッセージを1件しか取得していなかったり、エラーハンドリングしてなかったりのザルなスクリプトですが、最小限これで動くようになると思います。


CloudWatchの設定イメージ

cloudwatch_config.png


AWS SNSの設定イメージ

sns_config.png


chatworkイメージ

こんな感じでPOSTされます。

chatwork_sample.png

これで安心して夜も眠れますね。