Lambda(Node.js)で指定したURLのSSL証明書の期限切れまで何日かを取得してDatadogにアラートを出させる

先日にLambdaで外形監視を行ってDatadogでアラートを出させるという内容を書いたけど、それとは別でSSLの証明書についても監視をさせたいということがあった。
で、同じようにLambdaで証明書の残日数を取得してDatadogに連携させ、Datadog側で残日数以下の場合にはアラートを出させる事で対応できそうだったので、やってみることにした。

以下のようなNode.jsのコードをLambdaで定期実行(1日1回くらいでいいと思う)させ、Datadogにメトリクスとして証明書の残日数を通知させる。(※サンプルコードってことでタイムアウト等の際は何もしてないけど、本当にちゃんとやるならタイムアウト時にもDatadogへのポストで関数作って呼び出したほうが良いと思う)

Sponsored Links

■CheckCertExpireBlog

var https = require ('https');
var host = 'orebibou.com';
var testTarget = 'https://' + host; //監視対象url
var ddhost = 'app.datadoghq.com'; //Datadogホスト
var ddkey = 'APIキー'; //Datadog APIキー
var ddpath = '/api/v1/series' + '?api_key=' + ddkey;
var ddmetric = 'check.certexpire' //Datadogにポストする際のメトリクス名

exports.handler = function(event, context){
    var req = https.request(testTarget, function (response) {
        var code = response.statusCode;
        var message = testTarget + " : " + code;
        console.log(message);
        
        // get cert expire time
        const cert = req.socket.getPeerCertificate();
        cert_expire = Date.parse(cert.valid_to);
        
        // now time        
        var now = new Date();

        // get diff time
        var diff_time = cert_expire - now.getTime();
        var diff_day = Math.floor(diff_time/(1000*60*60*24));
        console.log('diff day:' + diff_day);
        
        // Datadogに証明書の残日数をポストする
        let postData = {
            "series": 
                [{"metric":ddmetric,
                  "points":[[Math.floor(new Date() / 1000), diff_day]],
                  "type":"gauge",
                  "tags":["env:lambda","url:"+host]}]
        };
        
        let postDataStr = JSON.stringify(postData);
        let options = {
            host: ddhost,
            path: ddpath,
            method: 'POST',
            headers: {
                'd-Type': 'application/json'
            }
        };
        
        let post = https.request(options, (post) => {
            console.log('STATUS: ' + post.statusCode);
            console.log('HEADERS: ' + JSON.stringify(post.headers));
            post.setEncoding('utf8');
            post.on('data', (chunk) => {
                console.log('BODY: ' + chunk);
            });
        });

        post.on('error', (e) => {
            console.log('problem with request: ' + e.message);
        });
        post.write(postDataStr);
        post.end();
    });
    
    // タイムアウト時の挙動について
    req.setTimeout(5000);
    req.on('timeout', function() {
        var message = testTarget + " : timeout";
        console.log(message);
    	req.abort();
    });
    
    // エラー発生時(404等ではなく、処理自体のエラー)の挙動について
    req.on('error', function (error) {
        var message = testTarget + " : " + error.message;
        console.log(message);
    });
    req.end();
}

 

後は、Datadog側でメトリクスが所定の日数以下になったらWarningやAlertの通知をするように設定すればいい。

 


Written by blacknon

インフラエンジニア(…のつもり)。 仕事で使うならクライアントはWindowsよりはUNIXの方が好き。 大体いつも眠い。

Leave a Comment

メールアドレスが公開されることはありません。

*