📙

複数台のAzureVMを起動停止するPowerShellコマンド

に公開

はじめに

Azureのコンソールでは、複数のVMをチェックして起動停止を行うことができます。
ですが数十台のVMから定期的に特定の数台のVMを操作する場合、チェックボックスの選択ミスのリスクが生じます。タグなどでフィルターできればよいのですが、VMに綺麗にタグ付けされていないこともあるかと思います。

そのため起動するVMを変数で定義して、コマンドで行う方法を記事にしました。

概要

  • 複数のAzureVMを一度に起動、停止できるコマンド
  • CloudShellで実行する想定
    • いずれかのサブスクリプションを操作できる権限があれば、CloudShellは動かせるようです
  • コマンドの先頭で、起動停止と対象のVMを指定
  • 同じサブスクリプションにあるVMが前提
    • 別のサブスクリプションを操作する際は、Set-AzContext -SubscriptionIdで変更します

コマンド

以下のコマンドをコピペするだけでOKです。

# 1. 実行したい操作を指定
$Action = "Stop" 
# $Action = "Start"

# 2. 操作対象のVMリストを定義
$VMList = @(
    @{Name="vm-a"; ResourceGroup="ss-a"},
    @{Name="vm-b"; ResourceGroup="ss-b"}
)

Write-Host "--- $($VMList.Count) 台のVMに対して操作を実行します ---" -ForegroundColor Cyan

foreach ($VM in $VMList) {
    $VMName = $VM.Name
    $RGName = $VM.ResourceGroup

    Write-Host "[$RGName/$VMName] に $Action を実行中..."
    
    try {
        if ($Action -eq "Start") {
            # VMを起動します。
            Start-AzVM -ResourceGroupName $RGName -Name $VMName -AsJob | Out-Null
        } elseif ($Action -eq "Stop") {
            # VMを停止 (割り当て解除) します。
            Stop-AzVM -ResourceGroupName $RGName -Name $VMName -Force -AsJob | Out-Null
        } else {
            Write-Error "無効なアクションが指定されました: $Action。 'Start' または 'Stop' を使用してください。"
            break
        }
    } catch {
        # エラーが発生した場合も、次のVMの処理を続行します
        Write-Error "[$RGName/$VMName] の操作中にエラーが発生しました: $($_.Exception.Message)"
    }
}

Write-Host "--- 全ての操作要求を送信しました ---" -ForegroundColor Cyan

起動のコマンドの場合は、以下のような結果になります。

PS /home/usera> # 1. 実行したい操作を指定
PS /home/usera> # $Action = "Stop" 
PS /home/usera> $Action = "Start"
PS /home/usera> 
PS /home/usera> # 2. 操作対象のVMリストを定義
PS /home/usera> $VMList = @(
>>     @{Name="vm-a"; ResourceGroup="ss-a"},
>>     @{Name="vm-b"; ResourceGroup="ss-b"}
>> )
PS /home/usera> 
PS /home/usera> Write-Host "--- $($VMList.Count) 台のVMに対して操作を実行します ---" -ForegroundColor Cyan
--- 2 台のVMに対して操作を実行します ---
PS /home/usera> 
PS /home/usera> foreach ($VM in $VMList) {
>>     $VMName = $VM.Name
>>     $RGName = $VM.ResourceGroup
>> 
>>     Write-Host "[$RGName/$VMName] に $Action を実行中..."
>>     
>>     try {
>>         if ($Action -eq "Start") {
>>             # VMを起動します。
>>             Start-AzVM -ResourceGroupName $RGName -Name $VMName -AsJob | Out-Null
>>         } elseif ($Action -eq "Stop") {
>>             # VMを停止 (割り当て解除) します。
>>             Stop-AzVM -ResourceGroupName $RGName -Name $VMName -Force -AsJob | Out-Null
>>         } else {
>>             Write-Error "無効なアクションが指定されました: $Action。 'Start' または 'Stop' を使用してください。"
>>             break
>>         }
>>     } catch {
>>         # エラーが発生した場合も、次のVMの処理を続行します
>>         Write-Error "[$RGName/$VMName] の操作中にエラーが発生しました: $($_.Exception.Message)"
>>     }
>> }
[ss-a/vm-a] に Start を実行中...
[ss-b/vm-b] に Start を実行中...
PS /home/usera> 
PS /home/usera> Write-Host "--- 全ての操作要求を送信しました ---" -ForegroundColor Cyan
--- 全ての操作要求を送信しました ---

おわりに

今回は複数のAzureVMを起動停止するコマンドを記事にしました。
綺麗に整理できていない環境ではGUIでの操作は危険のため、コマンドを作ってみました。
この記事がどなたかのお役に立ちましたら幸いです。

Discussion