PowerShellでAzure VMの自動シャットダウン設定を一括管理する方法
Azure Virtual Machinesの自動シャットダウン機能は、コスト削減の重要な手段です。しかし、多数のVMを管理する環境では、各VMのシャットダウン設定を手動で確認するのは非効率的です。本記事では、PowerShellを使用してAzure VMの自動シャットダウン設定を一括で取得し、データベースに格納する方法を紹介します。
Azure portalでも個別のVM設定は確認できますが、大規模な環境では運用効率が課題となります。PowerShellとAzure REST APIを活用することで、自動化された統合管理が可能になります。
前提条件
- Azure PowerShellモジュール(Az)がインストール済み
- Azure サブスクリプションへの読み取り権限
- PowerShell 5.1 以上
- Azure VMsに対する適切なアクセス権限
基本的な実装
1. Azure認証とリソース取得
まず、Azure に接続し、管理対象のVMリソースを取得します。
# Azure PowerShellモジュールを使用してAzureに接続
# Connect-AzAccount # 必要に応じて認証
# 全ての仮想マシンリソースを取得
$Vms = Get-AzResource -ResourceType Microsoft.Compute/virtualMachines
# 自動シャットダウンスケジュール一覧を取得
# Azure VMの自動シャットダウンはDevTestLabのリソースとして管理される
$ShutdownSchedules = Get-AzResource -ResourceType Microsoft.DevTestLab/schedules
Write-Host "対象VM数: $($Vms.Count)"
Write-Host "シャットダウンスケジュール数: $($ShutdownSchedules.Count)"
ポイント: Azure VMの自動シャットダウン機能は、内部的に Microsoft.DevTestLab/schedules
リソースとして実装されています。このリソースタイプを使用することで、設定情報にアクセスできます。
2. シャットダウン設定の解析とデータ変換
自動シャットダウンスケジュールの詳細情報を取得し、使いやすい形式に変換します。
# 自動シャットダウン設定を格納するハッシュテーブル
$AutoShutdownSettings = @{}
foreach ($ShutdownSchedule in $ShutdownSchedules) {
# スケジュールの詳細プロパティを取得
$ShutdownProperties = (Get-AzResource -ResourceType Microsoft.DevTestLab/schedules -ResourceGroup $ShutdownSchedule.ResourceGroupName -Name $ShutdownSchedule.Name).Properties
# スケジュールが有効な場合のみ処理
if ($ShutdownProperties.status -eq 'Enabled') {
# 時刻フォーマットをHHmm形式からHH:mm:ss形式に変換
$dailyRecurrenceTime = $ShutdownProperties.dailyRecurrence.time
if ($dailyRecurrenceTime -match '^(\d{2})(\d{2})$') {
$shutdownTime = "$($Matches[1]):$($Matches[2]):00"
# VMのリソースIDをキーとして時刻を保存
$AutoShutdownSettings[$ShutdownProperties.targetResourceId] = $shutdownTime
}
}
}
Write-Host "自動シャットダウン有効VM数: $($AutoShutdownSettings.Count)"
技術的解説: Azure APIから取得される時刻データは「1800」のようなHHmm形式です。正規表現を使用して「18:00:00」のような標準的な時刻形式に変換することで、データベースやレポートで扱いやすくなります。
3. VM情報と設定のマッピング
各VMに対してシャットダウン設定の有無を確認し、統合された情報を作成します。
# 処理結果を格納する配列
$VmShutdownInfo = @()
foreach ($vm in $Vms) {
$shutdownTime = $null
# 該当VMに自動シャットダウン設定があるかチェック
if ($AutoShutdownSettings.ContainsKey($vm.ResourceId)) {
$shutdownTime = $AutoShutdownSettings[$vm.ResourceId]
}
# VM情報とシャットダウン設定を統合
$vmInfo = [PSCustomObject]@{
VMName = $vm.Name
ResourceGroup = $vm.ResourceGroupName
ResourceId = $vm.ResourceId
Location = $vm.Location
ShutdownTime = $shutdownTime
HasAutoShutdown = ($null -ne $shutdownTime)
}
$VmShutdownInfo += $vmInfo
Write-Host "$($vm.Name) - シャットダウン時刻: $(if($shutdownTime){"$shutdownTime"}else{"未設定"})"
}
4. 結果の出力と活用
取得した情報をCSVファイルとして出力し、管理用途に活用します。
# 結果をCSVファイルに出力
$outputPath = "Azure-VM-AutoShutdown-Report.csv"
$VmShutdownInfo | Export-Csv -Path $outputPath -NoTypeInformation -Encoding UTF8
# 集計情報の表示
$enabledCount = ($VmShutdownInfo | Where-Object { $_.HasAutoShutdown }).Count
$totalCount = $VmShutdownInfo.Count
Write-Host "`n=== 集計結果 ==="
Write-Host "総VM数: $totalCount"
Write-Host "自動シャットダウン有効: $enabledCount"
Write-Host "自動シャットダウン無効: $($totalCount - $enabledCount)"
Write-Host "レポート出力先: $outputPath"
完全なサンプルスクリプト
以下は実際に動作する統合されたスクリプトです:
<#
.SYNOPSIS
Azure VMの自動シャットダウン設定を一括取得してレポート化
.DESCRIPTION
Azure上の全仮想マシンの自動シャットダウン設定を取得し、
CSV形式のレポートを生成します。
.PARAMETER OutputPath
出力するCSVファイルのパス
.EXAMPLE
PS> .\Get-AzureVmAutoShutdownReport.ps1 -OutputPath "vm-shutdown-report.csv"
#>
param(
[string]$OutputPath = "Azure-VM-AutoShutdown-Report.csv"
)
$ErrorActionPreference = 'Stop'
try {
Write-Host "Azure VM自動シャットダウン設定の取得を開始します..."
# 1. Azureリソースの取得
Write-Host "Azureリソース情報を取得中..."
$Vms = Get-AzResource -ResourceType Microsoft.Compute/virtualMachines
$ShutdownSchedules = Get-AzResource -ResourceType Microsoft.DevTestLab/schedules
Write-Host "対象VM数: $($Vms.Count)"
Write-Host "シャットダウンスケジュール数: $($ShutdownSchedules.Count)"
# 2. 自動シャットダウン設定の解析
Write-Host "シャットダウン設定を解析中..."
$AutoShutdownSettings = @{}
foreach ($ShutdownSchedule in $ShutdownSchedules) {
$ShutdownProperties = (Get-AzResource -ResourceType Microsoft.DevTestLab/schedules -ResourceGroup $ShutdownSchedule.ResourceGroupName -Name $ShutdownSchedule.Name).Properties
if ($ShutdownProperties.status -eq 'Enabled') {
$dailyRecurrenceTime = $ShutdownProperties.dailyRecurrence.time
if ($dailyRecurrenceTime -match '^(\d{2})(\d{2})$') {
$shutdownTime = "$($Matches[1]):$($Matches[2]):00"
$AutoShutdownSettings[$ShutdownProperties.targetResourceId] = $shutdownTime
}
}
}
# 3. VM情報とシャットダウン設定のマッピング
Write-Host "VM情報を統合中..."
$VmShutdownInfo = @()
foreach ($vm in $Vms) {
$shutdownTime = $null
if ($AutoShutdownSettings.ContainsKey($vm.ResourceId)) {
$shutdownTime = $AutoShutdownSettings[$vm.ResourceId]
}
$vmInfo = [PSCustomObject]@{
VMName = $vm.Name
ResourceGroup = $vm.ResourceGroupName
ResourceId = $vm.ResourceId
Location = $vm.Location
ShutdownTime = $shutdownTime
HasAutoShutdown = ($null -ne $shutdownTime)
Tags = ($vm.Tags | ConvertTo-Json -Compress)
}
$VmShutdownInfo += $vmInfo
}
# 4. 結果の出力
Write-Host "レポートを出力中..."
$VmShutdownInfo | Export-Csv -Path $OutputPath -NoTypeInformation -Encoding UTF8
# 5. 集計情報の表示
$enabledCount = ($VmShutdownInfo | Where-Object { $_.HasAutoShutdown }).Count
$totalCount = $VmShutdownInfo.Count
Write-Host "`n=== 処理完了 ==="
Write-Host "総VM数: $totalCount"
Write-Host "自動シャットダウン有効: $enabledCount ($([math]::Round($enabledCount / $totalCount * 100, 1))%)"
Write-Host "自動シャットダウン無効: $($totalCount - $enabledCount)"
Write-Host "レポート出力先: $OutputPath"
} catch {
Write-Error "処理中にエラーが発生しました: $($_.Exception.Message)"
exit 1
}
ポイント(まとめ)
技術的なメリット
- 効率的な一括処理: Azure PowerShellモジュールを活用して大量のVMを効率的に処理
- データ形式の標準化: APIから取得した時刻データを標準的なフォーマットに変換
- リソースタイプの理解: Azure VMの自動シャットダウンが DevTestLab リソースとして実装されている点を活用
活用例
運用コスト最適化
- 自動シャットダウン未設定のVMを特定してコスト削減機会を発見
- シャットダウン時刻の分散状況を把握してリソース利用の最適化
コンプライアンス管理
- 組織のポリシーに従った自動シャットダウン設定の一括監査
- 定期的なレポート生成による継続的な監視
運用自動化の基盤
- このスクリプトを基盤として、設定変更の自動化やアラート機能を追加可能
- Azure Automation や GitHub Actions と組み合わせた定期実行の実現
この技術を応用することで、Azure環境の運用効率向上とコスト最適化を同時に実現できます。