0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PowerShellでAzure VMの自動シャットダウン設定を一括管理する方法

Posted at

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環境の運用効率向上とコスト最適化を同時に実現できます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?