今回は Web サーバーが公開する URL にリクエストを送り、死活監視を行うジョブフローを作成します。
動作確認環境
本稿は、以下の環境で検証しています。
ソフトウェア | バージョン |
Kompira Enterprise | 1.5.5.post7 |
OS | CentOS 7.8.2003 |
または
ソフトウェア | バージョン |
Kompira Enterprise | 1.6.2.post4 |
OS | CentOS 8.2.2004 |
または
ソフトウェア | バージョン |
---|---|
Kompira Enterprise | 1.6.8 |
OS | CentOS Stream 8 |
以下のような処理の流れを想定しています。
- 指定の URL にリクエストを送信し、応答がなければエラーを表示
- HTTP のステータスコードが200以外の場合にはエラーを表示
- 上記以外の場合には正常であると表示
まず WEB サーバーにリクエストを送信する方法ですが、以下のような Kompira Enterprise の組み込み関数 urlopen() を使います。引数で指定した url に対して、HTTP リクエストを送信し、結果を取得します。
urlopen(url [, user, password, data, params, files, timeout, encode, http_method, verify, quiet, headers, cookies, charset, binary, proxies])
[ ] 内の引数は省略可能です。各引数の意味は以下の通りです。
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 となります。 |
files | アップロードするファイルを渡すことができます。ファイルは name と data というフィールドを持つ辞書、ファイル名とコンテンツのリスト、Kompira Enterprise サーバー上のファイル名、または添付ファイルフィールドのいずれかの形式で指定することができます。 例: files={file={name=’filename’, data=’content’}} |
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 を指定すると、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 | 結果ステータスコード |
version | HTTPバージョン(HTTP 1.1 なら 11 という数値になります) |
text | レスポンスの内容 (エンコード情報をもとにレスポンス本文をテキストにデコードしたもの。ただし、バイナリコンテンツの場合は空文字) |
content | レスポンスの内容 (バイナリのままのレスポンス本文) |
body | レスポンスの内容 (コンテンツがバイナリであると判断したときは content と同じ値になり、テキストであると判断したときは text と同じ値) |
encoding | エンコード情報 |
headers | レスポンスに含まれるヘッダ情報 (辞書型) |
cookies | サーバーから渡されたクッキー値 (辞書型) |
history | リダイレクトがあった場合にその履歴情報 (リスト型) |
binary | バイナリコンテンツであるかの真偽値 |
これを用いて、Web サーバーにリクエストを送信するのは以下のようなコードになります。
| url = "http://www.kompira.jp/" | urlopen(url)
続いて結果を判断して表示の切り替えを行います。
条件分岐は if ブロックを用いて行います。
{ if (条件式) | then: (条件が真の場合の処理) else: (条件が偽の場合の処理) }
urlopen() を実行した際、リクエストの送信に成功した場合には $STATUS が0に、失敗した場合は $STATUS が0以外になります。
よって、まずは urlopen() 自体が成功したかどうかで分岐する処理をします。
| url = "http://www.kompira.jp/" | urlopen(url) => { if $STATUS != 0 | then: print("異常が検出されました") else: print("正常です") }
具体的に失敗する場合は、urlopen() に指定したホスト名や IP アドレスが間違っていたり、ネットワークが接続できなかったということが原因であると考えられます。
さて、今回は「HTTP の応答コードが200以外の場合にはエラーを表示」としたいので、このコードだけでは十分ではありません。
ここに HTTP リクエストのステータスコードが200であるかどうかを確認する処理を追加してみましょう。
if ブロックで追加条件を指定する場合には elif 節を用います。
{ if (条件式) | then: (条件が真の場合の処理) elif (追加条件式): (条件が偽、かつ追加条件が真の場合の処理) else: (条件が偽、かつ追加条件も偽の場合の処理) }
これを用いて、HTTP のステータスコードが200以外の場合は異常とします。urlopen() の結果は $RESULT に辞書型で格納されており、”code” というキーで参照できます。
| url = "http://www.kompira.jp/" | urlopen(url) => { if $STATUS != 0 | then: print("異常が検出されました") elif $RESULT.code != 200: print("異常が検出されました。エラーコードは %{code}" % $RESULT) else: print("正常です") }
HTTP リクエストに対する応答が正常でなかったときは、$RESULT.code が200以外になります。
例えば、存在しない URL パスを指定していたり、Web サーバー側で何らかのトラブルが発生している場合等があります。
本稿では HTTP GET リクエストを送信するのに urlopen() を使用しました。上記ではレスポンス中のステータスコードを確認するだけにとどまっていますが、サイトのコンテンツ内容の取得はもちろん、ファイルのダウンロードや外部の REST API 呼び出しなど、urlopen() は様々な場面で使用することができます。