AWS LambdaでWebサイトの死活監視(前編)

AWS LambdaでWebサイトの死活監視を行ってみます。
まずはシンプルな版です(言語: Node.js 4.3)。

'use strict';

let aws  = require('aws-sdk');
let http = require('http');    // https の場合は require('https')

let snsParams = {
    TopicArn: 'arn:aws:sns:xxx'    // AWS SNSのトピックARN
    ,Subject: 'AWS SNS alert from Lambda'
};

let url = 'http://xxx';    // 監視するWebサイトのURL

exports.handler = (event, context, callback) => {
    http.get(url).on('error', (e) => {
        snsParams.Message = 'Website Check Error: ' + e.message;
        console.log(snsParams.Message);
        (new aws.SNS()).publish(snsParams, (err, data) => {
            if (err) console.log(err.stack);
            else     console.log(data);
        });
    });
};

アクセスに失敗した場合にAWS SNS経由で通知を行います。
SNSでは、通知先にEメールや携帯のSMSを簡単に設定することができます。)

このLambdaをCloudWatchのスケジュールで一定時間ごと(5分ごとなど)に実行するようにします。

ただ、このシンプルな版の場合、前の状態が何だったかを知りませんので、次のような欠点があります。

  • アクセス失敗が継続する場合、一定時間ごとに通知が送られてしまう。
  • アクセス失敗からアクセス成功に変わったときの通知が無い(アクセス失敗通知が来てから一定時間通知が来なければ成功に変わったと推測できるが、アクセス失敗通知に失敗している可能性もゼロではなく、確証が得られない)。

次回は、これらの点の改善方法について考えたいと思います。