はじめに
この記事に興味を持っていただきありがとうございます。この記事は、Azure 料金を少しでも節約したいひとのために、仮想マシンのディスクを縮小する方法について書かれています。
Azure VM のディスクサイズと料金
Azure 提供のイメージを作って VM を作ると、毎月のディスク料金は以下のようになります(2023 年 1 月現在)。
イメージ | Disk Tier | サイズ | 料金(円) |
---|---|---|---|
Windows Server / Windows 10 | P10 | 127GB | 3,042 |
Windows Server / Windows 10 | E10 | 127GB | 1,288 |
Windows Server / Windows 10 | S10 | 127GB | 790 |
ここで、ディスクを半分の Disk Tier にすることができれば、以下のような料金になります。
Disk Tier | サイズ | 料金(円) |
---|---|---|
P6 | 64GiB | 1,575 |
E6 | 64GiB | 644 |
S6 | 64GiB | 403 |
更に小さくできるなら、もっと安くなります。
Disk Tier | サイズ | 料金(円) |
---|---|---|
P4 | 32GiB | 815 |
E4 | 32GiB | 322 |
S4 | 32GiB | 206 |
P3 | 16GiB | 467 |
E3 | 16GiB | 161 |
VM がひとつふたつではなく、大量にあるとだいぶ料金が変わってきます。
このあたりのことは Microsoft も自覚があるためか、Windows Server には smalldisk イメージが用意されています。そのサイズと料金は以下の通りです。
イメージ | Disk Tier | サイズ | 料金(円) |
---|---|---|---|
[smalldisk] Windows Server | P4 | 30GB | 815 |
[smalldisk] Windows Server | E4 | 30GB | 322 |
[smalldisk] Windows Server | S4 | 30GB | 206 |
まだ VM を作っていないときは、smalldisk イメージから始めれば、この記事のような面倒なことはしなくてもよいです。Windows 10 を使いたかったり、smalldisk を使わずに構築してしまったり、ディスク容量が余っていてもったいないというときは、これから述べる手順を試してみてください。
事前準備
Azure CLIとAzCopyを使用できる環境を用意します。手元のマシンにインストールしてもよいのですが、Azure Cloud Shellであれば、最初から全部入っていますので、環境を用意する手間が省けます。
📝: Azure Cloud Shell は、デフォルトで 6GB のクォータが設定されています。
Azure Cloud Shell を使う場合は、ダウンロードするディスクを置けるようにクォータを大きくしておきます。
手順
全体の大まかな手順は下記のようになります。【VM 内】というのは、VM(Windows)上での作業です。【Azure】は、Azure 上での作業です。
- 【VM 内】 パーティションを縮小する
- 【Azure】 ディスクの必要部分をダウンロードする
- 【Azure】 ディスクにフッタを付ける
- 【Azure】 ディスクをアップロードする
- 【Azure】 OS ディスクを交換する
- 【VM 内】 パーティションを拡張する
- 【Azure】 不要となった既存ディスクを削除する
今回は、127GB の OS ディスクを 16GB に縮小します。
それでは、これから手順をひとつひとつ見ていきます。
📝: 「そんなに小さくできないよー」というパターンもあるかと思います。
その場合は下記に出てくる 16GB の部分を、 適宜 32GB や 64GB に読み替えてください。
パーティションを縮小する
最初に VM の中でパーティションを縮小します。ここでは diskpart コマンドを使っていますが、GUI で作業されてももちろん大丈夫です。
diskpart コマンドを起動し、縮小するパーティションを選択します。
以下はディスク 0 のパーティション 4 を選択する例です。
list disk
select disk 0
list partition
select partition 4
どのくらい縮小できるか調べます。
shrink querymax
なんと、120GB(123,169MB)も縮小できることがわかりました(いえ、最初からわかっていました)。それでは、ドライブ全体が 16GB 未満になるように縮小してみます。
ボリューム C:\ 以外に 1GB を使うとして、余裕を持って 14GB を目指します。
今のサイズが 126GB なので、112GB(114,688MB)縮小します。
shrink desired=114688
縮小できたので、VM を停止しておきます。
ディスクの必要部分をダウンロードする
Azure VM のディスクは、(おそらく)固定サイズの VHD です。固定サイズの VHD は、生イメージ + 512 バイトのフッタでできています。ですので、前半の必要サイズ分だけダウンロードします。
一時 URL を生成する
まず、ダウンロード用の一時 URL を生成します。ディスク名とリソースグループ名には、実際の名前が入ります。
az disk grant-access --name [ディスク名] --resource-gorup [リソースグループ名] --duration-in-seconds 86400
実行すると、一時 URL が出力されます。
ディスクの必要部分をダウンロードする
取得レンジは、新しいディスクのサイズによります。今回は、16GB に縮小しようとしているので、16 × 1024 × 1024 × 1024 - 1 = 17179869183 になります(マイナス 1 するのは、レンジがゼロ始まりだからです)。**--start-range** オプションも忘れずにつけます。
一時 URLは、前手順で出力されたものです。
az storage blob download -f [保存ファイル名] --blob-url [一時URL] --end-range [取得レンジ] --start-range 0
想定通りのサイズのファイルができあがりました。
ディスクにフッタをつける
フッタを取得する
512 バイトのフッタを手ずから作るのは面倒なので、目的サイズのディスクを作って、そこからフッタだけ取得します。
ディスクを作ります。
az disk create --name [ディスク名] --resource-group [リソースグループ名] --size-gb [サイズ] --sku standardssd_lrs
今回は 16GB のディスクを作ります。
一時 URL を取得して、フッタ部分のみをダウンロードします。ここは前に書いた手順と同じです。
az disk grant-access --name [ディスク名] --resource-group [リソースグループ名] --duration-in-seconds 86400
az storage blob download -f [保存ファイル名] --blob-url [一時URL] --end-range [取得レンジ] --start-range [開始レンジ]
ディスクサイズが 16GB なので、 開始レンジ は、16 × 1024 × 1024 × 1024 = 17179869184 です。取得レンジ はプラス 511 して 17179869695 です。
想定通り、以下のような内容の固定 VHD のフッタを取得できました。49 バイト目からの 64 ビットにディスクサイズが入ってますね(0x0000000400000000 ということで、ビッグエンディアンなのかな?)。
作成したディスクは不要なので削除します。削除前に一時 URL を削除します。
az disk revoke-access --name [ディスク名] --resource-group [リソースグループ名]
az disk delete --yes --name [ディスク名] --resource-group [リソースグループ名]
📝: 一時 URL を削除しないと、以下のようなメッセージが出力されます。
(OperationNotAllowed) There is an active shared access signature outstanding for disk tmp16g. Call EndGetAccess before attaching or deleting the disk. Learn more here: aka.ms/revokeaccessapi. Code: OperationNotAllowed Message: There is an active shared access signature outstanding for disk tmp16g. Call EndGetAccess before attaching or deleting the disk. Learn more here: aka.ms/revokeaccessapi.
フッタを結合する
Bash を使っている場合は、普通に cat コマンドで結合してしまいます。
cat footer.raw >> vmdisk.raw
PowerShell を使っている場合は、以下のようなコマンドになります。
Get-Content -AsByteStream -ReadCount 0 ./footer.raw | Add-Content -AsByteStream -NoNewline ./vmdisk.raw
ディスクをアップロードする
単純にファイルアップロードするのではなく、いったんアップロード先の器となるディスクを用意し、そこへ上書きするようにします。
器となるディスクを作成する
アップロードして上書きする先となるディスクを作成します。
az disk create --name [ディスク名] --resource-group [リソースグループ名] --upload-type Upload --hyper-v-generation V2 --os-type Windows --upload-size-bytes [ファイルサイズ] --sku [SKU]
いくつか追加で必要となったオプションについて説明します。
-
--upload-type
: Upload または UploadWithSecurityData を指定します。どちらにするのかは、既存の OS ディスクの Security Type から確認できます。 "Standard"となっていれば Upload です。 -
--hyper-v-generation
: V1 または V2 を指定します。どちらにするのかは、仮想マシンのプロパティから確認できます。 -
--os-type
: OS の種類です。 Windows または Linux です。
今回は、Security Type=Standard なので Upload で作成しました。
アップロード用ディスクの一時 URL を生成する
前の方で作業した手順と同様です。ただし、ここでは --access-level Write
というオプションを付けて、書き込みできるようにします。
az disk grant-access --access-level Write --name [ディスク名] --resource-group [リソースグループ名] --duration-in-seconds 86400
アップロードする
azcopy コマンドを使ってアップロードします。az storage blob upload コマンドでできそうなのですが、できないんですよね。
azcopy copy [ファイル名] [一時URL] --blob-type PageBlob
一時 URL を削除する
一時 URL を削除することで、ディスクが確定(?)してアタッチできるようになります。
az disk revoke-access --name ted-blog-vm_OsDisk_16g --resource-group ex-ted-blog
OS ディスクを交換する
既存の OS ディスクを、アップロードしたディスクで置き換えます。
置き換えコマンドを実行するために、アップロードしたディスクのリソース ID を取得します。
az disk show --name [ディスク名] --resource-group [リソースグループ名] --query id
VM の OS ディスクを更新します。
az vm update --name [VM名] --resource-group [リソースグループ名] --os-disk [ディスクのリソースID]
ここまでくれば、残りの作業はあと少しです。
パーティションを拡張する
最初の手順でパーティションを小さめにしたので、ディスクいっぱいまで拡張します。VM を起動してアクセスします。
ここでは diskpart コマンドを使っていますが、GUI で作業されてももちろん大丈夫です。
最初と同じように、ディスク 0 のパーティション 4 を選択します。
list disk
select disk 0
list partition
select partition 4
拡張します。
extend
ディスクいっぱいまで拡張できました。
不要となった既存ディスクを削除する
既存の OS ディスクは不要になりましたので削除しましょう。
これで料金が抑えられました。
まとめ
料金を節約するために、VM のディスクを縮小する手順を解説しました。
実際にどのくらい節約できるのか、Azure ポータルで料金グラフを見てみます。
ディスクのサイズが 127GB のときは、2,700 円ほどの予想でした。
16GB にすると、500 円ほどになりました。すばらしい。
(16GB のほうが開始日付が遅いので、実際より少々お安いです)
参考リンク
- Azure から Windows VHD をダウンロードする
- VHD を Azure にアップロードするか、他のリージョンにマネージド ディスクをコピーする - Azure CLI
- About VHD
- Azure CLI を使用して Azure VM によって使用される OS ディスクを変更する
「掲載日:2023年3月1日」