Azure VMの電源状態と課金の関係(停止済み、割り当て解除、休止状態の概要や割り当て解除忘れ対策)
仮想マシン(Azure VM)の電源状態(実行状態)・ステータス(PowerState)と課金発生の関係を一覧表で整理しました。
停止済み(Stopped)と割り当て解除(Deallocated)の違いや、休止状態(Hibernate)の概要についても紹介しています。
また、割り当て解除を忘れて無駄な課金が発生している仮想マシンを一覧出力し、割り当て解除するPowerShellも紹介しています。
※本記事では、Azure Virtual Machines(Azure VM)を仮想マシンと表記しています。
仮想マシンの電源状態(実行状態)や課金との関連
仮想マシンの電源状態(実行状態)と課金発生の関連
仮想マシンを停止させたはずなのに課金が発生しているケースがありました。
これは、仮想マシンの電源状態(実行状態)が割り当て解除済みではなく停止になっていたためでした。
Azure Virtual Machines の状態と課金状態
Azure上の仮想マシンは、ゲストOS(仮想マシン内で動作しているWindowsやLinuxなOS)をシャットダウンしただけでは停止状態(Stopped)となり、仮想マシンに対するコンピューティング料金は継続します。
仮想マシンの状態は、ゲストOSの状態とAzure上の電源状態(割り当て状態を含む)の2つに分けて考える必要があります。
ゲストOSでシャットダウンコマンドを実行するとOS自体は停止しますが、仮想マシンのCPUやメモリなどのコンピューティングリソースは解放されず、確保されたままの状態となります。
ゲストOSは停止していても仮想マシンのリソースは引き続き確保されたままの扱いとなるため、仮想マシンのコンピューティングに対する課金は継続します。
コンピューティングの課金を停止するには、Azure Portal、PowerShell、Azure CLIなどから割り当て解除(Deallocated)を行う必要があります。
割り当て解除とは、仮想マシンに割り当てられていたCPUやメモリなどのコンピューティングリソースを解放する操作になります。
仮想マシンが対応している場合は、休止状態(Hibernate)を利用することもできます。
Azure Portalの停止ボタンで仮想マシンを停止した場合は、OSの状態にかかわらず、最終的に割り当て解除(Deallocated)となります。
-
- 仮想マシンを開始(電源ON): 1→3
- ゲストOSをシャットダウン: 3→5
- 仮想マシンを停止(電源Off): 3→8(5→8)
- 仮想マシンを休止(電源Off): 3→7
なお、割り当て解除(Deallocated)状態であっても、ディスク(Azure Managed Disks)や静的パブリックIPアドレスなどの一部リソースについては、引き続き課金が発生します。
| 仮想マシンの状態 | 起動状況 | ステータス (PowerState) |
コンピューティングの課金状況 | |
| 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 VM hibernated |
|
| 8 | 停止済み(割り当て解除) | VM停止済み OS停止済み |
VM deallocated |
※休止状態の場合は、HibernationStateがVM hibernatedとなります。
※状態欄に不明と表示されることがあります。その場合は、仮想マシンの状態が取得できない一時的な問題の可能性があるため、しばらく待ってから再度確認します。
Azure CLIやPowerShellなどで、電源状態を確認する方法については、こちらで紹介しています。
Azure Portalに表示される仮想マシンの電源状態(実行状態)一覧
Azure Portalに表示仮想マシンの電源状態(実行状態)を確認してみました。
仮想マシンの電源状況は状態に表示されます。
仮想マシンの休止状態について
Azure仮想マシンでは休止状態(Hibernate)がサポートされています。
休止状態とは、PCの休止状態と同じように、メモリの内容をOSディスクに保存した上でVMの割り当てを解除する機能です。
再開時にはメモリの内容がOSディスクからメモリに復元されるため、アプリケーションやプロセスが休止前の状態からそのまま再開されます。
Azure Portal上での状態表示は休止状態になりました(割り当て解除済み)となります。
また、Azure CLIなどでの表示は、Hibernated(Deallocated)となります。
コンピューティング課金は発生しません。
休止状態をサポートする仮想マシンのサイズやOSには制限があります。
また、スポットVM、エフェメラルOSディスク、共有ディスク、可用性セットなどでは使用できません。
Windows 仮想マシンの休止状態
Linux 仮想マシンの休止状態
OSディスク、データディスク、NICは仮想マシンにアタッチされたままとなります。
また、一時ディスクの内容については保持されません。
| 項目 | 割り当て解除状態 | 休止状態 |
| メモリの内容 | 保持されない | OSディスクに保存される |
| 再開時の動作 | OSが再起動される | 休止前の状態から復帰する |
| コンピューティング課金 | 課金されない | 課金されない |
| サイズ変更 | 可能 | 不可(実行中または割り当て解除状態にする必要がある) |
| ディスクのアタッチ/デタッチ | 可能 | 不可(割り当て解除状態にする必要がある) |
Bシリーズの仮想マシンで割り当て解除するとCPUクレジットがクリアされる
BシリーズはCPU使用率が低い時にクレジットを蓄積し、高負荷時にクレジットを消費してCPU性能をバーストすることができる仮想マシンです。
このBシリーズの仮想マシンでは、割り当て解除(停止)を行うとCPUクレジットがクリアされます。
なお、Bシリーズでは休止状態はサポートされていません。
BシリーズでのCPUクレジットメトリック確認方法などについては、こちらで紹介しています。
—広告—
無駄な課金が発生している停止状態の仮想マシンの一覧を取得して割り当て解除するPowerShell
今回利用したPowerShellやモジュールのバージョン
確認に使用したバージョンです。
-
- PowerShell : 7.6.0
- Az Module : 15.4.0
- Az.Compute : 11.4.0
仮想マシンの電源状態(実行状態)を確認するために使うAzure PowerShellコマンドレット
PowerShellで仮想マシンの電源状態(実行状態)を確認する場合はGet-AzVMコマンドレットを使用します。
Get-AzVMコマンドレットに-Statusパラメーターを付与して実行します。
Get-AzVM -Statusで取得されるPowerStateが仮想マシンの電源状態(実行状態)を表します。
仮想マシンの起動停止に使うAzure CLIやPowerShellコマンドについては、こちらで紹介しています。
開始から割り当て解除までの操作、実行結果、状態確認に使うコマンドを紹介しています。
停止状態にある仮想マシンの一覧を取得して割り当て解除するPowerShell(無駄な課金を停止)
仮想マシンの課金が発生し続ける事態を防ぐためには以下の対応が必要になります。
-
- ゲストOSが停止(シャットダウン)された仮想マシン一覧を取得
- 取得した仮想マシンを割り当て解除
ゲストOSのみがシャットダウンされている停止状態の仮想マシンのPowerStateは “VM stopped"となります。
PowerStateが “VM stopped"の仮想マシンの一覧を取得します。
取得した仮想マシンを割り当て解除(停止)するようにしています。
また、Stop-AzVMコマンドレットに-Forceパラメーターを追加しています。
これにより仮想マシン停止時の確認メッセージが表示されないようにしています。
またvmstoporcheckの変数で仮想マシンのリスト取得のみか停止まで実行するかを選択できるようにしています。
仮想マシンのゲストOSのみ意図的にシャットダウンされているケースもあるかと思います。
割り当て解除する場合はご注意ください。
|
# 仮想マシン割り当て解除忘れ漏れ対策 PowerShell
# 対象のリソースグループを指定(指定しない場合は下記3行をコメントアウトします。)
param (
[string] [Parameter(Mandatory=$true)] $ResourceGroupName
)
# 仮想マシンを割り当て解除する場合は1、確認のみの場合は0を選択
$vmstoporcheck = 0
# 停止状態(割り当て解除されていない)にある仮想マシンの電源状態を取得
$vmstat = Get-AzVM -Status `
| Select-Object ResourceGroupName, Name, PowerState `
| Where-Object { $_.PowerState -eq “VM stopped" }
# リソースグループを指定しない場合
# foreach ($vmstatus in $vmstat) {
# リソースグループを指定する場合
foreach ($vmstatus in $vmstat | Where-Object { $_.ResourceGroupName -eq $ResourceGroupName }) {
# 仮想マシンを割り当て解除
if ($vmstoporcheck -eq 1) {
Write-Host “Deallocate VM Name: $($vmstatus.Name)"
Stop-AzVM -ResourceGroupName $vmstatus.ResourceGroupName -Name $vmstatus.Name -Force
}
else {
Write-Host “Stopped VM Name: $($vmstatus.Name) (確認のみ)"
}
}
|
PowerShellの実行結果例です。
PowerShell名をFind-DeallocateStoppedVMs.ps1としています。
|
# 確認のみの場合
PS C:\> Find-DeallocateStoppedVMs.ps1 cmdlet Find-DeallocateStoppedVMs.ps1 at command pipeline position 1 # 割り当て解除する場合 cmdlet Find-DeallocateStoppedVMs.ps1 at command pipeline position 1 OperationId : xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx |
—広告—
最後に
仮想マシンを止めたつもりなのに課金を発生させてしまい、Azureの利用料金に影響が出てしまった事がありました。
これはAzure上の仮想マシンのゲストOSをシャットダウンしただけで課金が止まると勘違いしていたためでした。
そこで今回は、仮想マシンの電源状態と課金の発生有無について簡単にまとめてみました。
併せて、割り当て解除のし忘れにより無駄な課金が発生することを防ぐため、割り当て解除用のPowerShellも紹介しています。
引き続き、いろいろ試してみたいと思います。
仮想マシンの電源状態(実行状態)だけではなく仮想マシンのIPアドレスやディスク情報も一緒に取得するPowerShellについては、こちらで紹介しています。
仮想マシン割り当て解除時にディスクタイプを変更するPowerShellについては、こちらで紹介しています。
Azure Logic Apps(ロジックアプリ)を使った仮想マシンの起動停止のスケジュール化については、こちらで紹介しています。
Azure AutomationのRunbookを利用して仮想マシンを開始する方法については、こちらで紹介しています。










