Azure CLI を使用して Linux イメージを作成し Azure Compute Gallery に配布する

適用対象: ✔️ Linux VM ✔️ フレキシブルなスケール セット

この記事では、Azure VM Image Builder と Azure CLI を使用して Azure Compute Gallery (旧称 Shared Image Gallery) でイメージ バージョンを作成し、そのイメージをグローバルに配布する方法について説明します。 Azure PowerShell を利用してイメージ バージョンを作成することもできます。

この記事では、サンプルの JSON テンプレートを使用して、イメージを構成します。 JSON ファイルは helloImageTemplateforSIG.json にあります。

イメージを Azure Compute Gallery に配布するため、テンプレートでは distribute セクションの値として sharedImage が使われています。

プロバイダーを登録する

VM Image Builder を使用するには、プロバイダーを登録する必要があります。 次のコマンドを実行して登録状況を確認します。

az provider show -n Microsoft.VirtualMachineImages -o json | grep registrationState
az provider show -n Microsoft.KeyVault -o json | grep registrationState
az provider show -n Microsoft.Compute -o json | grep registrationState
az provider show -n Microsoft.Storage -o json | grep registrationState
az provider show -n Microsoft.Network -o json | grep registrationState
az provider show -n Microsoft.ContainerInstance -o json | grep registrationState

出力で、登録済みにならない場合は、次のコマンドを実行します。

az provider register -n Microsoft.VirtualMachineImages
az provider register -n Microsoft.Compute
az provider register -n Microsoft.KeyVault
az provider register -n Microsoft.Storage
az provider register -n Microsoft.Network
az provider register -n Microsoft.ContainerInstance

変数とアクセス許可の設定

いくつかの情報を繰り返し使用するので、その情報を格納するいくつかの変数を作成します。

VM Image Builder では、ソース マネージド イメージと同じリソース グループ内にのみ、カスタム イメージを作成できます。 次の例では、ソース マネージド イメージと同じリソース グループになるように、リソース グループ名を更新します。

# Resource group name - ibLinuxGalleryRG in this example
sigResourceGroup=ibLinuxGalleryRG
# Datacenter location - West US 2 in this example
location=westus2
# Additional region to replicate the image to - East US in this example
additionalregion=eastus
# Name of the Azure Compute Gallery - myGallery in this example
sigName=myIbGallery
# Name of the image definition to be created - myImageDef in this example
imageDefName=myIbImageDef
# Reference name in the image distribution metadata
runOutputName=aibLinuxSIG

サブスクリプション ID の変数を作成します。

subscriptionID=$(az account show --query id --output tsv)

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

az group create -n $sigResourceGroup -l $location

ユーザー割り当て ID を作成し、リソース グループにアクセス許可を設定する

VM Image Builder は、指定されたユーザー ID を使用して、Azure Compute Gallery にイメージを挿入します。 この例では、イメージを配布するための特定のアクションを使用して、Azure ロールの定義を作成します。 このロール定義はその後、ユーザー ID に割り当てられます。

# Create user-assigned identity for VM Image Builder to access the storage account where the script is stored
identityName=aibBuiUserId$(date +'%s')
az identity create -g $sigResourceGroup -n $identityName

# Get the identity ID
imgBuilderCliId=$(az identity show -g $sigResourceGroup -n $identityName --query clientId -o tsv)

# Get the user identity URI that's needed for the template
imgBuilderId=/subscriptions/$subscriptionID/resourcegroups/$sigResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/$identityName

# Download an Azure role-definition template, and update the template with the parameters that were specified earlier
curl https://raw.githubusercontent.com/Azure/azvmimagebuilder/master/solutions/12_Creating_AIB_Security_Roles/aibRoleImageCreation.json -o aibRoleImageCreation.json

imageRoleDefName="Azure Image Builder Image Def"$(date +'%s')

# Update the definition
sed -i -e "s/<subscriptionID>/$subscriptionID/g" aibRoleImageCreation.json
sed -i -e "s/<rgName>/$sigResourceGroup/g" aibRoleImageCreation.json
sed -i -e "s/Azure Image Builder Service Image Creation Role/$imageRoleDefName/g" aibRoleImageCreation.json

# Create role definitions
az role definition create --role-definition ./aibRoleImageCreation.json

# Grant a role definition to the user-assigned identity
az role assignment create \
    --assignee $imgBuilderCliId \
    --role "$imageRoleDefName" \
    --scope /subscriptions/$subscriptionID/resourceGroups/$sigResourceGroup

Azure Compute Gallery で VM Image Builder を使用するには、既存のギャラリーとイメージ定義が必要です。 VM Image Builder では、ギャラリーとイメージ定義は自動的には作成されません。

使用するギャラリーとイメージ定義がまだない場合は、最初に作成します。

まず、ギャラリーを作成します。

az sig create \
    -g $sigResourceGroup \
    --gallery-name $sigName

次に、イメージ定義を作成します。

az sig image-definition create \
   -g $sigResourceGroup \
   --gallery-name $sigName \
   --gallery-image-definition $imageDefName \
   --publisher myIbPublisher \
   --offer myOffer \
   --sku 20_04-lts-gen2 \
   --os-type Linux \
   --hyper-v-generation V2 \
   --features SecurityType=TrustedLaunchSupported

JSON ファイルのダウンロードと構成

JSON テンプレートをダウンロードし、変数を使用して構成します。

curl https://raw.githubusercontent.com/Azure/azvmimagebuilder/master/quickquickstarts/1_Creating_a_Custom_Linux_Shared_Image_Gallery_Image/helloImageTemplateforSIG.json -o helloImageTemplateforSIG.json
sed -i -e "s/<subscriptionID>/$subscriptionID/g" helloImageTemplateforSIG.json
sed -i -e "s/<rgName>/$sigResourceGroup/g" helloImageTemplateforSIG.json
sed -i -e "s/<imageDefName>/$imageDefName/g" helloImageTemplateforSIG.json
sed -i -e "s/<sharedImageGalName>/$sigName/g" helloImageTemplateforSIG.json
sed -i -e "s/<region1>/$location/g" helloImageTemplateforSIG.json
sed -i -e "s/<region2>/$additionalregion/g" helloImageTemplateforSIG.json
sed -i -e "s/<runOutputName>/$runOutputName/g" helloImageTemplateforSIG.json
sed -i -e "s%<imgBuilderId>%$imgBuilderId%g" helloImageTemplateforSIG.json

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

このセクションでは、ギャラリーにイメージ バージョンを作成します。

Azure VM Image Builder サービスにイメージ構成を送信します。

az resource create \
    --resource-group $sigResourceGroup \
    --properties @helloImageTemplateforSIG.json \
    --is-full-object \
    --resource-type Microsoft.VirtualMachineImages/imageTemplates \
    -n helloImageTemplateforSIG01

イメージのビルドを開始します。

az resource invoke-action \
     --resource-group $sigResourceGroup \
     --resource-type  Microsoft.VirtualMachineImages/imageTemplates \
     -n helloImageTemplateforSIG01 \
     --action Run

イメージを作成し、両方のリージョンにレプリケートするまでに少し時間がかかる場合があります。 この部分が終了するまで待ってから、VM の作成に進みます。

VM を作成する

VM Image Builder で作成されたイメージ バージョンから VM を作成します。

az vm create \
  --resource-group $sigResourceGroup \
  --name myAibGalleryVM \
  --admin-username aibuser \
  --location $location \
  --image "/subscriptions/$subscriptionID/resourceGroups/$sigResourceGroup/providers/Microsoft.Compute/galleries/$sigName/images/$imageDefName/versions/latest" \
  --security-type TrustedLaunch \
  --generate-ssh-keys

Secure Shell (SSH) 経由で VM に接続します。

ssh aibuser@<publicIpAddress>

SSH 接続が確立されるとすぐに、イメージが当日のメッセージでカスタマイズされたことがわかります。

*******************************************************
**            This VM was built from the:            **
**      !! AZURE VM IMAGE BUILDER Custom Image !!    **
**         You have just been Customized :-)         **
*******************************************************

リソースをクリーンアップする

Note

同じイメージの新しいバージョンを作成するように、イメージ バージョンを再カスタマイズしてみる場合は、ここで説明する手順をスキップしてVM Image Builder を使用した別のイメージ バージョンの作成に関するページに進みます。

この記事のプロセスに従って作成したリソースが不要になった場合は、次の手順を実行してリソースを削除できます。

このプロセスにより、作成したイメージと他のすべてのリソース ファイルの両方が削除されます。 リソースを削除する前に、このデプロイが完了していることを確認してください。

ギャラリー リソースを削除する場合、それらの作成に使用したイメージ定義を削除する前に、すべてのイメージ バージョンを削除する必要があります。 ギャラリーを削除するには、最初にギャラリー内のすべてのイメージ定義を削除していることが必要です。

  1. VM Image Builder テンプレートを削除します。

    az resource delete \
        --resource-group $sigResourceGroup \
        --resource-type Microsoft.VirtualMachineImages/imageTemplates \
        -n helloImageTemplateforSIG01
    
  2. アクセス許可の割り当て、ロール、および ID を削除します。

    az role assignment delete \
        --assignee $imgBuilderCliId \
        --role "$imageRoleDefName" \
        --scope /subscriptions/$subscriptionID/resourceGroups/$sigResourceGroup
    
    az role definition delete --name "$imageRoleDefName"
    
    az identity delete --ids $imgBuilderId
    
  3. VM Image Builder によって作成されたイメージ バージョン (常に 0. から始まります) を取得し、削除します。

    sigDefImgVersion=$(az sig image-version list \
    -g $sigResourceGroup \
    --gallery-name $sigName \
    --gallery-image-definition $imageDefName \
    --subscription $subscriptionID --query [].'name' -o json | grep 0. | tr -d '"')
    az sig image-version delete \
    -g $sigResourceGroup \
    --gallery-image-version $sigDefImgVersion \
    --gallery-name $sigName \
    --gallery-image-definition $imageDefName \
    --subscription $subscriptionID
    
  4. イメージ定義を削除します。

    az sig image-definition delete \
    -g $sigResourceGroup \
    --gallery-name $sigName \
    --gallery-image-definition $imageDefName \
    --subscription $subscriptionID
    
  5. ギャラリーを削除します。

    az sig delete -r $sigName -g $sigResourceGroup
    
  6. リソース グループを削除します。

    az group delete -n $sigResourceGroup -y
    

次のステップ

Azure Compute Gallery の詳細を確認してください。