Azure マネージドディスクのSKUをVM起動/停止に併せて変更して課金を抑える

Azure,Managed Disks,PowerShell/Azure CLI,Virtual Machine

Azure VMの起動停止状態に関わらずVMに接続されているAzure Managed Disks(マネージドディスク)については使用料金が発生します。
Azure VM停止時はマネージドディスクに対して高いIOやSLAは必要ありません。
Azure VM停止時のみマネージドディスクの種類(SKU)をStandard HDDへ変更すること課金を抑える事が出来ます。

Azure VM起動時はPremium SSDを使っておき、Azure VM停止時にStandard HDDに変更する事でAzure利用料金を抑えることができます。

今回はAzure VM起動時や停止時にマネージドディスクの種類を変更するPowerShellを作ってみました。
PowerShellを使っているのはRunbookでの利用を想定している為になります。

作成にあたっては以下のサイトを参考にしています。

マネージド ディスクのストレージの種類を更新する(公式サイト)

※検証環境等での利用を想定しています。暗号化や共有ディスクについては考慮していません。
※2022年7月に記事を更新しています。

スポンサーリンク

Azure Managed Disks(マネージドディスク)の課金について

Azureマネージドディスクにはパフォーマンスに応じて4種類あります。

Azure マネージド ディスクの種類

パフォーマンス順に並べるとUltra Disk、Premium SSD、Standard SSD,Standard HDDになります。
このうちUltra Disk除く3種類については変更が可能です。

マネージドディスクは種類(SKU)により同じ容量でも使用料金が異なります。
例えば256GBの場合(東日本リージョン)(2022年7月)で比較するとこのような形になります。

ディスクの種類 256GBの場合の価格(東日本リージョン)(月額) トランザクションによる課金
Premium SSD(P15) ¥5,957.6 無し
Standard SSD(E15) ¥2,616.29 有り(10,000 トランザクション ユニットあたり ¥0.224)
Standard HDD(S15) ¥1,543.61 有り(トランザクション 10,000 回あたり ¥0.056)

マネージドディスクへの課金は仮想マシンの電源ステータス(起動、停止)に関わらず発生します。
仮想マシンを削除してもマネージドディスクが残っていると継続して課金が発生します。

最新のAzure マネージドディスクの課金についてはこちらを参照願います。

Managed Disks の価格

マネージドディスクの種類によりSLAが異なります。
今回はVM停止時にSLAのレベルを下げて起動時には上げる動作になります。

Virtual Machines の SLA

Azure VMのステータスと課金状況についてはこちらに纏めています。
併せて見て頂けると大変有難いです。

PowerShellを使ってAzure VM起動や停止と同時にマネージドディスクの種類(SKU)を変更

今回は以下の通りに変更します。

    • VM起動時:Standard SSD
    • VM停止時:Standard HDD

Azure VM起動と共にStandard HDDからStandard SSDに変更

Azure VMの起動時にAzure VMに接続されているマネージドディスクの種類をStandard SSDとしています。
$StorageTypeでディスクの種類を指定するようにしています。PremiumSSDの場合は$StorageType ="PremiumSSD_LRS"とします。
PowerShellはVM名を変数として実行するようにしています。

#Vm Start (Changed Disk Type)

#VM名を固定にする場合はparam部分をコメントアウトしてVM名を指定します。
#$VmName ="VM名"

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

$ResourceGroupName =“リソースグループ名"
$StorageType =“StandardSSD_LRS"

$VM = Get-AzVM -Name $VmName -ResourceGroupName $ResourceGroupName
$VmDisks = Get-AzDisk | Where { $_.ResourceGroupName -eq $ResourceGroupName } | Where { $_.ManagedBy -eq $VM.id }

foreach ($disk in $vmDisks)
 {
  if ($disk.ManagedBy -eq $vm.Id)
  {
  $diskUpdateConfig = New-AzDiskUpdateConfig –AccountType $StorageType
  Update-AzDisk -DiskUpdate $diskUpdateConfig -ResourceGroupName $ResourceGroupName `
  -DiskName $disk.Name
  }
}

Start-AzVM -ResourceGroupName $ResourceGroupName -Name $VmName

PowerShell名をVM_Start_SelectDiskType.ps1として保存しています。
起動対象のVM名を指定してPowerShell実行します。

c:\>VM_Start_SelectDiskType.ps1 -VmName VM名

Azure VM停止と共にStandard SSDからStandard HDDに変更

Azure VMの停止時にAzure VMに接続されているマネージドディスクの種類をStandard HDDとしています。
VM名を変数としてPowerShellを実行するようにしています。

※Standard HDDの場合はディスクの種類の指定は”Standard_LRS”になります。

#Vm Stop (Changed Disk Type)

#VM名を固定にする場合は、下記の通り指定します。(param部分はコメントアウト)
#$VmName ="VM名"

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

  $ResourceGroupName =“リソースグループ名"
  $StorageType =“Standard_LRS"

 Stop-AzVM -ResourceGroupName $ResourceGroupName -Name $VmName -Force

 $VM = Get-AzVM -Name $VmName -ResourceGroupName $ResourceGroupName
 $vmDisks = Get-AzDisk | Where { $_.ResourceGroupName -eq $ResourceGroupName } | Where { $_.ManagedBy -eq $VM.id }

foreach ($disk in $vmDisks)
{
 if ($disk.ManagedBy -eq $vm.Id)
  {
  $diskUpdateConfig = New-AzDiskUpdateConfig –AccountType $StorageType
  Update-AzDisk -DiskUpdate $diskUpdateConfig -ResourceGroupName $ResourceGroupName `
  -DiskName $disk.Name

 }
}

PowerShell名をVM_Stop_SelectDiskType.ps1としています。
停止対象のVM名を指定しPowerShell実行します。

c:\>\VM_Stop_SelectDiskType.ps1 -VmName VM名

マネージドディスクの種類をGet-AzDiskを使って確認

Get-AzDiskを使うとマネージドディスクの種類を表示する事ができます。
変更後の確認としてディスク名と種類(SKU)を表示するようにしています。

Get-AzDisk -ResourceGroupName “リソースグループ名" | ft Name,@{Name="Name"; Expression={$_.Sku.Name}}

#実行結果例
Name Name

—- —-
test-vm-01_OsDisk Standard_LRS
test-vm-02_OsDisk Standard_LRS
test-vm-03_OsDisk Standard_LRS

最後に

PowerShellを使ったマネージドディスクの種類変更をやってみました。
Azure VMの起動停止と併せて実施する事で課金を抑える事が出来るので検証環境等で使うと有益なのではと思いました。

Logic Appsを利用したAzure VMの起動停止はこちら。

Automationアカウントでの実行時間制限はこちら。