Ccmmutty logo
Commutty IT
0 pv4 min read

【Azure】VMをrunbookで休止状態(割当解除)にする

https://cdn.magicode.io/media/notebox/b39e4aa3-a300-48d6-8681-78ac6096ebe2.jpeg

概要

本記事では、runbook(poweshell)を使ってVMを休止状態にする方法をまとめていきます。

休止状態とは

休止状態はマイクロソフトのドキュメントには下記と記載されています。 https://learn.microsoft.com/ja-jp/azure/virtual-machines/hibernate-resume
休止機能では、使われていないVMを一時停止し、コンピューティングコストを節約できます。
VMを休止状態にすると、AzureはVMのオペレーティングシステムに対して、ディスクへの一時停止アクションを実行するように通知します。
Azureは、VM のメモリの内容を OS ディスクに格してから、VMの割り当てを解除します。
VMが再び起動されると、メモリの内容がOSディスクからメモリに転送されます。VMで以前に実行されていたアプリケーションとプロセスは、休止前の状態から再開されます。
VMが休止状態になるとVMの使用に対する課金は行われません。アカウントに対する課金は、VMにアタッチされているストレージ (OS ディスク、データ ディスク)とネットワークリソース (IP など) についてのみ行われます。
上記を踏まえ以下のメリットがあります。
  • 休止状態のアプリやプロセスの状態が保存されるため、停止(シャットダウン)に起動にかかる時間が短縮される
  • 休止状態中は、各種リソースが割当解除され、課金が発生しない。

runbookでVMを休止状態にする

前提条件

  1. 休止状態に対応するVMのサイズを用意する(自分は、D2asv5を使用しました。)
  • Dasv5 シリーズ
  • Dadsv5 シリーズ
  • Dsv5 シリーズ
  • Ddsv5 シリーズ
  • Easv5 シリーズ
  • Eadsv5 シリーズ
  • Esv5 シリーズ
  • Edsv5 シリーズ
  1. AutomationアカウントのマネージドIDに対して、「Virtual Machine Contributor」権限を付与する

runbook(powershell)

以下のpowershellのスクリプトでVMを休止状態にできます。
今回は休止状態の他に起動、再起動も可能な形にしました。
休止状態は、Stop-AzVM -ResourceGroupName $ResourceGroupName -Name $SessionHostName -Hibernate -Force で実施しています。
# Azure Automation Runbookで使用するPowerShellスクリプト
# VMの起動、再起動、休止状態(休止)を操作

param (
    [Parameter(Mandatory=$true)]
    [string]$ResourceGroupName,  # リソースグループ名

    [Parameter(Mandatory=$true)]
    [string]$HostPoolName,       # ホストプール名

    [Parameter(Mandatory=$true)]
    [string]$SessionHostName,    # 対象のVM名

    [Parameter(Mandatory=$true)]
    [ValidateSet("Start", "Restart", "Hibernate")]
    [string]$Action              # 実行するアクション: Start, Restart, Hibernate
)

# Azureに接続
Write-Output "Authenticating to Azure..."
Connect-AzAccount -Identity

# 対象のセッションホストの完全なリソースIDを取得
$sessionHostResourceId = "/subscriptions/$((Get-AzContext).Subscription.Id)/resourceGroups/$ResourceGroupName/providers/Microsoft.DesktopVirtualization/hostPools/$HostPoolName/sessionHosts/$SessionHostName"

Write-Output "Target Session Host Resource ID: $sessionHostResourceId"

# アクションの実行
switch ($Action) {
    "Start" {
        Write-Output "Starting session host: $SessionHostName..."
        Start-AzVM -ResourceGroupName $ResourceGroupName -Name $SessionHostName
    }
    "Restart" {
        Write-Output "Restarting session host: $SessionHostName..."
        Restart-AzVM -ResourceGroupName $ResourceGroupName -Name $SessionHostName
    }
    "Hibernate" {
        Write-Output "Putting session host into hibernation: $SessionHostName..."
        Stop-AzVM -ResourceGroupName $ResourceGroupName -Name $SessionHostName -Hibernate -Force
    }
    default {
        Write-Error "Unknown action: $Action"
    }
}

Write-Output "Action '$Action' completed for session host: $SessionHostName"

実行結果

runbookのテスト機能で実行しました。
状態が「休止状態になりました (割り当て解除済み)」になっていますね。

実行前

実行後

Discussion

コメントにはログインが必要です。