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

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

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の通知をするように設定すればいい。