運用中のサイトがたまに落ちていることがあったので、
簡易的にですがサイト監視を用意してみました。
(世の中にはサーバーのメトリクス取得含め手厚い監視サービスが様々ありますが、今回は低コストかつSlackとも簡単に連携できる方法という位置づけで作っています)
サイトのstatusをチェックしてSlackに通知する
では、サイトチェックをするコードを書いていきます。
おおまかな流れとしては、指定されたURLのHTTP statusをチェックし、200以外のサイトがあれば、Slackに通知するというようになっています。
(逆に問題が無ければ、Slackには何も通知されません。テストの際には404ページのURLなどを含めてあげてください。)
全体は以下のようになります。
# -*- coding: utf-8 -*-
import requests
import json
# 監視したいサイトのURLを配列で指定
urls = ['https://www.rakuten.co.jp/']
def post_slack_h(c):
# SlackでIncoming Webhooksを有効にして取得したWebhook URLを記載
post_url = 'SlackのWebhook URL'
requests.post(post_url, data=json.dumps({
"username": "サイト見守るくん",
'text': c
}))
targets = []
def status_check(a="", b=""):
content = ""
for url in urls:
try:
s = requests.get(url, timeout=10).status_code
except requests.exceptions.ReadTimeout:
content += url + " Time out(10s)\n"
targets.append(url)
except requests.exceptions.ConnectionError:
content += url + " Connection error\n"
targets.append(url)
else:
if s == 200:
content += url + " " + str(s) + "\n"
else:
content += url + " " + str(s) + "\n"
targets.append(url)
if not targets:
print("All Green!!")
pass
else:
post_slack_h(content)
if __name__ == '__main__':
status_check()
Slackへの通知はIncoming webhookを利用
Incoming webhookの利用の手順は、以下の公式サポートをご確認ください。
https://slack.com/intl/ja-jp/help/articles/115005265063
コードのzipファイルを準備
AWS Lambda上で外部パッケージもimportするには外部パッケージのコードもあわせてアップロードする必要があります。
今回使用しているrequestsは外部パッケージなので、メインのコードと一緒にzipファイルにまとめてしまいます。
# メインコードのあるディレクトリにパッケージファイルを保存
$ pip install requests -t ./
# 圧縮してzipファイルにします
$ zip -r health_checker ./*
これでコードと外部パッケージを内包した「health_checker.zip」というzipファイルが出来上がります。
AWS Lambdaで関数を作成する
AWSでLambdaのリンクをクリックすると、関数一覧の画面に遷移します。
ここの画面から、「関数の作成」をクリックします。
作成時の初期設定画面では、以下のように設定します
オプション: 一から作成
関数名: 任意
ランタイム: Python 3.7
続いて、関数の編集画面にある「関数コード」という項目からファイルのアップロードをおこないます。
設定は以下の画面のようにします。
特に注意したいポイントは、「ハンドラ」です。
ハンドラは、Lambdaで実行する関数を指定する箇所です。
指定の仕方はファイル名(拡張子無し).(指定したファイル内の)関数名となります。
ですので、ここでは「health_checker.status_check」となります。
定期実行の設定
ここまでで作成したコードをLambda上で実行するまでは整いました。
最後にコードを定期的に実行するように設定します。
関数の編集画面から「+トリガーを追加」をクリックします。
(下の画像は既に追加済みの完成形です)
トリガーの作成画面では以下のように設定します。
スケジュールは、Cronで1時間毎に実行という指定をしてみます。
cron(0 0/1 * * ? *)
0/1の部分を0/2, 0/5などとすれば2時間毎、5時間毎と間隔を変更することができます。
備考:エラー「time out after 3.00 seconds」への対策
複数のサイトや読み込みに時間のかかるサイトを監視すると、Lambdaのデフォルト設定のタイムアウト時間3秒を超えてしまうことがあります。
それを回避するために、Lambda関数編集画面の中ほどより少し下の「基本設定」からタイムアウト時間を調整します。
最後に
Slackの通知内容の見た目にもこだわりたい方は、attachmentの書式なども活用すると表現の幅が広がります!
参考にどうぞ
https://qiita.com/m-nakada/items/643909ca14f306a74999
以上、お疲れ様でした