Azure Compute Galleryは仮想マシンのイメージをバージョン管理し、そのイメージを元にデプロイする事ができます。cloud-initやAnsible等の自動化ではパッケージインストールなどの待ち時間が発生しますが、Azure Compute Galleryはインストール済みのイメージをコピーするため待ち時間が少なくなる傾向があります。このページでは、Azure Compute Galleryの使い方を説明します。
前提
公式ドキュメント
参考になる公式ドキュメントを以下に示します。
- Azure Compute Gallery でイメージを格納、共有する
- リソースを格納および共有するためのギャラリーを作成する
- RBAC を使用してギャラリー リソースを共有する
- ポータルで VM をキャプチャする
- イメージ定義とイメージ バージョンを作成する
事前設定
リソースグループ
以下、リソースグループを作成します。
az group create --name MyResourceGroup --location japaneast
ネットワークセキュリティグループ
説明の都合上、ブラウザで動作確認をします。tcp80を許可するネットワークセキュリティグループを作成します。
az network vnet create \ -g MyResourceGroup \ -n MyVnet \ --address-prefix 172.16.0.0/16 \ --subnet-name MySubnet \ --subnet-prefix 172.16.0.0/24 az network nsg create -g MyResourceGroup -n MyNsg az network nsg rule create \ --resource-group MyResourceGroup \ --nsg-name MyNsg \ --name MyNsgRule0100 \ --priority 100 \ --destination-port-ranges 22 80 \ --access Allow \ --protocol Tcp
コピー元となる仮想マシン
動作確認を目的として、複製元となる仮想マシンを作成します。デフォルト設定の仮想マシンと見分けがつくように、httpdをインストールするcloud-initを記述します。
cat << 'EOF' > cloud-init-httpd.txt #cloud-config packages: - httpd runcmd: - setenforce 0 - sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config - systemctl disable firewalld.service --now - systemctl enable httpd.service --now EOF
httpdをインストールした仮想マシンを作成します。
az vm create \ --resource-group MyResourceGroup \ --name linux020 \ --image procomputers:rocky-linux-8-minimal:rocky-linux-8-minimal:latest \ --admin-username azureuser \ --size Standard_B1s \ --ssh-key-values ~/.ssh/authorized_keys \ --vnet-name MyVnet \ --subnet MySubnet \ --nsg MyNsg \ --private-ip-address 172.16.0.20 \ --custom-data cloud-init-httpd.txt
Azure Compute Galleryの初期操作
Azure Compute Galleryの作成
Compute Galleryを作成します。操作例は以下の通りです。
az sig create \ --resource-group MyResourceGroup \ --gallery-name MyGallery
想定通りのGalleryが作成されているかをGUIからも確認してみましょう。
「Azure ポータル」をブラウザで開き、すべてのサービスから「その他」「Azure コンピューティング ギャラリー」の順に画面遷移します。
「MyGallery」という名前のギャラリーが作成された事を確認します。
VMイメージ定義の作成
仮想マシンのバージョン管理をする前に「VMイメージ定義」と呼ばれる入れ物のような設定が必要になります。注意すべきパラメタは以下の通りです。
パラメタ | 意味 |
---|---|
gallery-name | 仮想マシンの用途をあらわるような名前にすると分かりやすいでしょう。 |
os-type | LinuxかWindowsを指定します。 |
os-state | GeneralizedかSpecializedを指定します。Generalizedはホスト名やIPアドレスなどの仮想マシン固有の設定が削除され「一般化」されたイメージを表します。一方、Specializedは仮想マシン固有の設定が削除されず単純にコピーされたイメージを表します。 |
VMイメージ定義の作成例は以下の通りです。
az sig image-definition create \ --resource-group MyResourceGroup \ --gallery-name MyGallery \ --gallery-image-definition ApacheHttpdImage \ --publisher MyPublisher \ --offer MyOffer \ --sku MySKU \ --os-type Linux \ --os-state Generalized
「Azure ポータル」をブラウザで開き、Azure Image Galleryの「概要」画面に、「ApacheHttpdImage」という名前のVMイメージ定義が作成されている事を確認します。
コピー元となる仮想マシンの一般化
仮想マシンをコピーする前に、仮想マシンを一般化します。まず、一般化の前に割り当てを解除します。
az vm deallocate \ --resource-group MyResourceGroup \ --name linux020
仮想マシンを一般化します。
az vm generalize \ --resource-group MyResourceGroup \ --name linux020
確かに「一般化」された事を確認します。「code」が「OSState/generalized」と表示されている事を確認します。
admin@mac19 ~ % az vm get-instance-view \ --resource-group MyResourceGroup \ --name linux020 \ --query instanceView.statuses [ { "code": "OSState/generalized", "displayStatus": "VM generalized", "level": "Info", "message": null, "time": null }, { "code": "ProvisioningState/succeeded", "displayStatus": "Provisioning succeeded", "level": "Info", "message": null, "time": "2022-03-05T13:57:25.735200+00:00" }, { "code": "PowerState/deallocated", "displayStatus": "VM deallocated", "level": "Info", "message": null, "time": null } ]
VMイメージバージョンの作成
仮想マシン等の複製を作成しAzure Image Galleryでバージョン管理する事ができます。この複製の操作は「VMイメージバージョン」と呼ばれています。
複製元は仮想マシンだけでなくストレージアカウント内のVHDなど、様々なリソースをバージョン管理の対象として定義する事ができます。もし、仮想マシンを複製するならば、引数magaged-imageに仮想マシンのIDを指定します。操作例は以下の通りです。
VM_ID=$(az vm show \ --resource-group MyResourceGroup \ --name linux020 \ --query "id" \ --output tsv ) az sig image-version create \ --resource-group MyResourceGroup \ --gallery-name MyGallery \ --gallery-image-definition ApacheHttpdImage \ --gallery-image-version 1.0.0 \ --managed-image "${VM_ID}"
「Azure ポータル」をブラウザで開き、Azure Image Galleryの「概要」画面で、「ApacheHttpdImage」というVMイメージ定義名を押下します。
「VMイメージバージョン」の画面で、「1.0.0」というバージョンが作成された事を確認します。
仮想マシンの作成
Azure Image Galleryを使った仮想マシンをデプロイする場合は、引数imageにAzure Image Galleryのidを指定します。
IMAGE_ID=$(az sig image-version list \ --resource-group MyResourceGroup \ --gallery-name MyGallery \ --gallery-image-definition ApacheHttpdImage \ --query "[?name=='1.0.0'].id" \ --output tsv ) az vm create \ --resource-group MyResourceGroup \ --name linux030 \ --image "${IMAGE_ID}" \ --admin-username azureuser \ --ssh-key-values ~/.ssh/authorized_keys \ --vnet-name MyVnet \ --subnet MySubnet \ --nsg MyNsg \ --private-ip-address 172.16.0.30
操作ログは以下の通りです。仮想マシンに割り当てられたパブリックIPアドレスをメモに控えます。
admin@mac19 ~ % az vm create \ --resource-group MyResourceGroup \ --name linux030 \ --image "${IMAGE_ID}" \ --admin-username azureuser \ --ssh-key-values ~/.ssh/authorized_keys \ --vnet-name MyVnet \ --subnet MySubnet \ --nsg MyNsg \ --private-ip-address 172.16.0.30 It is recommended to use parameter "--public-ip-sku Standard" to create new VM with Standard public IP. Please note that the default public IP used for VM creation will be changed from Basic to Standard in the future. { "fqdns": "", "id": "/subscriptions/2e2f81a9-b030-410f-9784-c582580c932e/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/virtualMachines/linux030", "location": "japaneast", "macAddress": "00-22-48-68-38-63", "powerState": "VM running", "privateIpAddress": "172.16.0.30", "publicIpAddress": "23.102.90.103", "resourceGroup": "MyResourceGroup", "zones": "" }
ブラウザに前述の操作で確認したパブリックIPアドレスを入力し、httpdが起動している事を確認します。
Azure Compute Galleryの更新
新バージョンの追加
それではAzure Image Galleryで仮想マシンを更新する操作をやってみましょう。動作確認用の新バージョンの仮想マシンとして、先ほど作成したlinux030という仮想マシンにindex.htmlというファイルを配置します。
az vm run-command invoke \ --resource-group MyResourceGroup \ --name linux030 \ --command-id RunShellScript \ --scripts 'echo "It Works!" > /var/www/html/index.html'
仮想マシンの割り当てを解除し、一般化します。
az vm deallocate \ --resource-group MyResourceGroup \ --name linux030 az vm generalize \ --resource-group MyResourceGroup \ --name linux030
新バージョンの仮想マシンをversion 1.0.1として追加します。
VM_ID=$(az vm show \ --resource-group MyResourceGroup \ --name linux030 \ --query "id" \ --output tsv ) az sig image-version create \ --resource-group MyResourceGroup \ --gallery-name MyGallery \ --gallery-image-definition ApacheHttpdImage \ --gallery-image-version 1.0.1 \ --managed-image "${VM_ID}"
新バージョンの仮想マシンをデプロイします。
IMAGE_ID=$(az sig image-version list \ --resource-group MyResourceGroup \ --gallery-name MyGallery \ --gallery-image-definition ApacheHttpdImage \ --query "[?name=='1.0.1'].id" \ --output tsv ) az vm create \ --resource-group MyResourceGroup \ --name linux040 \ --image "${IMAGE_ID}" \ --admin-username azureuser \ --ssh-key-values ~/.ssh/authorized_keys \ --vnet-name MyVnet \ --subnet MySubnet \ --nsg MyNsg \ --private-ip-address 172.16.0.40
操作ログは以下の通りです。仮想マシンに割り当てられたパブリックIPアドレスをメモに控えます。
admin@mac19 ~ % az vm create \ --resource-group MyResourceGroup \ --name linux040 \ --image "${IMAGE_ID}" \ --admin-username azureuser \ --ssh-key-values ~/.ssh/authorized_keys \ --vnet-name MyVnet \ --subnet MySubnet \ --nsg MyNsg \ --private-ip-address 172.16.0.40 It is recommended to use parameter "--public-ip-sku Standard" to create new VM with Standard public IP. Please note that the default public IP used for VM creation will be changed from Basic to Standard in the future. { "fqdns": "", "id": "/subscriptions/2e2f81a9-b030-410f-9784-c582580c932e/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/virtualMachines/linux040", "location": "japaneast", "macAddress": "00-22-48-E8-6E-2D", "powerState": "VM running", "privateIpAddress": "172.16.0.40", "publicIpAddress": "20.89.57.251", "resourceGroup": "MyResourceGroup", "zones": "" }
ブラウザに前述の操作で確認したパブリックIPアドレスを入力し、index.htmlの設定が反映されている事を確認します。
イメージ定義の更新
一度作成したイメージ定義は、後からでも以下のようなパラメタを変更する事ができます。
- 推奨されるvCPU
- 推奨されるメモリ
- 説明
- 有効期限の終了日
有効期限の終了日を操作する例は以下の通りです。
az sig image-definition update \ --resource-group MyResourceGroup \ --gallery-name MyGallery \ --gallery-image-definition ApacheHttpdImage \ --set endOfLifeDate=2023-07-01T00:00:00+00:00
VMイメージバージョンの更新
一度作成したVMイメージバージョンは、後からでも以下のようなパラメタを変更する事ができます。
- リージョンのレプリカ数
- ターゲット リージョン
- 最新バージョンからの除外
- 有効期限の終了日
有効期限の終了日を操作する例は以下の通りです。
az sig image-version update \ --resource-group MyResourceGroup \ --gallery-name MyGallery \ --gallery-image-definition ApacheHttpdImage \ --gallery-image-version 1.0.0 \ --set publishingProfile.endOfLifeDate=2023-05-01T00:00:00+00:00
最新バージョンからの除外する例は以下の通りです。
az sig image-version update \ --resource-group MyResourceGroup \ --gallery-name MyGallery \ --gallery-image-definition ApacheHttpdImage \ --gallery-image-version 1.0.0 \ --set publishingProfile.excludeFromLatest=true
VMイメージバージョンの削除
旧バージョンの仮想マシンは誤って使用されないように削除する事もできます。削除の操作例は以下の通りです。
az sig image-version delete \ --resource-group MyResourceGroup \ --gallery-name MyGallery \ --gallery-image-definition ApacheHttpdImage \ --gallery-image-version 1.0.0
補足
専用イメージ
このページで主に説明したのは「一般化されたイメージ」の操作です。ホスト名やMACアドレスなど仮想マシン固有の値含めてコピーされた「専用イメージ」の場合は、やや操作が異なります。
専用イメージから仮想マシンを作成する場合は、specializedというオプションを付与してください。操作例は以下の通りです。
IMAGE_ID=$(az sig image-version list \ --resource-group MyResourceGroup \ --gallery-name MyGallery \ --gallery-image-definition <イメージ定義名> \ --query "[?name=='<バージョン番号>'].id" \ --output tsv ) az vm create \ --resource-group MyResourceGroup \ --name <仮想マシン名> \ --image "${IMAGE_ID}" \ --specialized
仮想マシン以外からイメージバージョンを作成する方法
このページでは仮想マシンからイメージバージョンを作成する方法を説明しました。実は、仮想マシン以外からもイメージバージョンを作成する事ができます。
別のイメージバージョンのディスクを元に作成する場合は、az sig image version createに以下オプションを指定します。
--managed-image <別のイメージバージョンのID>
スナップショットを元に作成する場合は、az sig image version createに以下オプションを指定します。
--os-snapshot <スナップショットのID>
ストレージアカウント内のVHDを元に作成する場合は、az sig image version createに以下オプションを指定します。
--os-vhd-uri <URI> --os-vhd-storage-account <ストレージアカウント名>