Azure VMの状態と課金状況の関連から割り当て解除忘れ対策まで

2020-06-07Azure,PowerShell/Azure CLI,Virtual Machine

仮想マシン(Azure VM)の電源(起動)状態、ステータス、課金発生状態を整理してみました。
割り当て解除忘れにより課金が発生している仮想マシンを一覧出力、停止するPowerShellも紹介しています。

仮想マシンを止めたつもりなのに課金が発生しているケースがありました。
仮想マシンの電源(起動)状態が割り当て解除済みではなく停止になっていたためでした。

そういう事もあったので仮想マシンの電源(起動)状態について確認してみました。
あわせて無駄な課金が発生してる仮想マシンの一覧を取得、停止するためのPowerShellも作ってみました。

スポンサーリンク

仮想マシンの電源(起動)状態や課金との関連

仮想マシンの電源(起動)状態と課金発生の関連

Azure Virtual Machines の状態と課金状態

Azure上の仮想マシンはOSをシャットダウンしただけでは課金が停止しません。
仮想マシン自体を停止する必要があります。

仮想マシンの電源(起動)状態には、仮想マシン自身の起動状態とOSの起動状態という2つの考え方があります。

    • 仮想マシンを開始(電源ON) 1→3
    • OSでシャットダウンコマンド発行 3→5
    • 仮想マシンを停止(電源Off) 5→7

Azure PortalなどでOS起動状態のまま仮想マシンを停止した場合は3→7になります。

OSでシャットダウンコマンドを発行した場合OSは停止するのですが、仮想マシンのリソース解放はされてない状態(OS停止、VM起動)になります。
その為、仮想マシンに対する課金が継続します。

  仮想マシンの状態 起動状況 ステータス 課金状況 
1 停止済み(割り当て解除) VM停止済み
OS停止済み
VM deallocated 課金されない
2 起動中 VM起動中
OS起動中
VM starting 課金される
3 起動済み VM起動済み
OS起動済み
VM running
4 停止中 VM起動済み
OS停止中
VM stopping
5 停止済み VM起動済み
OS停止済み
VM stopped
6 停止中(割り当て解除中) VM停止処理中
OS停止中
VM deallocating 課金されない
7 停止済み(割り当て解除) VM停止済み
OS停止済み
VM deallocated

Azure Portalで仮想マシンの電源(起動)状態を確認

Azure Portalで仮想マシンの電源(起動)状態を確認してみました。
仮想マシンの電源(起動)状況は状態に表示されます。

起動から停止までのステータス(電源状態)
仮想マシンが完全に停止した状態
(1の状態で課金は発生していません)
Azure Portalの画面(停止済み(割り当て解除))
仮想マシンが起動中の状態
(2の状態で課金は発生しています)
Azure Portalの画面(停止済み(開始中))
仮想マシンが起動完了した状態
(3の状態で課金は発生しています)
Azure Portalの画面(実行中)
OSのみが停止(シャットダウン)している状態
(5の状態で課金発生しています)
Azure Portalの画面(停止済み)
仮想マシンを停止中の状態
(6の状態で課金は停止しています)
Azure Portalの画面(割り当て解除中)
仮想マシンが完全に停止した状態
(1の状態で課金は発生していません)
Azure Portalの画面(停止済み(割り当て解除))

仮想マシンの電源(起動)状態をPowerShellで確認する場合はGet-AzVM -Status

PowerShellで仮想マシンの電源(起動)状態を確認する場合はGet-AzVMコマンドレットを使用します。
Get-AzVM -statusのステータス(PowerState)が仮想マシンの電源(起動)状態を表します。

仮想マシン名とそのステータス(PowerState)のみを取得する場合の例を示します。
ftオプションを利用して実行結果で表示される内容を仮想マシン名とステータス(電源状態)に絞ってます。

※仮想マシン名を指定した場合はPowerStatではなくStatusesにあるCode(もしくはDisplayStatus)が電源状態を表します。

#見れるVMのすべての電源状態を見る場合

PS> Get-AzVM -Status |ft Name,PowerState

Name PowerState
—- ———-
VM1 VM deallocated
VM2 VM deallocated

#リソースグループを指定してVMの電源状態を見る場合

PS> Get-AzVM -Status -ResourceGroupName “リソースグループ名" |ft Name,PowerState

#仮想マシンを指定してVMの電源状態を見る場合

PS> Get-AzVM -Status -ResourceGroupName “リソースグループ名" -name “VM名" |ft Name,@{Name="VmStatus"; Expression={$_.Statuses.Code}}

Name VmStatus
—- ——–
VM名 {ProvisioningState/succeeded, PowerState/deallocated}

仮想マシンの起動停止に使うAzure CLIやPowerShellについてはこちらに纏めています。
起動停止の一連のコマンド(コマンドレット)実行やステータス確認も紹介しています。

Azure Logic Apps(ロジックアプリ)を使った仮想マシンの起動停止についてはこちらに纏めています。
ノーコードで仮想マシンの起動停止をスケジュール化して実行する手順をまとめてます。

無駄な課金が発生してる仮想マシンの一覧を取得、停止

仮想マシンの課金が発生し続ける事態を防ぐためには以下の対応が必要になります。

      • OSのみがシャットダウンされた仮想マシン一覧を取得
      • 取得した仮想マシンを停止(割り当て解除)

OSのみがシャットダウンされている仮想マシンはステータス(PowerState)が “VM Stoppe”になっています。
ステータス(PowerState)が “VM Stoppe”の仮想マシンをPowerShellで取得してみます。
併せて取得した仮想マシンを停止をするようにしています。

PowerShell内ではStop-AzVMに-Forceのパラメータを追加しています。
これにより仮想マシン停止時の確認メッセージが表示されないようにしています。
またvmstoporcheckの変数で仮想マシンのリスト取得のみか停止まで実行するかを選択できるようにしています。

#VM 割り当て解除忘れ漏れ対策 PowerShell
#リソースグループを指定(指定しない場合は下記3行をコメントアウトします。)

param (
        [string] [Parameter(Mandatory=$true)]  $ResourceGroupName
      )

#停止時は1、確認のみの場合は0を選択
$vmstoporcheck=0

#VMの状態を取得
    $vmstat = (Get-AzVM -Status `
    | Select-Object ResourceGroupName,Name,PowerState `
    | Where-Object { $_.PowerState -eq “VM Stopped" } )

#リソースグループを指定する場合
    foreach ($vmstatus in $vmstat | Where-Object {$_.ResourceGroupName -eq $ResourceGroupName })

#リソースグループを指定しない場合
#   foreach ($vmstatus in $vmstat)

{
    if($vmstoporcheck -eq 1){
  
        Write-Host “Stop VM Name: $($vmstatus.Name)"
        Stop-AzVM -ResourceGroupName $vmstatus.resourceGroupName -Name $vmstatus.Name -Force
    
    }else{

        Write-Host “Stop VM Name: $($vmstatus.Name)"

    }
}

※仮想マシンを意図的にOSのみシャットダウンされているケースもあるかと思います。実際の使用状況に合わせて注意してください。

仮想マシン停止時にディスクタイプを変更するPowerShellも作っております。
こちらも見て頂ければと。

電源(起動)状態だけではなく仮想マシンのIPアドレスやディスク情報も一緒に取得するPowerShellはこちらで紹介しています。

仮想マシン起動停止時のアクティビティログに関してはこちらで紹介しています。

最後に

仮想マシンを止めたつもりなのに課金を発生させてしまいお支払いに影響を出してしまった事がありました。
これはAzure上の仮想マシンのOSをシャットダウンさせただけで課金が止まると勘違いしていたためでした。

そういうミスしてしまった事もあったので仮想マシンの電源(起動)状態や、電源状態を確認するPowerShellも確認整理してみました。
なお、Bシリーズの仮想マシンでは割り当て解除まで実行してしまうとクレジットがクリアされてしまいます。
その点については注意が必要です。

スポンサーリンク