AWS Lambda에서 SSL 인증서를 매일 자동으로 확인하고 마감일이 다가오면 알림(Chatwork 및 Slack)하는 메커니즘
AWS Lambda에서 SSL 인증서를 매일 자동으로 확인하고 마감일이 다가오면 알림(Chatwork 및 Slack)하는 메커니즘
SSL 인증서로 실패한 경험이 있습니까?
자신은 여러 번 있습니다. .
SSL 증명서의 종료 기한을 잊고 있어, 눈치채면 증명서의 경고 화면이 나오고 있거나, 눈치채면 빠듯하게 증명서 신청에 시간에 맞지 않거나 등등 여러가지 있었습니다.
증명서 종료 기한 아슬아슬하게 되면, 벤더씨로부터 메일 옵니다만, 메일이라고 묻혀 깨닫지 않는다··
그래서 매일 자동 체크하고, 매일 사용하는 Chat 툴에 통지하는 방법을 도입했습니다.
또, 최근이라고 Let's Encrypt를 사용하고 있는 사이트도 있으므로, 증명서의 기한이 오는 것이 빠릅니다. (90일 밖에 없습니다)
구축 구상
AWS Lambda에는 CloudWatch Events - Schedule이라는 것이 있으므로 Cron처럼 Lambda를 지정하여 자동 실행할 수 있습니다.
이를 바탕으로, Lambda에게 각 지정한 도메인의 증명서의 기한을 조사하게 해 기한이 다가오는 것에 관해서는 Chat 툴에 흘리는 구조를 생각했습니다.
키워드 목록
구현
Lambda는 직접 소스 코드를 작성할 수 있지만 이번에는 라이브러리를 사용하므로 Zip 압축하여 업로드하는 형태로 해 나가려고합니다.
그래서 로컬 환경에 일단 Node.js를 쓸 수 있는 환경을 만들어 봅시다.
Node.js를 쓸 수 있는 환경 구축은 할애
$ mkdir project
$ cd project
$ npm init
$ npm install request
$ npm install underscore
필요한 라이브러리를 npm으로 설치합니다.
index.js를 만들고 index.js를 다음 소스로 만듭니다.
'use strict';
console.log('Loading function');
var request = require('request');
var _ = require('underscore');
exports.handler = (event, context, callback) => {
var domains = [
// ここに管理したいドメイン一覧を記入
hoge.com,
fuga.jp
];
var checkSSLDate = function(domain) {
console.log('exec cmd');
return new Promise(function(resolve, reject) {
var exec = require('child_process').exec;
// execするコマンド
var cmd = "openssl s_client -connect " + domain + ":443 < /dev/null 2> /dev/null | openssl x509 -text | grep Not | sed -e 's/^ *//g' | sed -e 's/Not.*:\ //g'";
// 日付の差分を取得するために実行するときの日付が必要
var today = new Date();
exec(cmd, function(error, stdout, stderr) {
if (!error) {
var results = stdout.split("\n");
// 期限期限のデータを取得
var date = new Date(results[1]);
// 日付の差分がミリ秒で取得できるので差分にする
var diffDays = Math.floor((date - today) / 1000 / 3600 / 24);
// chatworkに送るメッセージ
var message = '';
if (diffDays < 1) {
message = domain + 'の証明書期限が残り' + diffDays + '日しかないよ!!これはもうほんとにやばいよ!';
} else if (diffDays < 3) {
message = domain + 'の証明書期限が残り' + diffDays + '日しかないよ!やばい!デッドラインだよ!';
} else if (diffDays < 7) {
message = domain + 'の証明書期限が残り' + diffDays + '日しかないよ!気づいたらあと一週間だよ!';
} else if (diffDays < 15) {
message = domain + 'の証明書期限が残り' + diffDays + '日しかないよ!準備準備できたかな??';
} else if (diffDays == 30) {
message = domain + 'の証明書期限が残り30日しかないよ!そろそろ更新準備準備しようね!';
}
return resolve(message);
} else {
return reject('reject');
}
});
});
};
_.each(domains, function(val, key) {
checkSSLDate(val).then(function(message) {
// chatwork用
if (message !== '') {
// chatwork側に飛ばす処理
var roomId = process.env.ROOM_ID;
var apiToken = process.env.API_TOKEN;
var options = {
url: 'https://api.chatwork.com/v1/rooms/' + roomId +'/messages',
headers: {
'X-ChatWorkToken': apiToken
},
form : {body : message},
useQuerystring: true
};
console.log('Sending message');
request.post(options, function (err, res, body) {
if (!err && res.statusCode == 200) {
console.log('done');
context.done(null, body);
} else {
console.log('error');
context.done('error', err);
}
});
}
});
});
};
환경 변수의 설정을 Lambda상에서 합니다.
※ 이번은 ChatworkAPI를 이용하고 있으므로, Chawork용으로 쓰고 있습니다
ROOM_ID 1111111
apiToken hogehogehoge
실제로 테스트를 두드려 보겠습니다.
START RequestId: 76c2b6f9-e134-11e6-a3e1-fbf07a26df51 Version: $LATEST
2017-01-23T06:23:32.940Z 76c2b6f9-e134-11e6-a3e1-fbf07a26df51 exec cmd
2017-01-23T06:23:32.948Z 76c2b6f9-e134-11e6-a3e1-fbf07a26df51 exec cmd
END RequestId: 76c2b6f9-e134-11e6-a3e1-fbf07a26df51
REPORT RequestId: 76c2b6f9-e134-11e6-a3e1-fbf07a26df51 Duration: 2110.19 ms Billed Duration: 2200 ms Memory Size: 512 MB Max Memory Used: 71 MB
상기 로그를 확인할 수 있어 제대로 움직이고 있는 것을 확인할 수 있었습니다.
덧붙여서, Chatwork에서는 이런 식으로 통지가 옵니다.
이제 Schedule을 설정합니다.
Schedule은 1일마다 통지하도록 합니다.
이렇게 하면 매일 알림이 자동으로 올 수 있습니다.
요약
이것을 Lambda로 넣어두면, SSL 증명서를 제대로 평상시 사용하는 Chat 툴에 통지할 수 있습니다.
이메일보다 눈치채는 확률이 높아지며, 모두가 의식하고 SSL 인증서의 갱신 기한을 신경 쓸 수 있습니다.
Reference
이 문제에 관하여(AWS Lambda에서 SSL 인증서를 매일 자동으로 확인하고 마감일이 다가오면 알림(Chatwork 및 Slack)하는 메커니즘), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/zwirky/items/25b1a66dac534f67ca03텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)