Azure VMの割り当て解除、停止忘れ対策

 

今回は、Azure Virtual Machine(VM)を止めたつもりなのに、停止し忘れて課金が発生しているVMを一覧出力して停止するPower Shellを作ってみました。

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

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

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

6

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

VM停止中VM deallocating課金される

7

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

電源OffVM deallocated課金されない

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

OSのみシャットダウンして、VM停止し忘れて課金が発生し続けるという事が結構ありました。

そこで、VMの課金が発生し続ける事態を防ぐために、OSのみがシャットダウンされている状態のVM一覧を取得し停止するPower Shellを作ってみました。

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

Power ShellでAzure VM起動/停止と一緒にディスクタイプを変更する


 

1 .Azure Portal上でVMの電源状態を確認してみる。

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

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

 

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

 

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

 

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

 

.Power Shellを使ってVMの電源状態を確認するにはGet-AzVM -status

PowerShellでVMの電源状態を確認するには、Get-AzVM コマンドを利用します。

Get-AzVM -statusのPowerStateが電源状態に対応します。

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

#見れる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の電源状態を取得して電源オフにするPower Shell(無駄な課金が発生してるVMの一覧を取得する)

不必要な課金が発生しているVMはPowerState が “VM Stoppe”になっているVMになります。

そこでPowerState が “VM Stoppe”の一覧取得しPower Shellで実施してみました。併せて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にも公開しています。

https://github.com/Tama-negi/Li-akb-branch-office/tree/PowerShell_Azure/VmPowerStatusCheck_20200607

※VMのPowerState が “VM Stopped”になっていても、意図的にその状態で置かれているケースもあるかと思います。その編は実際の利用環境に合わせて注意願います。

※マイクロソフトサポート様より教えて頂いたサンプルをもとに作成しています。

Homeに戻る