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 と呼ばれているようだ。いつものように、名前がベタすぎてかえってわかりづらい。

Dried persimmon

改善点

いろいろあるのが、特に注目すべき改善点をいくつか上げる

  1. 仮想マシンのディスクリソースの定義の簡易化
  2. スナップショットの取得、仮想イメージの作成の容易性
  3. Storage Account の制限を意識する必要が無く。パフォーマンス設計が簡略化
  4. Storage Account KeyとPage BlobとしてのEndpointが無くなり運用設計が簡略化された

今回は、仮想マシンのリソース定義がどれぐらい簡略化されたのか、スナップショット関連はどうかを見てみる

概要

従来の仮想マシンのリソース定義では、下記のように書いてた。storageProfileimageReferenceには、元になるイメージの情報が、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"
}
}
view raw osDisk.json hosted with ❤ by GitHub

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')]"
}
}
]
}
}
view raw disks_vm.json hosted with ❤ by GitHub

スナップショットが簡単に取れるようになったので、スナップショットの取得、スナップショットからディスクの作成、仮想マシンの起動をテンプレートを使ってやってみた。

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": {}
}
view raw snapshot.json hosted with ❤ by GitHub

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": {}
}
view raw createmd.json hosted with ❤ by GitHub

Managed Diskで仮想マシンを起動

作成したOsDiskを使って、仮想マシンを起動する。これはちょっと長いので一部を引用する。イメージから起動するのと違って、osProfileと、storageProfileimageReferenceが無い。既にあるDiskリソースをmanagedDiskidで指定する。

{
"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