みち草

Azure中心にまとめる技術情報ブログ

実行コマンドで Windows VM の Scheduled Events 監視を設定する

はじめに

Microsoft の公式ドキュメントでは、Windows Azure VM で Scheduled Event を監視するためのセットアップが紹介されています。

GitHub に公開されている zip をダウンロード、解凍、スクリプト実行するだけで Application のイベントログに出力してくれるというもので、 自分でスクリプトを作成しなくてよい分非常に簡単です。

しかし、個々の VM に接続してこれを実行していくのは手間がかかるため、実行コマンドを用いてまとめて設定する方法を試しました。

この記事は Windows Azure VM 向けですが、以前に Linux VM で試したのはこちら。

www.michikusayan.com

目次

実行コマンド

実行コマンドとは

実行コマンドは Azure VM の機能であり、エージェント経由でスクリプトを実行することができます。

ログインなしで VM 内でのコマンド実行ができるため、単発でちょっと動かしたいときに便利です。

learn.microsoft.com

コマンドから実行する場合、実行コマンドの種類としてアクション実行コマンドとマネージド実行コマンドがあり、今はマネージド実行コマンド (Set-AzVMRunCommand) を使うのがよいようです。

jpaztech.github.io

実行コマンド用のスクリプト作成

今回はこの機能を使って、次のドキュメントに記載されている手順を実行させます。

learn.microsoft.com

やるのは次のステップ

  1. GitHub から zip をダウンロード
  2. zip を解凍
  3. スクリプトを -Setup で実行
  4. スクリプトを -Start で実行

URL を指定したダウンロードは、Invoke-WebRequest を使えば PowerShell でも可能です。

ダウンロード先は、C:\Temp\AzureScheduledEventsService としており、なければ作成してくれます。

ということで実行コマンドでの設定用スクリプトがこちら。

$folder = "C:\Temp\AzureScheduledEventsService"
$url = "https://github.com/microsoft/AzureScheduledEventsService/archive/master.zip"
$zipPath = Join-Path $folder "master.zip"
$extractRoot = $folder
$scriptPath = Join-Path $folder "AzureScheduledEventsService-master\Powershell\SchService.ps1"
 
if (-not (Test-Path $folder)) {
    New-Item -Path $folder -ItemType Directory | Out-Null
}
 
Invoke-WebRequest -Uri $url -OutFile $zipPath -UseBasicParsing
 
if (Test-Path (Join-Path $folder "AzureScheduledEventsService-master")) {
    Remove-Item -Recurse -Force -Path (Join-Path $folder "AzureScheduledEventsService-master")
}
 
Add-Type -AssemblyName System.IO.Compression.FileSystem
[System.IO.Compression.ZipFile]::ExtractToDirectory($zipPath, $extractRoot)
 
powershell -ExecutionPolicy Bypass -File $scriptPath -Setup
powershell -ExecutionPolicy Bypass -File $scriptPath -Start
 

実行コマンドの利用

上のスクリプトは、Azure ポータルから直接実行することもできます。

その場合、Azure VM のメニューから [操作] - [実行コマンド] を選択して、一番上の [RunPowerShellScript] を選択します。

そしたらエディターにスクリプトを貼り付けて実行すれば OK です。

実行中は [スクリプトを実行しています…] という表示があり、実行ボタンが押せません。

終わると [スクリプト実行が完了しました] に変わり、実行ボタンがまた押せるようになります。

しかし、このスクリプトだと出力が何も返ってこなかったので、その辺は何か状態を確認する一文を入れてもいいかも。

動作確認

これで、解凍した奥底にある ps1 ファイルを使ってセットアップしてくれます。

VM にログインしてみると、期待したパスに展開されています。

イベントログで、スクリプトがスタートしていることも確認できます。

うまくできているか確認するにはメンテナンスを待てないので、Azure ポータルから対象 VM を再起動 or 停止/起動 して再度イベントログを確認しましょう。手動操作でも Scheduled Events に載ります。

イベントが記録された後に StartRequests も記録されているため、保留にせず即時開始する仕組みも含まれているようです。

複数の対象にまとめて適用する

単体の VM に対して設定するのであれば先の手順で問題ありませんが、複数台にまとめて設定したい場合もあるでしょう。

その場合には、PowerShell スクリプトでループさせて実行コマンドを実行するのがよいかと思います。

準備として、2 つのスクリプトを作ります。

  • install-schservice.ps1
  • set-schmonitoring.ps1

install-schservice.ps1 については、先ほどの実行コマンド用スクリプトをそのまま .ps1 として保存します。

set-schmonitoring.ps1 は、VM 毎に実行コマンドをキックするスクリプトです。

Set-AzVMRunCommand を対象 VM に対して 1 台ずつループして実行すればいいので、set-schmonitoring.ps1 はこんな感じです。

$resourceGroup = "RG 名"
$vms = Get-AzVM -ResourceGroupName $resourceGroup |
    Where-Object { $_.StorageProfile.OSDisk.OSType -eq 'Windows' } |
    Select-Object Name, Location

$scriptPath = "install-schservice.ps1 への絶対パス"

foreach ($vm in $vms) {
    Set-AzVMRunCommand `
        -ResourceGroupName $resourceGroup `
        -VMName $vm.Name `
        -Location $vm.Location `
        -RunCommandName 'RunPowerShellScript' `
        -ScriptLocalPath $scriptPath
}

対象 RG 内の Windows VM すべてに対して実行するようになっています。
対象 VM が停止していると失敗するため、実際に利用するのであれば起動状態の確認処理は入れた方がよいです。

これで複数台への設定も簡単です。

終わりに

途中にも書いたとおり、ちょっとしたコマンドを実行するのであればログイン不要な実行コマンドは便利です。設定確認のコマンドとか、設定を変えるコマンドとかとか。

Scheduled Event については、Windows VM であれば公式セットアップファイルが GitHub で提供されていますが、Linux 向けには公開されていません。

Linux VM でも実行コマンドは使えるので、同じようにセットアップするスクリプトとキックするスクリプトを用意すればそっちもいい感じにできそうではありますね。