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

#検証背景
監視サーバの運用コストや費用がちょっと高いなというときに、
Amazon LambdaがSNS連携できるようになったので、CloudWatchとLambdaを使えば、
サーバレスで監視システムを構築できるんじゃね？って感じたので試してみた

#参考文献
Lambda→hipchatやSNS→Lambda→Slackなどは試している人がいたので、
下記のサイトを参考に、送信するメッセージ部分に手を入れた
[aws-lambda-hipchat](https://github.com/davemaple/aws-lambda-hipchat)
[SNS + Lambda + Slack でアラート通知を受け取る](http://qiita.com/u-minor/items/596329da79abd64af658)

#環境準備
##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の[公式サイト](https://www.hipchat.com/docs/apiv2/libraries)にも記載されているし、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](https://qiita-image-store.s3.amazonaws.com/0/14190/83b39597-7632-246f-2e82-e354ebc99d50.png "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](https://qiita-image-store.s3.amazonaws.com/0/14190/4ad91406-7a63-02a5-d223-076b1e53d4c6.png "AWS Lambda.png")


##CloudWatchの設定
CloudWatchの設定で、通知先をLambda連携しているSNSに設定する
![screenshot 2015-08-16 19.36.18.png](https://qiita-image-store.s3.amazonaws.com/0/14190/9d83cb92-1cc9-96ab-7213-862592f79212.png "screenshot 2015-08-16 19.36.18.png")

#結果
こんな感じでHipChatに通知が来ればOK
![screenshot 2015-08-16 19.38.54.png](https://qiita-image-store.s3.amazonaws.com/0/14190/41e389e0-2720-d626-b904-f50600004cbf.png "screenshot 2015-08-16 19.38.54.png")

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