LoginSignup
28
29

More than 5 years have passed since last update.

SNSからLambdaを経由して、HipChatにアラートを通知する

Last updated at Posted at 2015-08-16

検証背景

監視サーバの運用コストや費用がちょっと高いなというときに、
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は以下の通り。

lambda_exec_role.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ファイルは、以下の通り

sns-lambda-hipchat.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トークンや通知名はお好みで修正してください

config.js
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ファンクションが確認できる
screenshot 2015-08-16 18.28.17.png

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さん、ありがとうございます!)

AWS Lambda.png

CloudWatchの設定

CloudWatchの設定で、通知先をLambda連携しているSNSに設定する
screenshot 2015-08-16 19.36.18.png

結果

こんな感じでHipChatに通知が来ればOK
screenshot 2015-08-16 19.38.54.png

まとめ

ひとまず、サーバレスでのSNS→Lambda→HipChat連携に成功。
送信するメッセージはjs内で修正できるので、柔軟なエラーメッセージをHipChatに通知することができるようになった。
応用例としては、特定の人にメンションをつけてみたり、SQSのデッドレターキューの監視などにも使えそうかな

28
29
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
28
29