Linux 이미지를 만들어 Azure CLI를 사용해 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에 이미지를 배포하기 위해 이 템플릿에서는 sharedImage를 템플릿의 distribute 섹션 값으로 사용합니다.

공급자 등록

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

출력에 registered가 표시되지 않으면 다음 명령을 실행합니다.

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

SSH(Secure Shell)를 통해 VM에 연결합니다.

ssh aibuser@<publicIpAddress>

SSH 연결이 설정되는 즉시 오늘의 메시지로 이미지가 사용자 지정된 것을 볼 수 있을 것입니다.

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

리소스 정리

참고 항목

이미지 버전을 다시 사용자 지정하여 동일한 이미지의 새 버전을 만들려면 여기에 설명된 단계를 건너뛰고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에 대해 자세히 알아봅니다.