かつて山市良と呼ばれたおじさんのブログ

セイテクエンジニアのブログ  かつて山市良と呼ばれたおじさんのブログ  メモ. Azure VMの状態を一覧表示するPowerShellスクリプト

 

 

メモ. Azure VMの状態を一覧表示するPowerShellスクリプト

2026年01月23日配信
執筆者:山内 和朗

 以下の連載記事では、Azure REST APIを使用してPowerShellスクリプトでAzure仮想マシン(VM)の一覧を取得する方法を紹介しました。Azure VMの一覧を取得したら、その情報を使ってVMの状態(実行中、停止中、割り当て解除など)を取得するPowerShellスクリプトを作成したので共有します。

 

vol.56 はじめてのAzure REST API|Azure&Entra IDスクリプト大作戦(3)
vol.60 Azure REST APIサンプルスクリプト強化版|Azure&Entra IDスクリプト大作戦(7)

無駄な課金を回避するため、Azure VMの状態をすばやく確認したい

 

 私は、評価用のWindows Serverマシンの状態を毎朝すばやく確認できるように、イベントログに新たに記録された重要なイベントや、特定のHyper-V VMで実行中のサービスの実行状態、運用自動化のためのスケジュールタスクの実行状態、ローカルおよびクラウドバックアップの実行状態をレポートするPowerShellスクリプトを作成し、利用しています。その一貫として、Azure VMの実行状態も確認できるようにしました(画面1)。後で説明する「azurevmreport.ps1」です。

 

 画面1 検証用サーバーの稼働状況をレポートするPowerShellスクリプトに、Azure VMの状態をレポートするスクリプトを追加
画面1 検証用サーバーの稼働状況をレポートするPowerShellスクリプトに、Azure VMの状態をレポートするスクリプトを追加

 Azure VMは評価用にのみ使用しているため、普段は割り当て解除状態で無駄な課金の発生を回避しています。Azure VMの状態は、Azureポータルの「コンピューティング インフラストラクチャ | 仮想マシン」の一覧で確認できます。コマンドラインから確認する方法としては、Azure PowerShellやAzure CLIを使用する方法があります(画面2)。Azureポータルの表示が最新でなく、割り当て解除のつもりが実行中または停止中のまましばらく放置していたことがこれまで何度かありました。また、Azure PowerShellやAzure CLIを利用するには、それらのコンポーネントがローカルにインストールされているか、Azure Cloud Shellを使用する必要があり、いつでも、どこでも利用できるわけではありません。毎日の稼働状況確認レポートに、Azure VMの状態確認を含めれば、少なくとも1日以上割り当て解除しないまま放置してしまう危険は回避できます。

 

画面2 Azureポータル、およびAzure Cloud ShellのAzure PowerShell(Get-AzVM -Status)やAzure CLI(az vm show・・・)を使用したAzure VMの状態の取得
画面2 Azureポータル、およびAzure Cloud ShellのAzure PowerShell(Get-AzVM -Status)やAzure CLI(az vm show・・・)を使用したAzure VMの状態の取得

 Azure REST APIを利用すれば、利用環境に影響を受けることなく、どこでも利用可能な方法でVMの状態を取得できます。「azurevmreport.ps1」は、PowerShell(Windows PowerShell 5.1またはPowerShell 7.x)で実行することができ、Microsoft Entra IDのアプリ登録を利用するため、対話的な認証なしで利用できます。スクリプトの前半は、「vol.56 はじめてのAzure REST API」で紹介したスクリプトとほとんど同じです。Entra IDへのアプリ登録の方法や接続に必要な情報(クライアントID、クライアントシークレット、サブスクリプションID、テナントID)の取得方法については、「vol.56 はじめてのAzure REST API」の記事を参照してください。

[azurevmreport.ps1]プレーンテキストで表示)

Write-Host
Write-Host "[情報]Azure VM の状態" -ForeGroundColor Cyan

Write-Host

# アクセストークンの取得
$clientid = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
$clientsecret = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
$subscriptionid = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
$tenantid = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
$resource = "https://management.azure.com/"
$tokenendpoint = "https://login.microsoftonline.com/$tenantid/oauth2/token"
$body = @{
grant_type = "client_credentials"
resource = $resource
client_id = $clientid
client_secret = $clientsecret
}
$tokenresponse = Invoke-RestMethod -Method Post -Uri $tokenendpoint -Body $body -ContentType "application/x-www-form-urlencoded"
$accesstoken = $tokenresponse.access_token

# Azure VMの一覧
# Azure REST API: Virtual Machines - List
# https://learn.microsoft.com/en-us/rest/api/compute/virtual-machines/list
# GET https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Compute/virtualMachines?api-version=2025-04-01

$headers = @{
'Authorization' = "Bearer $accesstoken"
'Content-Type' = 'application/json'
}
$requesturi = "https://management.azure.com/subscriptions/$subscriptionid/providers/Microsoft.Compute/virtualMachines?api-version=2024-07-01"
$ret = (Invoke-RestMethod -Uri $requesturi -Headers $headers -Method Get)
$vms = $ret.value | ForEach-Object {
[pscustomobject]@{
Name = $_.name
id = $_.id
}
}

# VMの状態の取得
# Azure REST API: Virtual Machines - Instance View
# https://learn.microsoft.com/en-us/rest/api/compute/virtual-machines/instance-view
# GET https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Compute/virtualMachines/{vmName}/instanceView?api-version=2025-04-01

$results = foreach ($vm in $vms) {

$requesturi = "https://management.azure.com$($vm.id)/instanceView?api-version=2025-04-01"
$ret = Invoke-RestMethod -Uri $requesturi -Headers $headers -Method Get

$ps = $ret.statuses | Where-Object { $_.code -like 'PowerState/*' } | Select-Object -First 1

[pscustomobject]@{
Name = $vm.Name
PowerState = $ps.code
DisplayStatus= $ps.displayStatus
}
}

$results

 スクリプトではまず、アクセストークンを取得し、その後、以下のAPIを使用してAzure VMの一覧を取得しています。「vol.56 はじめてのAzure REST API」では取得結果をJSON形式のファイルに出力しましたが、今回はリソース名(name)つまりVM名とリソースID(id)の一覧を取得し、$vms変数に格納しました(画面3)。

Virtual Machines - List|Azure (Microsoft Learn)

画面3 Virtual Machines - List APIからリソース名(VM名)とリソースIDの一覧を取得
画面3 Virtual Machines - List APIからリソース名(VM名)とリソースIDの一覧を取得

 スクリプトの後半では、以下のAPIを使用して、各VMのリソース名とリソースIDの値を使用して、Statuses.Codeに「PowerState/」を含むものを取得し、その表示(Statuses.DisplayStatus)をVM名とともに返すようにしています。このAPIのリクエストURIの一部は完全にリソースIDと一致するため(GET https://management.azure.com<リソースID>/instanceView?api-version=2025-04-01)、かなり簡潔に記述できました(画面4)。

Virtual Machines - Instance ViewVirtual Machines - Instance View|Azure (Microsoft Learn)

画面4 各VMについて、Virtual Machines - Instance View APIのリクエストURIを作成して送信し、VMの状態を取得する
画面4 各VMについて、Virtual Machines - Instance View APIのリクエストURIを作成して送信し、VMの状態を取得する

 

blog_yamanxworld_subscribe

blog_yamanxworld_comment

blog_yamanxworld_WP_ws2025

最新記事