AzureVMのメンテナンスタイミングを知る

はじめに

これまで、Azure仮想マシンの構築方法などについて、紹介してきました。本日は、VMをデプロイした後のメンテナンスに関する内容について紹介いたします。

Azureの仮想マシンのメンテナンス

下記のページに記載の通り、Azureでは、VMの再起動を必要とするメンテナンスと、再起動を必要としないメンテナンスがあります。
こちらのページの記載では、再起動を必要としないメンテナンスでも、数十秒程度、仮想マシンが一時停止する場合があります。
今回は、この一時停止を直前ではありますが、事前に知る方法についてご紹介します。

Azureのスケジュールされたイベント

Azure Metadata Serviceを用いることで、メンテナンスなどに伴う仮想マシンの一時停止や、再起動・再デプロイなどを知ることが可能です。
Azure Metadata ServiceはAzureVM内から、VMに対して実行される処理に対して知ることができるREST APIで、無料で利用することが可能です。
Windows VMの場合は、このREST APIへの処理と、LogAnalyticsの仕組みを利用することで、メンテナンス直前ではありますが、VMに行なわれる処理を通知することが可能です。

Windows VMでAzureのスケジュールされたイベントを設定してみた

ここで設定した内容は、以下のページをまとめたものです。

概要

上記ページで説明しているWindowsVMに対するスケジュールされたイベントの監視の仕組みの概略を下図に示します。
簡単には、PowerShellでポーリングして結果をApplication Evnetとして出力。Azure Monitor エージェントがこれをLogAnalyticsに転送し、AzureMonitorのアラートの仕組みを利用して通知するといったものとなります。


設定

まず設定したいVMにRDPします。
その後、VM内から、以下のGitHubページにアクセスして、PowerShellスクリプトを取得します。
実行は、ダウンロード後のスクリプトフォルダに移動して、以下の二つのコマンドを実行するだけです。
.\SchService.ps1 -Setup
.\SchService.ps1 -Start

https://github.com/microsoft/AzureScheduledEventsService/archive/master.zip

次の作業は、LogAnalyticsワークスペースにVMを接続します。
この作業は簡単で、接続したいLogAnalyticsワークスペースのメニューから、
「ワークスペースのデータソース」→「仮想マシン」を選択の上、接続するVMを選択して「接続」アイコンを選択するだけです。
その後は、LogAnalyticsワークスペースのエージェントの構成にて、WindowsのApplicationイベントログを収集する設定を入れます。これは、先ほどのPowerShellスクリプトがAzure Metadata ServiceのREST APIを定期的にアクセスして、Applicationイベントとして結果を出力してくれるからです。
設定の結果、以下のような画面になっていれば正しく設定できています。

最後は、AzureMonitorにてアラートの設定です。
設定に使うLogAnalyticsのクエリは、下記になります。

Event
 | where EventLog == "Application" and Source contains "AzureScheduledEvents" and RenderedDescription contains "Scheduled" and RenderedDescription contains "EventStatus" 
 | project TimeGenerated, RenderedDescription
 | extend ReqJson= parse_json(RenderedDescription)
 | extend EventId = ReqJson["EventId"]
 ,EventStatus = ReqJson["EventStatus"]
 ,EventType = ReqJson["EventType"]
 ,NotBefore = ReqJson["NotBefore"]
 ,ResourceType = ReqJson["ResourceType"]
 ,Resources = ReqJson["Resources"]
 | project-away RenderedDescription,ReqJson

クエリを見ると難しく見えますが、やっていることは以下となります。
その1: Applicationイベントで、AzureScheduledEventに関連するものだけを抜き出す
その2: 情報から、出力された時間と、REST APIで取得されrるResponse Body部分だけを取得
その3: ResponseBodyを整形して出力

なお、今回、実際にやってみている間に、再起動を伴わないメンテナンスを取得できなかったので、実際の検証までできていませんが、以下のように修正することで、一時停止が発生するイベントのみを取得するといったことが可能かと思います。
※なぜ一時停止だけ取得できればいいかと言うと、再起動が必要なメンテナンスは特段設定しなくてもサブスクリプションの所有者と共同管理者にはメール通知がいくからです。

Event
 | where EventLog == "Application" and Source contains "AzureScheduledEvents" and RenderedDescription contains "Scheduled" and RenderedDescription contains "EventStatus" 
 | project TimeGenerated, RenderedDescription
 | extend ReqJson= parse_json(RenderedDescription)
 | extend EventId = ReqJson["EventId"]
 ,EventStatus = ReqJson["EventStatus"]
 ,EventType = ReqJson["EventType"]
 ,NotBefore = ReqJson["NotBefore"]
 ,ResourceType = ReqJson["ResourceType"]
 ,Resources = ReqJson["Resources"]
 | where EventType == "Freeze"
 | project-away RenderedDescription,ReqJson

終わりに

コロナ禍で在宅勤務などが増えると、Azure VIrtual DesktopなどのVDIサービスの利用などが増えてくると思います。そういった際に、Azureの再起動を必要としないメンテナンスが起こり、業務中に急にVMが反応しなくなったなどのトラブルが起こることは想定されます。
何も知らずに急に止まると、人は困りますが、何が起きているかを知れれば、落ち着いた対応が可能となります。
クラウドとはいえ、どこかに物理ホストが存在する以上、メンテナンスは起こるものですので、こういったサービスをぜひ活用していきたいものです。

この記事が気に入ったらサポートをしてみませんか?