背景
ウェブページを運営している人間にとって、ページアクセスできなくなるというのは致命的である。
しかし、サーバーが落ちてしまった、サーバー再起動時に自動復旧できなかった、AWSがメンテでインスタンスを落とした、SSLの証明書期限が切れた等の様々な理由で問題が発生することがあるため、すべての起こりうる問題に対してあらかじめ対処しておくことは難しい。
次善の策として、問題発生したら気づけるようにしておきたい。
作戦
- 監視用マシンにて、curlでウェブサイトの疎通確認を行う
- 問題があったら、Line NotifyでLineに通知する
- 一定時間ごとに実行する
- 監視用マシンが生きていることを監視する
curlでウェブサイトの疎通確認を行う
curlでhtmlをひっぱってくれば良いだろう。そして、中身が正しいことを確認するために、htmlに含まれるべき文字列をgrepする。
curl $URL_TO_MONITOR | grep $EXPECTED_STRING
Line NotifyでLineに通知する
LINEにメッセージが来ればすぐに気付けるだろう。LINEのMessaging APIは面倒なので、LINE Notifyという仕組みを使う。
設定はこちら。設定が終わったらトークンをコピーしておき、以下のような形で実行する。
curl -X POST -H "Authorization: Bearer $LINE_NOTIFY_TOKEN" -F "message=test message" https://notify-api.line.me/api/notify
Slackに通知したいなら、こちらが参考になるだろう。
一定時間ごとに実行する
ここまでの内容を踏まえて、以下のようなスクリプトを作成してmonitor.shという名称で保存する。
#!/bin/sh
curl $URL_TO_MONITOR | grep $EXPECTED_STRING
if [ $? -eq 0 ]; then
# curl -X POST -H "Authorization: Bearer $LINE_NOTIFY_TOKEN" -F "message=site is working" https://notify-api.line.me/api/notify
else
curl -X POST -H "Authorization: Bearer $LINE_NOTIFY_TOKEN" -F "message=site is not working" https://notify-api.line.me/api/notify
fi
chmod +x minitor.sh
にて実行権限を付与する。
crontab -e
にて、定期実行設定する。13分間隔くらいで監視すればよいだろうか。
PATH_TO_SHELL_SCRIPTには、監視スクリプトのパスを記載する。
*/13 * * * * PATH_TO_SHELL_SCRIPT >/dev/null 2>&1
監視用マシンが生きていることを監視する
監視用マシンが落ちていて監視できていないということは往々にて発生するので、ウェブサーバーから監視サーバーに対するpingもしておくと良いだろう。
ちゃんと見たい場合
ちゃんと監視したいなら、chromeのheadlessモードでサイトにアクセスしていろいろやると良い。
google-chrome --headless --disable-gpu --dump-dom URL_TO_MONITOR
chrome使うならば、1GBくらいのマシンを用意しておいたほうが良いので、Amazon EC2ならt3.microインスタンス以上にしておいたほうがいい。
もっともっとやりたいならSeleniumを使うとか、Puppeteerとかを使うのが良いだろう。