column

ジョブフローの簡単な例 簡単なWebサーバーの監視をする

今回はWebサーバーが公開するURLにリクエストを送り、死活監視を行うジョブフローを作成します。

処理の流れとしては以下のような想定です。
* 指定のURLにリクエストを送信し、応答がなければエラーを表示
* HTTPのステータスコードが200以外の場合にはエラーを表示
* 上記以外の場合には正常であると表示

まずWEBサーバーにリクエストを送信する方法ですが、Kompiraの組み込み関数urlopen()を使います。引数で指定した url に対して、HTTPリクエストを送信し、結果を取得します。

[ ] 内の引数は省略可能です。各引数の意味は以下の通りです。
(以下の仕様はkompira 1.4.8.post7のものです。使用しているkompiraのバージョンが異なる場合は、付属のドキュメントを参照してください。)

user, password Basic認証によるアクセスを行います。
data 送信データを辞書型の値として格納し、HTTPのPOSTリクエストを送信できます。
params 辞書を渡すと URL のクエリ文字列として展開されます。
例えばurlopen(url=’http://example.com‘, params={key1=’value1’,key2=’value2’}) とすると、
実際にアクセスする URL はhttp://example.com?key1=value1&key2=value2となります。
timeout timeout には、タイムアウトするまでの時間を秒単位で指定します。
encode エンコードタイプとして “json”を指定することができます。
data が指定され encode が “json” のとき、HTTP リクエストのContent-Type: ヘッダには自動的に application/json が設定されます。
encode引数を省略した場合、送信データはapplication/x-www-form-urlencoded形式でエンコードされます。
http_method HTTPリクエストのメソッドを’GET’, ‘POST’, ‘PUT’, ’DELETE’, ‘HEAD’のいずれかから指定します。
http_methodを省略した場合、dataが指定されていない場合はGETメソッド, 指定されている場合はPOSTメソッドとなります。
verify true を指定すると、指定した URL が https アクセスである時に SSL 証明書のチェックを行います。

不正な SSL 証明書を検出するとurlopen ジョブはエラーになります。verify のデフォルト値は false です。

quiet true を指定すると、verify オプションが true 時に、https アクセスした際に表示される警告メッセージを抑止します。
headers HTTPリクエストに設定するヘッダ情報を辞書型の値で渡すことができます。
cookies サーバに渡すクッキーを辞書型の値で渡します。
charset レスポンスとして期待する文字コードを指定することができます。
binary trueを指定すると、Content-Typeによらずコンテンツをバイナリとして扱います。
proxies HTTPリクエスト送信時のプロキシサーバ情報を辞書型の値で渡すことができます。
例: urlopen(‘http://www.kompira.jp’, proxies={‘http’: ‘http://10.10.1.10:3128’, ‘https’: ‘http://10.10.1.10:1080’})

 

urlopen()でアクセスに成功した場合の結果は、以下の要素を持つ辞書で返されます。codeには HTTP のステータスコードが、bodyにはレスポンスの内容が格納されています。

フィールド名 意味
url レスポンスのURL
code 結果ステータスコード
text レスポンスの内容(エンコード情報をもとにレスポンス本文をテキストにデコードしたもの。ただし、バイナリコンテンツの場合は空文字になります)
content レスポンスの内容(バイナリのままのレスポンスの本文)
body レスポンスの内容(コンテンツがバイナリであると判断したとき content と同じ値になり、テキストであると判断したときは text と同じ値になります)
encoding エンコード情報
headers レスポンスに含まれるヘッダ情報(辞書型)
cookies サーバから渡されたクッキー値(辞書型)
history リダイレクトがあった場合にその履歴情報(リスト型)
binary バイナリコンテンツであるかの真偽値

 

これを用いて、Webサーバーにリクエストを送信するのは以下のようなコードになります。

続いて結果を判断して表示の切り替えを行います。
条件分岐はifブロックを用いて行います。

urlopen()を実行した際、リクエストの送信に成功した場合には$STATUSが0に、失敗した場合は$STATUSが0以外になります。

よって、まずはurlopen()自体が成功したかどうかで分岐する処理をします。

具体的に失敗する場合は、urlopen()に指定したホスト名やIPアドレスが間違っていたり、ネットワークが接続できなかったということが原因であると考えられます。

さて、今回は「HTTPの応答コードが200以外の場合にはエラーを表示」としたいので、このコードだけでは十分ではありません。

ここにHTTPリクエストのステータスコードが200であるかどうかを確認する処理を追加してみましょう。

ifブロックで追加条件を指定する場合にはelif節を用います。

これを用いて、HTTPのステータスコードが200以外の場合は異常とします。urlopen()の結果は$RESULTに辞書型で格納されており、”code”というキーで参照できます。

HTTPリクエストに対する応答が正常でなかったときは、$RESULT.codeが200以外となります。

例えば、存在しないURLパスを指定してしまったり、Webサーバー側で何らかのトラブルが発生している場合等があります。

今回の例ではHTTP GETリクエストを送信するのにurlopen()を使用しました。
上記ではレスポンス中のステータスコードを確認するだけにとどまっていますが、サイトのコンテンツ内容の取得はもちろん、ファイルのダウンロードや、外部のREST API呼び出しなど、urlopen()は様々な場面で使用することができます。