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

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

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

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

スポンサーリンク

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

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

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

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

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

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は停止するのですが、Azure VMのリソース解放はされてない状態(OS停止、VM起動)になります。その為継続して課金が発生します。

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

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

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

 

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

 

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

 

 Azure VM(仮想マシン)のメニューでも一覧で確認する事ができます。

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

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

  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を使ってAzure VMのステータス(電源状態)を確認する場合はGet-AzVM -Status

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

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

 VM名とAzure 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起動停止についてはこちらで纏めています。

Azure Logic Apps(ロジックアプリ)を使ったAzure VM(仮想マシン)の起動停止はこちら。


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

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

      • OSのみがシャットダウンされている状態のAzure VM一覧を取得
      • OSのみがシャットダウンされている状態のAzure VMを停止(割り当て解除)

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

 そこでPowerState が “VM Stoppe”の一覧取得しPowerShellで実施してみました。併せてAzure 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にも公開しています。
 Azure VMのPowerState が “VM Stopped"になっていても意図的にその状態で置かれているケースもあるかと思います。
 実際の使用状況に合わせて注意してご利用ください。

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

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

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

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

スポンサーリンク