Azure Compute Galleryの使い方(仮想マシンの複製)

スポンサーリンク

Azure Compute Galleryは仮想マシンのイメージをバージョン管理し、そのイメージを元にデプロイする事ができます。cloud-initやAnsible等の自動化ではパッケージインストールなどの待ち時間が発生しますが、Azure Compute Galleryはインストール済みのイメージをコピーするため待ち時間が少なくなる傾向があります。このページでは、Azure Compute Galleryの使い方を説明します。

前提

公式ドキュメント

参考になる公式ドキュメントを以下に示します。

事前設定

リソースグループ

以下、リソースグループを作成します。

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 コンピューティング ギャラリー」の順に画面遷移します。

Azure Image Galleryの作成 01

「MyGallery」という名前のギャラリーが作成された事を確認します。

Azure Image Galleryの作成 02

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イメージ定義が作成されている事を確認します。

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イメージバージョンの作成 01

「VMイメージバージョン」の画面で、「1.0.0」というバージョンが作成された事を確認します。

VMイメージバージョンの作成 02

仮想マシンの作成

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が起動している事を確認します。

仮想マシンの動作確認 01

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の設定が反映されている事を確認します。

仮想マシンの動作確認 02

イメージ定義の更新

一度作成したイメージ定義は、後からでも以下のようなパラメタを変更する事ができます。

  • 推奨される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 <ストレージアカウント名>
タイトルとURLをコピーしました