検証背景
監視サーバの運用コストや費用がちょっと高いなというときに、
Amazon LambdaがSNS連携できるようになったので、CloudWatchとLambdaを使えば、
サーバレスで監視システムを構築できるんじゃね?って感じたので試してみた
参考文献
Lambda→hipchatやSNS→Lambda→Slackなどは試している人がいたので、
下記のサイトを参考に、送信するメッセージ部分に手を入れた
aws-lambda-hipchat
SNS + Lambda + Slack でアラート通知を受け取る
環境準備
MacへNode.jsをインストール
公式サイトから.pkgファイルをダウンロードして、Macへインストールする。
https://nodejs.org/download/
SNSトピック作成
AWSCliから、SNSのTopicを生成
aws sns create-topic --name sns-lambda-hipchat
Lambda実行用IAMロール作成
aws iam create-role --role-name lambda_exec_role --assume-role-policy-document file://lamda_exec_role.json
IAMロールで読み込むjsonは以下の通り。
{
"Version": "2012-10-17",
"Statement": [
{
"Action": "sts:AssumeRole",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Effect": "Allow",
"Sid": ""
}
]
}
Lambdaアップロード用zipファイル作成
sns-lambda-hipchatをダウンロード
SNS→Lambda→HipChat通知を行うsns-lambda-hipchatを落としてくる。
#このあたりの設定方法は、aws-lambda-hipchatと同じ
git clone git@github.com:CkReal/sns-lambda-hipchat.git
cd sns-lambda-hipchat
npm install hipchat-client
HipChatの公式サイトにも記載されているし、hipchat-clientを使っておけばよさげ。
ちなみに、Lambdaが実行するjsファイルは、以下の通り
// Dependencies
var config = require('./config');
var HipChatClient = require('hipchat-client');
// HipChat Class
var hipchat = new HipChatClient(config.apiAuthToken);
exports.handler = (function(event, context) {
// SNS Message Check
if (!event.Records[0].Sns.Message) {
throw 'SNS message is required!';
}
// Message Formatting
var msg = {
subject : event.Records[0].Sns.Subject,
message : JSON.parse(event.Records[0].Sns.Message)
};
// HipChat Color Check
switch(msg.message.NewStateValue){
case 'OK': hipchat_color = 'green';break
case 'ALARM': hipchat_color = 'red';break;
default: hipchat_color = 'gray';break;
};
// creation message and options
var sendmsg = {
room_id : config.roomId,
from : config.from,
message_format : "html",
notify : "true",
color : hipchat_color,
message :
'<b>' + msg.subject + '</b><br>'
+ msg.message.AlarmDescription + '<br>'
+ msg.message.NewStateReason + '<br>'
};
// HipChat Send Message
hipchat.api.rooms.message(sendmsg, function(err, res) {
if (err) {
throw err;
}
console.log(res);
context.done(null, "HipChat Sent Message." );
});
});
各環境用にconfig.jsを修正
APIトークンや通知名はお好みで修正してください
var config = {};
config.apiAuthToken = 'XXXXXX'; #Please Change This
config.roomId = 'XXXXXX'; #Please Change This
config.from = 'AWS Lambda';
module.exports = config;
zipファイル作成
zip -r sns-lambda-hipchat.zip sns-lambda-hipchat.js config.js node_modules
ここで作ったsns-lambda-hipchat.zipをLamdaファンクションに渡す
Lambdaファンクション作成
aws lambda create-function \
--function-name sns-lambda-hipchat \
--runtime nodejs \
--role arn:aws:iam::123456789012:role/lambda_exec_role \
--handler sns-lambda-hipchat.handler \
--zip-file fileb://sns-lambda-hipchat.zip
ここまで実行できると、ManagementConsoleでLambdaファンクションが確認できる
SNSのSubscribe
LambdaとSNSの連携設定を行う
aws sns subscribe \
--topic-arn arn:aws:sns:ap-northeast-1:123456789012:sns-lambda-hipchat \
--protocol lambda \
--notification-endpoint arn:aws:lambda:ap-northeast-1:123456789012:function:sns-lambda-hipchat
Lambdaのevent sourcesマッピング
awscliからは
A client error (InvalidParameterValueException) occurred when calling the CreateEventSourceMapping operation: Unrecognized event source, must be kinesis or dynamodb stream.
というエラーが出て、設定できなかった(awscli==1.7.45現在)ので、ManagementConsoleから設定
#SNS→Lambdaは、4月に実装された機能なので、awscliの対応がまだなのかな?
[2017/04/17 更新]
現在は、awscliも対応している模様です。(gimKondoさん、ありがとうございます!)
CloudWatchの設定
CloudWatchの設定で、通知先をLambda連携しているSNSに設定する
結果
まとめ
ひとまず、サーバレスでのSNS→Lambda→HipChat連携に成功。
送信するメッセージはjs内で修正できるので、柔軟なエラーメッセージをHipChatに通知することができるようになった。
応用例としては、特定の人にメンションをつけてみたり、SQSのデッドレターキューの監視などにも使えそうかな