Azure Managed Disk が GA
PowerShellが出ないので、とりあえず ARM Template を使った Managed Disk の操作方法を書く。
そもそも、Managed Diskとは何かという話は、Azure の Managed Disk のまとめに書いてあるので、そっちをどうぞ。
ざっくりと言うと、今ままでは Storage Account を作成して、Page Blobを置いて仮想ディスクとしてマウントするというのがAzureのブロックデバイスの扱いだったが、Managed Disk では Storage Account を意識することなくブロックデバイス(仮想ディスク)をリソースとして使えるようになりましたという話。
これでまた一つ普通になりましたという話で、Storage Accountとか、Page Blobとかを Azure 側で管理してくれる仕組みなので、Managed Disk(=良さ気に管理されたディスク)と呼ばれている。従来のものは、ドキュメント上は Unmanaged Disk と呼ばれているようだ。いつものように、名前がベタすぎてかえってわかりづらい。

改善点
いろいろあるのが、特に注目すべき改善点をいくつか上げる
- 仮想マシンのディスクリソースの定義の簡易化
- スナップショットの取得、仮想イメージの作成の容易性
- Storage Account の制限を意識する必要が無く。パフォーマンス設計が簡略化
- Storage Account KeyとPage BlobとしてのEndpointが無くなり運用設計が簡略化された
今回は、仮想マシンのリソース定義がどれぐらい簡略化されたのか、スナップショット関連はどうかを見てみる
概要
従来の仮想マシンのリソース定義では、下記のように書いてた。storageProfileのimageReferenceには、元になるイメージの情報が、osDiskにはイメージから仮想ディスクを作成する旨とPage BlobのURLが定義される。storageProfileだけを引用するとこんな感じだ。
"storageProfile": { | |
"imageReference": { | |
"publisher": "[variables('imagePublisher')]", | |
"offer": "[variables('imageOffer')]", | |
"sku": "[parameters('ubuntuOSVersion')]", | |
"version": "latest" | |
}, | |
"osDisk": { | |
"name": "osdisk", | |
"createOption": "FromImage", | |
"vhd": { | |
"uri": "[concat('http://',variables('storageAccountName'),'.blob.core.windows.net/vhds/','osdisk.vhd')]" | |
} | |
} | |
} |
このテンプレートでは、Page Blob を置くストレージアカウントを定義して使っている。
Managed Disk では、StorageProfile の osDisk の部分を省略でき下記のようになる。osDisk の部分がざっくりと無くなった感じだ。
"storageProfile": { | |
"imageReference": { | |
"publisher": "[variables('imagePublisher')]", | |
"offer": "[variables('imageOffer')]", | |
"sku": "[parameters('ubuntuOSVersion')]", | |
"version": "latest" | |
} | |
} |
このように省略した場合、暗黙のうちに Managed Disk リソースが作成され自動的に名前が付く。インスタンスがS付きの場合はPremium_LRS、それ以外はStandard_LRS、キャッシュはRead/WriteでDiskが作成される。DataDiskの場合はキャッシュのデフォルトはReadOnlyとなる。
※managed disk の場合のdeploy template 全文
省略した場合は、インスタンスのタイプでデフォルトが決まるが、ストレージの種別を指定したい場合、例えば、SでもStandard Storageを使う場合は、osDisk の managedDisk にstorageAccountTypeとして Standard_LRS を指定する。ストレージの定義も無くスッキリ書けるようになった。
"osDisk": { | |
"createOption": "FromImage", | |
"managedDisk": { | |
"storageAccountType": "Standard_LRS" | |
} | |
} |
Managed DiskはARMリソースになるので、Diskを定義して、仮想マシンにアタッチすることもできる。下記ではDataDiskをDiskリソースとして定義しVMへの接続している。
{ | |
"type": "Microsoft.Compute/disks", | |
"name": "myDataDisk", | |
"apiVersion": "2016-04-30-preview", | |
"location": "[resourceGroup().location]", | |
"properties": { | |
"creationData": { | |
"createOption": "Empty" | |
}, | |
"accountType": "Standard_LRS", | |
"diskSizeGB": 64 | |
} | |
}, | |
{ | |
"apiVersion": "2016-04-30-preview", | |
"type": "Microsoft.Compute/virtualMachines", | |
"name": "[variables('vmName')]", | |
"location": "[resourceGroup().location]", | |
"dependsOn": [ | |
"[resourceId('Microsoft.Network/networkInterfaces/', variables('nicName'))]", | |
"Microsoft.Compute/disks/myDataDisk" | |
], | |
"properties": { | |
"hardwareProfile": { | |
"vmSize": "[variables('vmSize')]" | |
}, | |
"osProfile": { | |
"computerName": "[variables('vmName')]", | |
"adminUsername": "[parameters('adminUsername')]", | |
"adminPassword": "[parameters('adminPassword')]" | |
}, | |
"storageProfile": { | |
"imageReference": { | |
"publisher": "[variables('imagePublisher')]", | |
"offer": "[variables('imageOffer')]", | |
"sku": "[parameters('ubuntuOSVersion')]", | |
"version": "latest" | |
}, | |
"dataDisks": [ | |
{ | |
"lun": 2, | |
"name": "myDataDisk", | |
"createOption": "Attach", | |
"managedDisk": { | |
"id": "[resourceId('Microsoft.Compute/disks', 'myDataDisk')]" | |
} | |
} | |
] | |
} | |
} |
スナップショットが簡単に取れるようになったので、スナップショットの取得、スナップショットからディスクの作成、仮想マシンの起動をテンプレートを使ってやってみた。
Snapshotを取る
このテンプレートでは、パラメータとしてDiskをもらって、Microsoft.Compute/snapshotsのリソースを作成している。sourceUri の部分にソースとなるDiskのリソースIDを指定してスナップショットを作成するという流れだ。今回何度か実行した感じだと30GBのOsDiskのスナップショットで30秒程度という感じだった。基本仮想マシンを停止して取ることになると思うが、起動中でもスナップショットを取ることはできる。
{ | |
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", | |
"contentVersion": "1.0.0.0", | |
"parameters": { | |
"diskName": {"type": "string"} | |
}, | |
"variables": {}, | |
"resources": [ | |
{ | |
"type": "Microsoft.Compute/snapshots", | |
"name": "[concat(parameters('diskName'), '-snapshot')]", | |
"apiVersion": "2016-04-30-preview", | |
"location": "[resourceGroup().location]", | |
"properties": { | |
"creationData": { | |
"createOption": "Copy", | |
"sourceUri": "[resourceId('Microsoft.Compute/disks', parameters('diskName'))]" | |
} | |
} | |
} | |
], | |
"outputs": {} | |
} | |
Snapshot からの Managed Diskの作成
スナップショットの名前とリソースグループ名をパラメータでもらって、Managed Diskを作成する。accountType でStandard、Premiumを指定することができる。これも、ソースとなるリソースは、sourceUri で指定する。これも30秒程度だった。
{ | |
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", | |
"contentVersion": "1.0.0.0", | |
"parameters": { | |
"sourceResourceGroup": {"type": "string"}, | |
"snapshotName": {"type": "string"} | |
}, | |
"variables": {}, | |
"resources": [ | |
{ | |
"type": "Microsoft.Compute/disks", | |
"name": "osDisk", | |
"location": "[resourceGroup().location]", | |
"apiVersion": "2016-04-30-preview", | |
"properties": { | |
"creationData": { | |
"createOption": "Copy", | |
"sourceUri": "[resourceId(parameters('sourceResourceGroup'), 'Microsoft.Compute/snapshots', parameters('snapshotName'))]" | |
}, | |
"accountType": "Standard_LRS", | |
"diskSizeGB": "30" | |
} | |
} | |
], | |
"outputs": {} | |
} | |
Managed Diskで仮想マシンを起動
作成したOsDiskを使って、仮想マシンを起動する。これはちょっと長いので一部を引用する。イメージから起動するのと違って、osProfileと、storageProfileのimageReferenceが無い。既にあるDiskリソースをmanagedDiskのidで指定する。
{ | |
"hardwareProfile": { | |
"vmSize": "[variables('vmSize')]" | |
}, | |
"storageProfile": { | |
"osDisk": { | |
"osType": "Linux", | |
"name": "[parameters('osDiskName')]", | |
"createOption": "Attach", | |
"managedDisk": { | |
"id": "[resourceId('Microsoft.Compute/disks', parameters('osDiskName'))]" | |
}, | |
"caching": "ReadWrite" | |
} | |
} | |
} |
最後に
これで、Azure 仮想マシンのDisk関連はだいぶ変わったことになるが、普通にリソースとしてディスクが使えるようになったので、全体的にはスッキリして分かりやすくなった。未だに、Azure PowerShellのManaged Disk 対応版 (3.5.0)が出てないのが気になるが、ブランチにはrelease-3.5.0居るので、そのうち出てくるでしょう。
ARM template でManaged Diskを操作するなら、https://github.com/chagarw/MDPPを見るのがお勧めだ。ほとんどのパターンが網羅されている。
※ このエントリのためにPRを書いたsupport gist file optionよく見たら同じようなのが2つも既に出ていた orz…
追記 2017/2/10
PowerShellGallery には、3.5 が出ていると教えてもらいました。流石もっともHQに近い男と言われるしばやん。https://www.powershellgallery.com/packages/AzureRM/3.5.0
Managed Disk 対応の Azure PowerShell は Web PI にないだけ
— しばやん (@shibayan) February 10, 2017