CloudWatch의 Alerm을 Lambda를 통해 chatwork에 POST

인프라를 모니터링하고 있습니까?

제가 관리하고 있는 서비스는 Zabbix 사용하고 있기 때문에 기본 그 곳에서 컨트롤하면 됩니다만, 거기까지가 아닌 & 캐주얼에 하고 싶을 때는 CloudWatch를 사용하고 싶습니다. CloudWatch는 설정이 매우 간단하며 Alerm의 알림 대상도 메일이나 SNS를 설정할 수 있어 매우 편리합니다.

그래서 이번에는 ELB를 감시하고 문제가 있으면 chatwork에 POST하도록 해 보았습니다.

참고로 chatwork의 API는 요청 헤더에 X-ChatWorkToken라는 API 키를 포함해야하므로 SNS에서 직접 HTTPS 게시를 할 수 없습니다. 그래서 AWS Lambda의 등장입니다. SNS로부터의 통지를 일단 Lambda에서 받고 chatworkAPI에 POST하는 흐름입니다.



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 설정 이미지





AWS SNS 구성 이미지





chatwork 이미지



이런 식으로 POST됩니다.



이것으로 안심하고 밤에도 잘 수 있네요.

좋은 웹페이지 즐겨찾기