2026/04/10

はじめに

Azure上にテスト用のSQL Server VMを複数台持っていると、「使っていないのに毎月数万円飛んでいく」という状況に陥りがちです。本記事では、Blob Storageへの退避運用で月61,000円を1,500円まで削減した実践手順を紹介します。

恥ずかしながら、Microsoftパートナーである当社でもこの状態に半年以上気づいていませんでした。VMを停止しても課金が止まらないのがAzureの落とし穴です。ディスク、バックアップ、パブリックIP — これらは「VM停止中」でも確実に課金され続けます。開発中はVMをガンガン立てて検証するのですが、開発が一段落するとそのまま放置しがちです。「あとで片付けよう」が半年続いて、毎月の請求書も「まあこんなもんか」で流していました。Azureを日常的に扱っているプロでもやらかすという、戒めも込めて書いています。

当社はMicrosoftパートナーとして、Azure環境の最適化やコスト削減を支援しています。この記事では、自社で実際に運用している退避手順をそのまま公開します。

何にそんなに課金されていたのか

当社ではAzure上にSQL Serverのテスト用VM(Windows Server)を3台、開発用を1台、計4台保有していました。テスト用途なので常時起動はしていませんが、VMを停止してもディスクの課金は止まりません。

項目月額
データディスク(P50 4TB, P40 2TB等)39,300円
OSディスク(P10 128GB x4)2,440円
Recovery Servicesバックアップ11,333円
パブリックIP・その他7,927円
合計61,000円

特に痛いのがデータディスクです。Premium SSDのP50(4TB)は1台で月2万円以上。テスト用DBが入っているだけで毎月課金され続けます。

そして一番お間抜けだったのがRecovery Servicesのバックアップです。VMを削除しても、バックアップデータを明示的に削除しない限り課金が続きます。「VMは消したから大丈夫」と思い込んでいたのですが、請求明細をよく見たら毎月1万円以上が引き落とされ続けていました。

参考: Azure Managed Disks の価格

削減のアプローチ:VM丸ごとBlobに退避して全削除

発想はシンプルです。テスト環境は必要なときだけ復元すればいい。普段はBlob Storageに必要なデータだけ置いておけば、ストレージ代だけで済みます。

Step 1:SQL Serverの圧縮バックアップ

まずDBを.bakに圧縮バックアップします。SQL Serverの圧縮は非常に優秀で、977GBのDBが17GBの.bakファイルになりました。

BACKUP DATABASE [MyTestDB]
TO DISK = N'F:\Backup\MyTestDB.bak'
WITH COMPRESSION, INIT, STATS = 10;

この.bakをBlob Storageにアップロードします。

azcopy copy "F:\Backup\MyTestDB.bak" "https://mystorageaccount.blob.core.windows.net/backups/"

Azure VM上からの同一リージョンへのBlob転送はネットワーク料金が無料です。4TBのディスクも17GBのバックアップとして保管すればストレージ代は月数十円で済みます。

参考: SQL Server のバックアップの圧縮

Step 2:OSディスクのスナップショット → VHDエクスポート

OSディスクはスナップショットを取り、VHDとしてBlobにエクスポートします。

# スナップショット作成
az snapshot create \
  --resource-group MyRG \
  --name vm01-osdisk-snap \
  --source /subscriptions/.../disks/vm01-osdisk

# SAS URLを生成してBlobにエクスポート
az snapshot grant-access \
  --resource-group MyRG \
  --name vm01-osdisk-snap \
  --duration-in-seconds 3600 \
  --query accessSas -o tsv

生成されたSAS URLからazcopyでBlobにコピーします。

参考: Azure から VHD をダウンロードする

Step 3:VM構成情報を記録して全削除

復元時に必要な情報をメモしておきます。

  • VMサイズ(例:Standard_E4s_v5)
  • VNet / サブネット名
  • NIC名・プライベートIP
  • データディスクのサイズとSKU
  • NSGの設定

そして、VM → データディスク → OSディスク → パブリックIP → Recovery Servicesコンテナの順に全削除します。

Standard SKUのパブリックIPは未使用でも月550円課金されます。NICも不要なら削除しましょう。Recovery Servicesは「論理削除」を無効にしてからバックアップデータを削除する必要があります。

参考: Azure Backup の論理的な削除

結果

項目月額
Blob Storage(VHD + .bak)約1,500円
合計1,500円

月59,500円、年間約71万円の削減です。

復元の手順

テスト実施時の復元手順は以下の通りです。所要時間は30分〜1時間程度。

# 1. BlobのVHDからOSディスクを作成
az disk create \
  --resource-group MyRG \
  --name vm01-osdisk \
  --source "https://mystorageaccount.blob.core.windows.net/vhds/vm01-osdisk.vhd"

# 2. VMを再作成(既存NICを指定)
az vm create \
  --resource-group MyRG \
  --name VM01 \
  --attach-os-disk vm01-osdisk \
  --os-type Windows \
  --nics vm01-nic \
  --size Standard_E4s_v5

# 3. データディスク作成・アタッチ
az disk create --resource-group MyRG --name vm01-data --size-gb 4096 --sku Premium_LRS
az vm disk attach --resource-group MyRG --vm-name VM01 --name vm01-data --lun 0

# 4. VM内でSQL Serverにリストア
RESTORE DATABASE [MyTestDB] FROM DISK = N'F:\Backup\MyTestDB.bak' WITH REPLACE;

テスト完了後は再びバックアップ → Blob退避 → 全削除のサイクルを回します。

参考: 特殊化された VHD から VM を作成する

つまったところ

Recovery Servicesのバックアップが削除できない

これが一番痛い失敗でした。VMを削除したので安心していたら、Recovery Servicesのバックアップだけが残り続け、毎月11,000円が引き落とされていました。しかも「論理削除」が有効になっていると、削除操作をしても14日間は保持され続けます。

解決策は、Recovery Servicesコンテナの「プロパティ」→「セキュリティ設定」から論理削除を無効にし、その後バックアップデータを削除することです。正直、Azureのコスト管理画面を毎月ちゃんと見ていれば半年も気づかないはずがないのですが…皆さんは請求明細を定期的に確認してください。

VHDエクスポートのSAS URL有効期限

az snapshot grant-accessで生成されるSAS URLにはデフォルトで有効期限があります。大きなVHDのコピーには時間がかかるため、--duration-in-secondsを十分に長く設定する必要があります。3600秒(1時間)で不足する場合は86400秒(24時間)に延長してください。

おまけ:ローカルHyper-Vでも起動できる

BlobにエクスポートしたVHDは、ローカルのHyper-Vでも起動できます。ちょっとした設定確認やテストならAzure上にVMを立てる必要すらありません。

# VHD → VHDX(Dynamic)に変換
Convert-VHD -Path .\vm01-osdisk.vhd -DestinationPath .\vm01-osdisk.vhdx -VHDType Dynamic

127GBの固定VHDが、Dynamic変換で80GB程度になります。Hyper-VでGen2 VMとして起動すれば、そのままWindows Server + SQL Serverの環境が手に入ります。Macユーザーの場合はSSHトンネル経由でRDP接続すれば利用可能です。

まとめ

  • テスト用VMは止めるだけでは不十分。ディスクとバックアップが課金され続ける
  • SQL Serverの圧縮バックアップは驚異的(977GB → 17GB)
  • OS環境はVHDとしてBlobに退避すれば、Azure復元もローカルHyper-V起動もできる
  • 同一リージョンのVM↔Blob転送は無料なので、退避・復元のコストも低い
  • Recovery Servicesのバックアップは明示的にデータ削除しないと課金が続く

「テスト環境を寝かせているだけで毎月数万円…」という方は、まさに半年前の当社と同じ状態です。ぜひBlob退避運用を検討してみてください。復元も30分程度で、運用の手間は想像より小さいです。同じ過ちを繰り返す人が一人でも減れば、この恥ずかしい告白にも意味があったと思います。

Azureコスト最適化のご相談

株式会社ビギニングは、Microsoftパートナーとして中小企業のAzure環境のコスト最適化を支援しています。

  • Azure VMのコストを見直したい・使っていないリソースを整理したい
  • テスト環境や開発環境の運用コストを削減したい
  • Azure環境全体のコスト分析と最適化提案がほしい

お気軽にご相談ください。

お問い合わせはこちら