Azure VM Image Builder를 사용하여 Windows VM 만들기

적용 대상: ✔️ Windows VM

이 문서에서는 Azure VM Image Builder를 사용하여 사용자 지정된 Windows 이미지를 만드는 방법을 알아봅니다. 본 문서의 예제는 이미지 사용자 지정에 사용자 지정자를 사용합니다.

  • PowerShell(ScriptUri): PowerShell 스크립트를 다운로드하여 실행합니다.
  • Windows 다시 시작: VM을 다시 시작합니다.
  • PowerShell(인라인): 특정 명령을 실행합니다. 이 예에서는 mkdir c:\\buildActions를 사용하여 VM에 디렉터리를 만듭니다.
  • 파일: GitHub에서 VM으로 파일을 복사합니다. 본 예제에서는 index.md를 VM의 c:\buildArtifacts\index.html에 복사합니다.
  • buildTimeoutInMinutes: 빌드 시간을 분 단위로 지정합니다. 기본값은 240분이며 더 오래 실행되는 빌드를 허용하도록 늘릴 수 있습니다. 최소 허용 값은 6분입니다. 6분보다 짧은 값은 오류가 발생합니다.
  • vmProfile: vmSize 및 네트워크 속성을 지정합니다.
  • osDiskSizeGB: 이미지 크기를 늘리는 데 사용할 수 있습니다.
  • identity. 빌드 중에 사용할 VM Image Builder의 ID를 제공합니다.

helloImageTemplateWin.json 샘플 JSON 템플릿을 사용하여 이미지를 구성합니다.

참고 항목

Windows 사용자는 Bash를 사용하여 Azure Cloud Shell에서 다음 Azure CLI 예를 실행할 수 있습니다.

공급자 등록

VM Image Builder를 사용하려면 해당 기능을 등록해야 합니다. 다음 명령을 실행하여 등록을 확인합니다.

az provider show -n Microsoft.VirtualMachineImages | grep registrationState
az provider show -n Microsoft.KeyVault | grep registrationState
az provider show -n Microsoft.Compute | grep registrationState
az provider show -n Microsoft.Storage | grep registrationState
az provider show -n Microsoft.Network | 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

변수 설정

일부 정보를 반복적으로 사용하게 되므로 해당 정보를 저장할 변수를 만듭니다.

# Resource group name - we're using myImageBuilderRG in this example
imageResourceGroup='myWinImgBuilderRG'
# Region location
location='WestUS2'
# Run output name
runOutputName='aibWindows'
# The name of the image to be created
imageName='aibWinImage'

구독 ID에 대한 변수를 만듭니다.

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

리소스 그룹 만들기

이미지 구성 템플릿 아티팩트와 이미지를 저장하려면 다음 리소스 그룹을 사용합니다.

az group create -n $imageResourceGroup -l $location

사용자 할당 ID 만들기 및 리소스 그룹에 대한 사용 권한 설정

VM Image Builder는 제공된 사용자 ID를 사용하여 이미지를 리소스 그룹에 삽입합니다. 이 예에서는 이미지 배포에 대한 특정 권한이 있는 Azure 역할 정의를 만듭니다. 그런 다음, 역할 정의가 사용자 ID에 할당됩니다.

사용자 할당 관리 ID 만들고 사용 권한 부여하기

VM Image Builder가 스크립트가 저장된 스토리지 계정에 액세스할 수 있도록 사용자 할당 ID를 만듭니다.

identityName=aibBuiUserId$(date +'%s')
az identity create -g $imageResourceGroup -n $identityName

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

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

# Download the preconfigured role definition example
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>%$imageResourceGroup%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/$imageResourceGroup

이미지 구성 템플릿 다운로드

시도해 볼 수 있도록 매개 변수가 있는 이미지 구성 템플릿을 만들었습니다. JSON 파일 예를 다운로드한 다음 이전에 설정한 변수로 구성합니다.

curl https://raw.githubusercontent.com/azure/azvmimagebuilder/master/quickquickstarts/0_Creating_a_Custom_Windows_Managed_Image/helloImageTemplateWin.json -o helloImageTemplateWin.json

sed -i -e "s%<subscriptionID>%$subscriptionID%g" helloImageTemplateWin.json
sed -i -e "s%<rgName>%$imageResourceGroup%g" helloImageTemplateWin.json
sed -i -e "s%<region>%$location%g" helloImageTemplateWin.json
sed -i -e "s%<imageName>%$imageName%g" helloImageTemplateWin.json
sed -i -e "s%<runOutputName>%$runOutputName%g" helloImageTemplateWin.json
sed -i -e "s%<imgBuilderId>%$imgBuilderId%g" helloImageTemplateWin.json

vi와 같은 텍스트 편집기를 사용하여 터미널에서 이 예를 편집할 수 있습니다.

vi helloImageTemplateWin.json

참고 항목

원본 이미지의 경우 항상 버전을 지정합니다. latest를 버전으로 지정할 수 없습니다.

이미지가 배포되는 리소스 그룹을 추가하거나 변경하는 경우 리소스 그룹에 대해 권한이 설정되었는지 확인합니다.

이미지 만들기

다음 명령을 실행하여 VM Image Builder 서비스에 이미지 구성을 제출합니다.

az resource create \
    --resource-group $imageResourceGroup \
    --properties @helloImageTemplateWin.json \
    --is-full-object \
    --resource-type Microsoft.VirtualMachineImages/imageTemplates \
    -n helloImageTemplateWin01

완료되면 콘솔에 성공 메시지가 반환되고 VM Image Builder 구성 템플릿이 $imageResourceGroup에 만들어집니다. 리소스 그룹에서 이 리소스를 보려면 Azure Portal로 이동한 다음 숨겨진 형식 표시를 사용하도록 설정합니다.

VM Image Builder는 또한 백그라운드에서 구독에 준비 리소스 그룹을 만듭니다. 이 리소스 그룹은 IT_<DestinationResourceGroup>_<TemplateName> 형식으로 이미지를 빌드하는 데 사용됩니다.

참고 항목

준비 리소스 그룹을 바로 삭제하지 마세요. 먼저 이미지 템플릿 아티팩트를 삭제하여 스테이징 리소스 그룹을 삭제합니다.

이미지 구성 템플릿을 제출할 때 서비스가 실패를 보고하는 경우 다음을 수행합니다.

az resource delete \
    --resource-group $imageResourceGroup \
    --resource-type Microsoft.VirtualMachineImages/imageTemplates \
    -n helloImageTemplateWin01

이미지 빌드 시작하기

az resource invoke-action을 사용하여 이미지 빌드 프로세스를 시작합니다.

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

작업이 완료될 때까지 기다리세요.

오류가 발생하면 Azure VM Image Builder 서비스 문제 해결을 참조하세요.

VM 만들기

빌드한 이미지를 사용하여 VM을 만듭니다. 다음 코드에서 <암호>를 VM의 aibuser에 대한 자신의 암호로 바꿉니다.

az vm create \
  --resource-group $imageResourceGroup \
  --name aibImgWinVm00 \
  --admin-username aibuser \
  --admin-password <password> \
  --image $imageName \
  --location $location

사용자 지정 확인

VM을 만들 때 설정한 사용자 이름 및 암호를 사용하여 VM에 대한 원격 데스크톱 연결을 만듭니다. VM에서 명령 프롬프트 창을 열고 다음을 입력합니다.

dir c:\

이미지 사용자 지정 중에 다음 두 디렉터리가 만들어집니다.

  • buildActions
  • buildArtifacts

리소스 정리

완료되면 만든 리소스를 삭제합니다.

  1. VM Image Builder 템플릿을 삭제합니다.

    az resource delete \
        --resource-group $imageResourceGroup \
        --resource-type Microsoft.VirtualMachineImages/imageTemplates \
        -n helloImageTemplateWin01
    
  2. 역할 할당, 역할 정의, 사용자 ID를 삭제합니다.

    az role assignment delete \
        --assignee $imgBuilderCliId \
        --role "$imageRoleDefName" \
        --scope /subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup
    
    az role definition delete --name "$imageRoleDefName"
    
    az identity delete --ids $imgBuilderId
    
  3. 이미지 리소스 그룹을 삭제합니다.

    az group delete -n $imageResourceGroup
    

다음 단계

이 문서에서 사용하는 JSON 파일의 구성 요소에 대해 자세히 알아보려면 VM Image Builder 템플릿 참조를 확인하세요.