はじめに
ウェブサーバーの運用保守の一環で設定変更などを行う中で、作業のレベルにもよりますがウェブページが閲覧不可になるリスクは常に付き物です。
今回、Pythonを用いてウェブページのヘルスチェックを行い、閲覧不可のステータスに早く気が付ける仕組みを作ってみることにしました。
プログラム概要・目標
一定間隔で、GETによるリクエストを発生させ、応答コードをコンソール出力することで現状のヘルス状態を確認するというプログラムを実装することとしました。
最終的なゴールは一定間隔で複数のページを対象としたヘルスチェックを行うということにしています。
GETリクエストを行うPythonコード
まず、Requestモジュールでウェブページへのアクセスを行い、ステータスコードをコンソールに出力するコードを作成しました。
import requests #requestモジュールをインポート
response = requests.get('{確認したいURL}') #URLを指定してGETリクエストを送信
status_code = response.status_code #ステータスコードを取得
print(f"Response code: {status_code}") #ステータスコードを表示
このとき、{確認したいURL}に、ヘルスチェックを行うURLを直接入力してください。
例:response = requests.get('https://qiita.com/')
こちらのコードで、[Response code: 200]と応答が帰ってくれば、PythonによるGETリクエストは成功しています。
複数のURLにまとめてリクエストする
先ほどの項目で、1つのURLを対象としたリクエストを実行することに成功しました。
しかし、今回のゴールとして複数のURLにリクエストをかけることを設定したので、複数のURLにGETリクエストを行えるようにします。
import requests
import time
import os
#検索URLのリストをファイルから読み込む
def get_url_list():
#読み込み元のファイルを指定 /get-url-list/url_list.txt
current_directory = os.path.dirname(os.path.abspath(__file__)) # カレントディレクトリを取得
read_url_file = r"get-url-list\url-list.txt" # URLリストのファイル名を指定
combined_read_file = os.path.join(current_directory, read_url_file) # CSVファイルのパスを作成
with open(combined_read_file, 'r') as file:
url_list = [line.strip() for line in file] # URLリストを読み込む、line.strip()で改行文字を削除
file.close() # ファイルを閉じる
return url_list
#URLリストを受け取り、URLにアクセスする
def get_page(url_list):
url_list = get_url_list() # 検索URLをフォルダーから受け取る
for url in url_list:
response = requests.get(url) # URLにアクセスする
status_code = response.status_code # HTTPステータスコードを取得する
print(f"{url} : Response code: {status_code}") # HTTPステータスコードを出力する
delay_time = 5 # 5秒待機
time.sleep(delay_time)
#実行
url_list = get_url_list() # 検索URLをフォルダーから受け取る
get_page(url_list) # URLリストを受け取り、URLにアクセスする
以下のディレクトリ構成でページを作成しています。
関連するファイルを相対パスで読み込むため、osモジュールを用いています。
Python_code/get-python.py
を実行ファイルとした場合、Python_code/get-url-list/url-list.txt
に記述したURLを[get_url_list]
にて読み込み、読み込んだリストをもとに[get_page]
でGETリクエストを行うようにしています。
このプログラムにあるtime.sleep(delay_time)
は絶対に削除しないでください。
遅延を入れないことにより、大量にGETアクセスを発生させてしまうことでDoS攻撃となる可能性があります。
電子計算機損壊等業務妨害罪(刑法第234条の2)により、5年以下の懲役または100万円以下の罰金を科せられる可能性があります。
なお、URLリストは以下のような記述にしています。
https://example.co.jp
https://news.example.co.jp/
連続したアクセス実施
ループさせて監視し続けたいので、以下のように、While文を使って無限ループ化させることにしました。
やめるときは、Ctrl-Cでプログラム実行を止めています。
#実行
url_list = get_url_list() # 検索URLをフォルダーから受け取る
while True:
get_page(url_list) # URLリストを受け取り、URLにアクセスする
他にキー入力を監視するkeyborad
モジュールなどもありそうですが、管理者権限が~などの制約があるようで今回時点での実装はやめにしました。
備考
Requestモジュールはデフォルトだとキャッシュ維持をする設定ではないようで、キャッシュについては気にする必要はなさそうです。
まとめ
今回の実装で、各URLに対するGETリクエストによるヘルスチェックについて実装することができました。
コンソールログを見るというベースなので多少使いずらい点があるので、GUI化についても今後実装していきたいと考えています。
便利ツールやAWSに関する記事を上げていこうと思っていますので、よろしくお願いいたします!