この記事は更新から24ヶ月以上経過しているため、最新の情報を別途確認することを推奨いたします。
■はじめに
指定の時間にVMが起動していない場合にアラートを送信する方法を調査しました。
その結果、下記2点を設定することで実現可能であることが分かりました。
①AzureAutomationのRunbookとスケジュールを用いて、指定の時間にVMのステータスを確認する
②AzureMonitorのアラートルールを用いて、対象のVMのステータスが起動中ではなかった場合にアラートメールを送信する
次項以降に、①②の具体的な設定方法について記載します。
■設定①AzureAutomationのRunbookとスケジュールを用いて、指定の時間にVMのステータスを確認する
1.Automationアカウント作成後、Runbookを作成し、ステータス確認スクリプトを記載します。
今回はRunbook名は”statuschecktest”とし、一例として下記スクリプトを使用していますが、
実際に設定する際には、Runbook名(スクリプト名)・VM名等は、指定したいリソース名に置き換えて設定を実施してください。
workflow statuschecktest
{
#接続の指定
$connectionName = "AzureRunAsConnection"
$servicePrincipalConnection = Get-AutomationConnection -Name $connectionName
#Azureへログオン
Connect-AzAccount -ServicePrincipal -TenantId $servicePrincipalConnection.TenantId
-ApplicationId $servicePrincipalConnection.ApplicationId
-CertificateThumbprint $servicePrincipalConnection.CertificateThumbprint
#リソースグループの指定
$ResourceGroupName = "20211110test"
#同一リソースグループ内のVM情報を取得
$VMs = Get-AzVM -ResourceGroupName $ResourceGroupName | Where-Object{$_.Name -like "*VM2022*"}
#VM起動中のステータス
$StOK = "VM running"
#確認するVMを指定
$SH = @("VM20220524","VM20220525")
#起動していないVMを確認・出力ストリームにVM名出力
foreach -parallel ($VM in $VMs) {
if($VM.Name -in ($SH)){
if(((Get-AzVM $VM.name -ResourceGroupName $ResourceGroupName
-status).Statuses[1].displayStatus) -ne $StOK){
Write-Output ($VM.name + "が起動していません。")
throw "I have some errors."
}
}
}
}
2.”1.”で設定したRunbookにて、[スケージュール]タブ > [+スケージュールの追加] > [スケージュールをRunbookにリンクします]
>[スケージュールの追加]を押下後、新しいスケージュールを設定します。
なお、スケージュールの詳細設定は、任意(VMのステータスを確認したい日時)で実施してください。
Automationで行う設定は以上になります。
これにより、対象のVMが起動していなかった場合、Runbookは”中断”で処理を終了し、
Runbookの出力ストリームには起動していなかったVMの名前が全て記載されます。
■②AzureMonitorのアラートルールを用いて、対象のVMのステータスが起動中ではなかった場合にアラートメールを送信する
1.”①”で作成したAutomation アカウントにて、[アラート(警告)]タブ > [+作成] > [アラートルール]を押下します。
2.シグナルの選択画面にて、以下を入力します。
[シグナルの種類]:メトリック
[サービスの監視]:すべて
[シグナル名]:Total Jobs
3.シグナル”Total Jobs”の詳細設定には、以下を入力します。
・1つ目のディメンション
[ディメンション名]:Runbook Name
[演算子]:=
[ディメンション値]:statuschecktest(※①で作成したRunbook名)
・2つ目のディメンション
[ディメンション名]:Status
[演算子]:=
[ディメンション値]:Suspended
・アラートロジック
[しきい値]:Static
[集計の種類]:合計
[演算子]:次の値より大きい
[単位]:カウント
[しきい値]:0
[確認する間隔]:1分
[次の時間分の過去データを参照]:5分
4.アクションタブにてアクショングループの作成を押下後、通知設定画面にてアラートを送信したいメールアドレスを設定します。
5.詳細タブにて、以下を入力します。
[サブスクリプション]:※任意
[リソースグループ]:※任意
[重要度]:※任意
[アラートルール名]:※任意
[アラートルールの説明]:※任意
6.確認および作成を押下し、アラートルールを作成します。
AzureMonitorで行う設定は以上になります。
これにより、対象のVMが1台でも起動していなかった場合、
Runbookがスケージュールされた時間から約10分後にアラートメールが送信されます。
■注意事項
メトリックアラートの仕様により、下記2通のアラートメールが送信されます。
1件目:Your Azure Monitor alert was triggered
2件目:Your Azure Monitor alert was resolved
※2件目のアラートルールは”resolved”と記載がありますが、VMのステータスが停止から起動に変わったことを通知するものではありません。
■おわりに
本ブログでは、指定の時間にVMが起動していない場合にアラートを送信する設定方法について記載しましたが、
スクリプト内で、未起動のVMに対しVMを起動するコマンドを追加することで、再起動等の対応も可能かと思います。
これらの設定をすることで、何らかの理由でVMが起動しなかった場合も早急に検知・対応することが出来ます。