特定のログからWebシナリオテストを自動実行する
前回の記事内容の派生形となります。
実現イメージは以下ですが、前回との変更点は赤文字/赤線の部分です。
変更点の補足です。
④ Azure Automation Runbook Python2 から、事前に用意しておいた
Blob ファイルを取得しています。ファイルの中身は以下です。
https://www.google.com/
https://www.microsoft.com/ja-jp
https://hogehogekoike.com
https://aws.amazon.com/jp/
ここでは正常にHTTPの応答を返すか否かの対象となるサイトURLを
1行ずつ記載しています。
(3行目のhogehogekoike.comは存在しないURL)
⑤Blob ファイルに記載されたURLに対して1行ずつHTTPのスポンスを
取りに行っています。
⑥各URLのHTTPレスポンスの結果をメールの本文に入れてメール通知します。
ある程度想像できた方も多いと思いますが、24/365の稼働を提供している
自社のWebサービスにおいて、裏側で構成されているWebのシステムから
致命的なログが確認されたとき、多くのエンジニアは監視オペレータから
の呼び出しや緊急連絡網からの確認依頼、障害対処依頼がきますよね。
担当エンジニアは原因の究明や一次対処、サービス正常性確認などを
実施されていると思いますが、これをAzure PaaSを使ってすべて自動化
してしまおう、という一例です。営業時間内のオペレーションであれば
特に問題はないのですが、夜間や休日にサービス影響がない監視連絡ほど
出たくない電話はないですからね(汗
では本編に入ります。
前回の記事も試されて、かつ、せっかちな方(笑)は、以下の
pythonコードをAzure Automation Automation Runbook (python2) に
べたっと張り付けましょう。
(標準ライブラリのみで動作するように記載しています)
https://github.com/akkoike/sample/blob/master/automationpython.py
※{}の個所のみ、ご自分の環境に合わせた文字列を入れてください。
例:
storage_resource_group = "{RESOURCE_GROUP_NAME}"
⇒ storage_resource_group = "hogehoge-rg"
47行目まではAuto Credentialの部分ですので変更不要です。
49行目から68行目まではblob storageの 定義とインスタンス化です。
69行目から79行目までがURLを1行ずつ持ってきてHTTP(GET)を
発行し、その結果を変数に代入している部分です。
単純なBasic認証ならrequest.post(url,auth=('user','passwd'))と
指定すればいけそうですね。
80行目から最後の101行目まではSendGridへメール送信する部分
です。サブミッションポート(587)のTLS通信でメール送信しています。
では試してみましょう。
まずLog Analytics(Azure Monitor Logs)では、以下のクエリを
発動条件にしています。
Syslog
| where Computer == "centlog002"
| where SyslogMessage contains "critical error"
Runbookの発動をAzure MonitorのAlert ruleで指定します。
閾値は0件「より大きい」(つまり1以上)にしています。
では対象VMのcentlog002にて、「critical error」をrsyslogdへ飛ばしてみます。
logger -p authpriv.crit "web service critical error , please check"
しばらく待つとLog AnalyticsのクエリログにHITし、Azure Monitorの
Alert Ruleに引っかかり、runbook pythonが処理され、以下のような
メールが飛んできます。
各URLのレスポンス結果がメール本文に入っていますね。
もちろんすべて200 OKならメールを通知させる必要もないので
その場合はPythonの中身を自由にカスタマイズしてください。
最後に、補足です。
Webのシナリオテストを実行する、というだけなら他にもよさげな
ものがいくつかあると思います。以下はご参考まで。
1、Azure DevOpsのCI/CD機能を使う
今回は試していませんが、gitへnull commitするトリガーで
いくつかのサイトへのHTTPレスポンスを計測する、といったことも
できると思います。
2、Logic Appsを使う
以下のように組み立ててれば、簡易版のシナリオテストも
実行できました。
※ただ、確認したいURLが数百あると、1つ1つアクションを追加する
のも面倒ですし、blobに置いたURLリストをJSON形式に変換する必要
がありそうだったため、今回はこちらを使いませんでした。
3、Azure functionsで実装する
今回行ったAzure Automation Runbook pythonは、functionsで実装しても
大差ありません。お好みで選んでよいと思います。
Seleniumによる自動化のよいところは、細かいブラウザ内の制御を
自作できる部分です。
例えば以下のような記載になります。(簡単なサンプルです)
# -*- coding: utf-8 -*-driver = webdriver.Chrome(executable_path='C:\\Users\\akkoike\\AppData\\Local\\Programs\\Python\\Python37-32\\Scripts\\chromedriver.exe')
# chrome browser
driver.get('https://www.google.co.jp/')
# input keyword to textarea
driver.find_element_by_name("q").send_keys("まいくろそふと")
# search return
driver.find_element_by_name("q").send_keys(Keys.ENTER)
# click link by classname
driver.find_element_by_class_name("LC20lb").click()driver.back()
※事前にChromeドライバのダウンロードと配置、pipでseleniumを
インストール(pythonの場合)しておく必要があります。
ここではchromeブラウザを起動し、google検索フィールドに
「まいくろそふと」と入力しリターン。検索ヒットした1つ目の
リンク先をクリックし、最後に「戻る」を押す、といった簡単な
ものです。
ポップアップ認証サイトや、Basic認証以外の認証を経由した
サイトへのアクセスも含めてシナリオテストへ反映したい、という
場合なんかはSeleniumでやった方が楽な部分も多いですね。
(といっても座標指定など結構、力業な部分が多いですがw)
ただ、PythonユーザーだとMicrosoft Edgeブラウザはドライバが
提供されていませんので注意が必要です。(C#とJavaが提供中)
今回はこんなところで。