CloudWatchから送られてくる内容をChatworkに投稿したい件
こんにちは、中村です。
まずいまずい全然ブログ書いてなかった。。
おかげさまで公私共々忙しくしています。
本日はこのネタ、CloudwatchをChatworkに送っちゃうやーつ。
使うのは、Cloudwatch, AmazonSNS, Amazon Lambdaです。
・CloudwatchはAWSのクラウドリソースやアプリケーションをモニタリングするやつです。
・AmazonSNSは通知サービスです。(今回はCloudwatchのアラームをLambdaに送信してくれます)
・Amazon LambdaはSNSから送られたJSONの中身をChatworkAPIを使って送信してもらいます。
まずJSONを取得して、APIぶっ叩くLambdaを書きます。
下記のスクリプトは、エラーハンドリングもしてないのであかんやつですがとりあえず動きます。
(なぜならさっき書いたからリファクタリングしていないのDA)
ちなみにSNSから渡されるJSONデータは、テストの時に全部見れる。
(ドキュメント読まずともテスト行おうとすれば確認できる)
var https = require (‘https’);
var querystring = require(‘querystring’);
exports.handler = function(event, context) {
var SnsMessage = event.Records[0].Sns.Message;
var postData = querystring.stringify({
body: “[To: USERIDを入れます]” + SnsMessage
});
var options = {
host: ‘api.chatwork.com’,
port: 443,
method: ‘POST’,
path: ‘/v2/rooms/ROOMIDが入ります/messages’,
headers: {
‘Content-Type’: ‘application/x-www-form-urlencoded’,
‘Content-Length’: postData.length,
‘X-ChatWorkToken’: ‘APIKEYが入ります’
}
};
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();
};
作成の後、Amazon SNSでTopicを作成して、Subscriptionを追加します。
Protocol: Amazon Lambda
Endpoint: さっき作ったLambda
Version or alias: ご自由に
ここまでで仕込みはできました。
あとはEC2なりでアラーム(auto scalingとかで使ってそうなCPU utilizationとか)を作成して、
通知の送信先をさっき作ったSNSにします。
そうすれば出来上がり、かなり端折ったけど、lambdaのソースを乗せたので普通にできますよね?w
と思ってるのでこれ以上は書きません。
こいつには(というかAPIの問題なのか)、弱点があってAPI経由で投稿すると通知こないんですよね。
(*もはやメールの方がいいんじゃないか説)
ちょっとまだ解決できてないんですが、何か策がないかなーと思って調べてます。
自分のAPIKEYで自分にToすると通知がこないだけでした。
Chatworkさんごめんなさいm(_ _)m
チャットワークAPIはこちらから