CloudWatchの通知をAmazonLambdaを使ってSlackに流す

CloudWatchの通知を Amazon Lambda 経由でSlackに流す方法です。

こんなFunctionを登録しておけば、使えるって備忘録。

Slackの設定

Integrations から incoming-webhook を追加しておきます。

Amazon SNSの設定

CloudWatchからLambdaに流すためのTopicを作っておきます。

Amazon Lambda に登録するコード

console.log('Loading function');

exports.handler = function(event, context) {
  var message = JSON.parse(event.Records[0].Sns.Message);
  var text = "";

  if (message.NewStateValue === "ALARM") {
    text = ":exclamation: ";
  } else if (message.NewStateValue === "OK") {
    text = ":white_check_mark: ";
  }
  text = text + message.NewStateValue + ": " + message.AlarmName + "\\n" + message.NewStateReason;

  var exec = require('child_process').exec;
  var url = '<Webhook URL>'
  var cmd = 'curl -X POST --data-urlencode \'payload={"text": "' + text + '"}\' ' + url

  exec(cmd, function(error, stdout, stderr) {
    context.succeed(stdout);
  });
};

おもむろに curl を叩いてみたら動きました。便利。

動作確認の方法

EC2のインスタンスCPU使用率のアラームを作っておいて、下記のコマンドを打てばお手軽にCPUの負荷を上げられます。

$ yes >> /dev/null

動作イメージ

f:id:sinsoku:20150729233304p:plain