はじめに
Private Preview であった Azure Image Builder が Public Preview になりました。いわゆる「ゴールデンイメージ」の運用が簡単になるサービスです。Azure のサービスと連携する Packer のマネージドサービスとも言えます。
- Announcing the public preview of Azure Image Builder
- BACK TO SESSIONS Customizing Images made easy – Azure Image Builder Service
- danielsollondon/azvmimagebuilder
Image Builder は、ビルドしたイメージを Managed Image と Shared Image Gallary、ストレージアカウントアカウント内の VHD ファイルとして保存します。
普通の使い方であれば イメージと Managed Image や Shared Image Gallary として保存するのでしょうが、Azure Stack の検証のために Windows Server 2019 の VHD ファイルが必要だったので、Azure 上のマーケットプレイスに登録されている Windows Server 2019 を Image Builder を利用して VHD ファイルとして保存してみます。Hyper-V 不要、ISO インストール不要で Azure ベースな VHD ファイルが手に入るのですから、Image Builder は Azure Stack で使う VHD を用意するのに最適なサービスかもしれません。
用意
Image Builder は Public Preview のサービスなので、個別に有効化しなければなりません。
az feature register --namespace Microsoft.VirtualMachineImages --name VirtualMachineTemplatePreview
az provider register -n Microsoft.VirtualMachineImages
Microsoft.VirtualMachineImages 以外にも、Microsoft.Storage と Microsoft.Compute、Microsoft.Network、Microsoft.Keyvault が必要です。レアなケースだと思いますが、もしもこれらの Resource Provider が有効化されていなければ有効化します。
Image Builder への権限付与
Image Builder は、イメージを作成するために、利用者のサブスクリプション上に Virtual Machine を作成します。Virtual Machine を作成するには権限が必要なので、Image Builder に対して RBAC で権限を付与します。
az role assignment create \
--assignee cf32a0cc-373c-47c9-9156-0db11f6a6dfc \
--role Contributor \
--scope /subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup
テンプレートの作成
Image Builder が利用するテンプレートを作ります。文法は Preview: Create an Azure Image Builder template にまとまっています。
Azure のマーケットプレイスに登録されている Windows Server 2019 Datacenter Small Disk を カスタマイズなしで VHD ファイルとして保存するテンプレートは次の通りです。
{
"type": "Microsoft.VirtualMachineImages/imageTemplates",
"apiVersion": "2019-05-01-preview",
"location": "WestUS2",
"dependsOn": [],
"tags": {
"imagebuilderTemplate": "2019-Datacenter-smalldisk-2019.0.20190410"
},
"properties": {
"buildTimeoutInMinutes" : 80,
"source": {
"type": "PlatformImage",
"publisher": "MicrosoftWindowsServer",
"offer": "WindowsServer",
"sku": "2019-Datacenter-smalldisk",
"version": "2019.0.20190410"
},
"customize": [
],
"distribute":[
{
"type": "VHD",
"runOutputName": "2019-Datacenter-smalldisk-2019.0.20190410",
"tags": {}
}
]
}
}
source
“source” の箇所ではイメージの元を指定します。今回は Azure のマーケットプレイスに登録されている Windows Server 2019 Datacenter (Small Disk)を利用します。現時点では、“version” を明示的に指定する必要があります。Latest は利用できません。
customize
“source” で指定したイメージに対して実行するカスタマイズの処理を記載します。カスタマイズには再起動とPowerShell、ファイルのダウンローとの3つが用意されています。PowerShell は インラインとスクリプト実行をサポートしています。
distribute
カスタマイズしたイメージの保存先を指定します。保存先は次の3つをサポートしています。
- Storage Account(VHD)
- Managed Image
- Shared Image Gallary
テンプレートの登録
作成したテンプレートを Azure 上のリソースとして登録します。
az resource create \
--resource-group $imageResourceGroup \
--properties @2019.json \
--is-full-object \
--resource-type Microsoft.VirtualMachineImages/imageTemplates \
-n win2019
登録が完了すると、指定したリソースグループに hidden type なリソースとして登録されます。

登録されたテンプレート
同時に、Image Builder がイメージ化する Virtual Machine を起動するリソースグループが作成されます。

作業用リソースグループ
イメージの作成
登録したテンプレートを利用してイメージを作成します。
az resource invoke-action \
--resource-group $imageResourceGroup \
--resource-type Microsoft.VirtualMachineImages/imageTemplates \
-n win2019 \
--action Run
コマンドを実行すると、作業用のリソースグループに、独立した VNet に接続する Virtual Machine が作成されます。この Virtual Machine を利用して Image Builder が イメージを作成します。作業完了後には、Virtual Machine と Virtual Machine に関連するリシースが自動的に削除されます。

作業用リソースグループ
イメージを作成する際に実行された Packer のログは、ストレージアカウント内の packerlogs コンテナに保存されています。Image Builder が意図しない振る舞いをした場合は、このログファイルを見てデバッグすることになりそうです。

Packer のログ
Image Builder が作成したイメージは、ストレージアカウント内の vhds コンテナに保存されます。Small Disk なイメージをもとにしたので、作成された VHD のサイズも30GB になっていますね。

保存された VHD
おわりに
Public Preview になった Azure Image Builder を利用して、マーケットプレイスに登録されている Windows Server 2019 Datacenter を VHD に変換しました。次回は、変換した VHD を Azure Stack のマーケットプレイス に登録します。できればいいのですが・・・