LoginSignup
28
29

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-03-25

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

僕が管理しているサービスは、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

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

28
29
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
28
29