Azure VMステータス(電源状況)と課金状況と割り当て解除忘れ対策

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

 Azure Virtual Machine(VM)を止めたつもりなのに課金が発生しているケースがありました。
 VMのステータス(電源状況)が割り当て解除済みではなく停止になっていた為課金が継続していた為でした。

 そこでAzure VMのステータス(電源状況)と課金状況の一覧を整理してみました。また割り当て解除防止のために、VMの割り当て解除忘れにより課金が発生しているVMを一覧出力して停止するPowerShellを作ってみました。

スポンサーリンク

Azure VMのステータス(電源状況)と課金状況一覧

 Azureを触り始めて最初の頃に非常に戸惑ったのですが、AzureのVMではOSでシャットダウンコマンドを発行しても課金が停止しません。

 VMの起動状態には、大きく分けてVM自体の起動状態とOSの起動状態という2つの考え方があります。

 電源ON、OS停止、電源オフという流れを具体的に書くとこんな感じになります。

    • 電源ON(Azure Portalで開始をクリックする) 1→3
    • OSでシャットダウンコマンド発行 3→5
    • 電源Off(Azure Portalで停止をクリックする) 5→7
  VMの状態 状態 PowerState 課金

1

停止済み(割り当て解除)

電源Off VM deallocated 課金されない
2 起動中 VM、OS起動中 VM starting 課金される
3 起動済み OS起動済み VM running 課金される
4 停止中 OS停止中 VM stopping 課金される
5 停止済み OS停止 VM stopped 課金される

6

停止中(割り当て解除中)

VM停止中 VM deallocating 課金される

7

停止済み(割り当て解除)

電源Off VM deallocated 課金されない

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

Azure PortalでAzure VMのステータス(電源状態)を確認する

 最初にAzure PortalでVMの電源状態を確認してみました。VMのメニューの概要(VMを選択すると一番最初に表示される画面)の状態が電源状態を示すます。

 1) VMが完全に停止している状態(1の状態)(課金が発生しない状態)

 

 2) VMが実行されている状態(3の状態)

 

 3) OSのみがシャットダウンしている状態(5の状態)(課金が発生している状態)

 

 また、Virtual Machinesのメニューでも一覧で確認する事ができます。

Azure VMの起動停止方法を確認してみる

 VMの起動停止はAzure PortalやAzure PowerShellを使って出来ます。今回のAzure PortalやPowerShellを使って実施する電源On Offは通常のパソコンでいうと電源ボタンになります。OSだけのシャットダウンは基本的にOS上で実施する必要があります。

  Azure Portal Azure PowerShell
仮想マシン電源On

開始ボタンをクリック

PS> Start-AzVM -ResourceGroupName “リソースグループ名" -Name “VM名"

仮想マシン電源Off

停止ボタンをクリック

PS> Stop-AzVM -ResourceGroupName “リソースグループ名" -Name “VM名" -Force

※- Forceをつける事で確認メッセージをスキップする事が出来ます。

再起動

再起動ボタンをクリック

PS> Restart-AzVM -ResourceGroupName “リソースグループ名" -Name “VM名" -Force

※- Forceをつける事で確認メッセージをスキップする事が出来ます。

Azure VM起動停止時のアクティビティログ等についてはこちら。

PowerShellを使ってVMのステータス(電源状態)を確認する場合はGet-AzVM -Status

 PowerShellでVMのステータス(電源状態)を確認する為にはGet-AzVM コマンドを利用します。

 Get-AzVM -statusのPowerStateが電源状態に対応します。但しVM名を指定した場合はPowerStatではなくStatusesにあるCode(もしきはDisplayStatus)が対応します。

 VM名とVMのステータス(電源状態)のみを取得する場合の例を示します。
 ftによりコマンド実行結果で表示される内容をVM名(Name)と電源状態(PowerState)に絞ってます。(VM指定時は電源状態(Statuses.Code)になります。)

#見れる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 VM起動停止についてはこちらで纏めています。

VMの電源状態を取得して電源オフにするPowerShell(無駄な課金が発生してるVMの一覧を取得する)

 VMの課金が発生し続ける事態を防ぐためには、OSのみがシャットダウンされている状態のVM一覧を取得し停止する事が必要になります。

 OSのみがシャットダウンされているVMはPowerState が “VM Stoppe”になっているVMになります。

 そこでPowerState が “VM Stoppe”の一覧取得しPowerShellで実施してみました。併せてVM停止をするようにしています。

    • #VMの状態を取得部分で、PowerState が “VM Stopped"の一覧を取得しています。
    • リソースグループを指定して実施するようにしています。
    • $vmstoporcheckを指定する事で、確認のみか停止するかを選択できるようにしています。
    • Stop-AzVMに-Forceをつける事で停止時の確認メッセージが表示されないようにしています。

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

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

#確認のみの場合は0を選択する
$vmstoporcheck=1

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

#RGを指定する場合
    foreach ($vmstatus in $vmstat | Where-Object {$_.ResourceGroupName -eq $resourceGroupName })

#RGを指定しない場合
#   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)"

    }
}

 作成したPowerShellはGitHubにも公開しています。
 VMのPowerState が “VM Stopped"になっていても、意図的にその状態で置かれているケースもあるかと思います。実際の使用状況に合わせて注意してご利用ください。

Azure VM停止時にディスクタイプを変更するPowerShellも作っておりますので、こちらも見て頂ければと。

PowerShellで入れ子になった情報を表示するのはこちら。(Get-AzVMで仮想マシンサイズを表示しています。)

電源状態だけではなくIPアドレスやディスク情報を纏めて取得はこちら。

※本PowerShell作成にあたってはマイクロソフトサポート様に大変助けて頂きました。本当に有難うございました。