LinuxユーザーがイジるはじめてのAzure

LinuxユーザーがAzureを使いこなせるように応援するブログです

特定のログからWebシナリオテストを自動実行する

前回の記事内容の派生形となります。

 

 

実現イメージは以下ですが、前回との変更点は赤文字/赤線の部分です。

 

f:id:akazure:20190327112808j:plain

 

変更点の補足です。

④ 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)では、以下のクエリを

発動条件にしています。

 

f:id:akazure:20190327131730j:plain

Syslog
| where Computer == "centlog002"
| where SyslogMessage contains "critical error"

 

Runbookの発動をAzure MonitorのAlert ruleで指定します。

f:id:akazure:20190327131856j:plain

 

閾値は0件「より大きい」(つまり1以上)にしています。

 

では対象VMのcentlog002にて、「critical error」をrsyslogdへ飛ばしてみます。

 

f:id:akazure:20190327150038j:plain

logger -p authpriv.crit "web service critical error , please check"

 

しばらく待つとLog AnalyticsのクエリログにHITし、Azure Monitorの

Alert Ruleに引っかかり、runbook pythonが処理され、以下のような

メールが飛んできます。

f:id:akazure:20190327150305j:plain

 

各URLのレスポンス結果がメール本文に入っていますね。

もちろんすべて200 OKならメールを通知させる必要もないので

その場合はPythonの中身を自由にカスタマイズしてください。

 

最後に、補足です。

Webのシナリオテストを実行する、というだけなら他にもよさげな

ものがいくつかあると思います。以下はご参考まで。

 

1、Azure DevOpsのCI/CD機能を使う

  今回は試していませんが、gitへnull commitするトリガーで

  いくつかのサイトへのHTTPレスポンスを計測する、といったことも

  できると思います。

 

2、Logic Appsを使う

  以下のように組み立ててれば、簡易版のシナリオテストも

  実行できました。

 

f:id:akazure:20190327151014j:plain

f:id:akazure:20190327151027j:plain

 

 ※ただ、確認したいURLが数百あると、1つ1つアクションを追加する

  のも面倒ですし、blobに置いたURLリストをJSON形式に変換する必要

  がありそうだったため、今回はこちらを使いませんでした。

 

3、Azure functionsで実装する

 今回行ったAzure Automation Runbook pythonは、functionsで実装しても

 大差ありません。お好みで選んでよいと思います。

 

4、SeleniumなどのOSSをOS内で実行する

 Seleniumによる自動化のよいところは、細かいブラウザ内の制御を

 自作できる部分です。

 例えば以下のような記載になります。(簡単なサンプルです)

 

# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
 
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が提供中)

 

今回はこんなところで。