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

インフラ系のSE。一時期はプログラマ。 仮想化とオープンソースに興味あり。一日中寝てたい今日このごろ。 スペインとかで働きたいなぁ…(シエスタがあるので)

Leave a Comment

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

*