SNS経由でChatworkにメッセージ投げれないかと考えてましたが、これLambdaでいいんじゃないの?と思ってやってみました。せっかくPreviewも通ったし。
Lambda functionは以下のような感じです。
lambda-chatwork.js
var request = require('request');
exports.handler = function(event, context) {
var msg = event.msg;
var room_id = 'ルームID';
var options = {
url: 'https://api.chatwork.com/v2/rooms/' + room_id +'/messages',
headers: {
'X-ChatWorkToken': '自身のAPIトークン'
},
form : {body : msg},
useQuerystring: true
};
request.post(options, function (err, res, body) {
if (!err && res.statusCode == 200) {
context.done(null, body);
}else{
context.done('error', err);
}
});
};
httpsモジュールではうまくいかなかったので、request使ってます。requestのモジュールも含めてzipで上げる必要があります。
invoke-asyncコマンドで呼び出します。
aws lambda invoke-async \
--function-name lambda-chatwork \
--region us-east-1 \
--invoke-args input.txt
input.txt
{
"msg": "Hello Chatwork API & Lambda!!!"
}
で、いけました。(諸事情により名前部分消してます。。。)
使う場面としては、サーバでエラー検知したときに、エラーログをChatworkに投げようと思ってます。とりあえず、出来ただけで正しい?使い方なのかはよくわかりませんw
ただ、SNSのHTTP通知はリクエストヘッダを変更できないので、Chatwork APIのようにリクエストヘッダにトークンを含める必要がある場合に使うのは厳しいです。
なので、そういった場合に通知部分をLambdaに外出しして実行するのは有りかなと思いました。