Azure VM Image Builder 및 Microsoft 개발 상자를 사용하여 개발 상자 구성
이 문서에서는 Azure VM Image Builder를 사용하여 템플릿을 사용하여 Microsoft 개발 상자에서 사용자 지정 개발 상자를 만듭니다. 템플릿에는 VISUAL STUDIO CODE(VS Code)를 설치하는 사용자 지정 단계가 포함되어 있습니다.
표준화된 VM(가상 머신) 이미지를 사용하면 클라우드로 마이그레이션할 때 일관된 배포를 보장할 수 있습니다. 이러한 이미지에는 미리 정의된 보안, 구성 설정 및 필요한 소프트웨어가 포함될 수 있습니다. 이미징 파이프라인 설정은 시간이 많이 걸리고 복잡할 수 있습니다. Azure VM Image Builder는 이미지에 대한 구성을 만들 수 있도록 하여 이 프로세스를 간소화합니다. 그러면 서비스가 개발 상자 프로젝트를 빌드하고 제출합니다.
수동으로 또는 다른 도구를 사용하여 사용자 지정 VM 이미지를 만드는 것은 어렵고 불안정할 수 있습니다. HashiCorp Packer를 기반으로 하는 VM Image Builder는 관리되는 서비스의 장점을 제공합니다.
VM 이미지 생성을 간소화하기 위해 VM 이미지 작성기:
- 복잡한 도구, 프로세스 및 수동 단계가 필요하지 않습니다. 이러한 세부 정보를 추상화하고 이미지 일반화(Sysprep)와 같은 Azure 관련 요구 사항을 숨기면서 고급 사용자가 필요한 경우 재정의할 수 있도록 합니다.
- 기존 이미지 빌드 파이프라인에서 작동합니다. 파이프라인에서 VM Image Builder를 호출하거나 Azure VM Image Builder 서비스 DevOps 작업을 사용할 수 있습니다.
- 다양한 원본에서 사용자 지정 데이터를 수집하므로 모든 데이터를 한 곳에서 수집할 필요가 없습니다.
- Azure Compute Gallery와 통합되어 전역 배포, 복제, 버전 관리 및 크기 조정을 위한 이미지 관리 시스템을 만듭니다. 가상 하드 디스크 또는 관리되는 이미지와 동일한 이미지를 다시 빌드하지 않고 배포할 수 있습니다.
Important
Microsoft 개발 상자는 사용하도록 설정된 보안 형식 신뢰할 수 있는 시작를 사용하는 이미지만 지원합니다.
필수 조건
VM Image Builder를 사용하여 만든 사용자 지정 이미지를 프로비전하려면 다음이 필요합니다.
- Azure PowerShell 6.0 이상 PowerShell이 설치되어 있지 않은 경우 Windows에 Azure PowerShell 설치의 단계를 따릅니다.
- Azure 구독 또는 특정 리소스 그룹에 대한 소유자 또는 기여자 권한입니다.
- 리소스 그룹
- 연결된 네트워크 연결이 있는 개발 센터입니다. 연결이 하나도 없으면 네트워크 연결을 구성하여 리소스에 개발 상자 연결의 단계를 따릅니다.
Windows 이미지를 만들어 Azure Compute Gallery에 배포합니다.
첫 번째 단계는 Azure VM Image Builder 및 Azure PowerShell을 사용하여 Azure Compute 갤러리에서 이미지를 만들고 전역적으로 배포하는 것입니다.
다음 예제에서는 PowerShell을 사용합니다. CLI(Azure 명령줄 인터페이스)를 사용할 수도 있습니다.
VM Image Builder를 사용하려면 기능을 등록해야 합니다.
공급자 등록을 확인합니다. 각 명령이 지정된 기능에 대해
Registered
를 반환하는지 확인합니다.Get-AzResourceProvider -ProviderNamespace Microsoft.VirtualMachineImages | Format-table -Property ResourceTypes,RegistrationState Get-AzResourceProvider -ProviderNamespace Microsoft.Storage | Format-table -Property ResourceTypes,RegistrationState Get-AzResourceProvider -ProviderNamespace Microsoft.Compute | Format-table -Property ResourceTypes,RegistrationState Get-AzResourceProvider -ProviderNamespace Microsoft.KeyVault | Format-table -Property ResourceTypes,RegistrationState Get-AzResourceProvider -ProviderNamespace Microsoft.Network | Format-table -Property ResourceTypes,RegistrationState
공급자 등록이
Registered
를 반환되지 않으면 다음 명령을 실행하여 공급자를 등록합니다.Register-AzResourceProvider -ProviderNamespace Microsoft.VirtualMachineImages Register-AzResourceProvider -ProviderNamespace Microsoft.Storage Register-AzResourceProvider -ProviderNamespace Microsoft.Compute Register-AzResourceProvider -ProviderNamespace Microsoft.KeyVault Register-AzResourceProvider -ProviderNamespace Microsoft.Network
PowerShell 모듈을 설치합니다.
'Az.ImageBuilder', 'Az.ManagedServiceIdentity' | ForEach-Object {Install-Module -Name $_ -AllowPrerelease}
두 번 이상 사용하는 정보를 저장하는 변수를 만듭니다.
- 다음 샘플 코드를 복사합니다.
<Resource group>
을 개발자 센터를 만드는 데 사용한 리소스 그룹으로 바꿉니다.- PowerShell에서 업데이트된 코드를 실행합니다.
# Get existing context $currentAzContext = Get-AzContext # Get your current subscription ID $subscriptionID=$currentAzContext.Subscription.Id # Destination image resource group $imageResourceGroup="<Resource group>" # Location $location="eastus2" # Image distribution metadata reference name $runOutputName="aibCustWinManImg01" # Image template name $imageTemplateName="vscodeWinTemplate"
PowerShell에서 다음 코드를 실행하여 사용자 할당 ID를 만들고 리소스 그룹에 대한 권한을 설정합니다.
VM Image Builder는 사용자가 제공하는 사용자 ID를 사용하여 Azure Compute 갤러리에 이미지를 저장합니다. 다음 예에서는 이미지 배포에 대한 특정 작업을 사용하여 Azure 역할 정의를 만듭니다. 그런 다음, 역할 정의가 사용자 ID에 할당됩니다.
# Set up role definition names, which need to be unique $timeInt=$(get-date -UFormat "%s") $imageRoleDefName="Azure Image Builder Image Def"+$timeInt $identityName="aibIdentity"+$timeInt # Add an Azure PowerShell module to support AzUserAssignedIdentity Install-Module -Name Az.ManagedServiceIdentity # Create an identity New-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName -Location $location $identityNameResourceId=$(Get-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName).Id $identityNamePrincipalId=$(Get-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName).PrincipalId
이미지를 배포하도록 ID에 필요한 권한 할당
이 명령을 사용하여 Azure 역할 정의 템플릿을 다운로드하고 이전에 지정한 매개 변수로 업데이트합니다.
$aibRoleImageCreationUrl="https://raw.githubusercontent.com/azure/azvmimagebuilder/master/solutions/12_Creating_AIB_Security_Roles/aibRoleImageCreation.json" $aibRoleImageCreationPath = "aibRoleImageCreation.json" # Download the configuration Invoke-WebRequest -Uri $aibRoleImageCreationUrl -OutFile $aibRoleImageCreationPath -UseBasicParsing ((Get-Content -path $aibRoleImageCreationPath -Raw) -replace '<subscriptionID>',$subscriptionID) | Set-Content -Path $aibRoleImageCreationPath ((Get-Content -path $aibRoleImageCreationPath -Raw) -replace '<rgName>', $imageResourceGroup) | Set-Content -Path $aibRoleImageCreationPath ((Get-Content -path $aibRoleImageCreationPath -Raw) -replace 'Azure Image Builder Service Image Creation Role', $imageRoleDefName) | Set-Content -Path $aibRoleImageCreationPath # Create a role definition New-AzRoleDefinition -InputFile ./aibRoleImageCreation.json # Grant the role definition to the VM Image Builder service principal New-AzRoleAssignment -ObjectId $identityNamePrincipalId -RoleDefinitionName $imageRoleDefName -Scope "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup"
갤러리 만들기
Azure Compute 갤러리에서 VM Image Builder를 사용하려면 기존 갤러리 및 이미지 정의가 있는지 확인합니다. VM Image Builder는 갤러리와 이미지 정의를 자동으로 만들지 않습니다.
다음 명령을 실행하여 새 갤러리와 이미지 정의를 만듭니다.
이 코드는 신뢰할 수 있는 시작 보안 형식으로 정의를 만들고 Windows 365 이미지 요구 사항을 충족합니다.
# Gallery name $galleryName= "devboxGallery" # Image definition name $imageDefName ="vscodeImageDef" # Additional replication region $replRegion2="eastus" # Create the gallery New-AzGallery -GalleryName $galleryName -ResourceGroupName $imageResourceGroup -Location $location $SecurityType = @{Name='SecurityType';Value='TrustedLaunch'} $features = @($SecurityType) # Create the image definition New-AzGalleryImageDefinition -GalleryName $galleryName -ResourceGroupName $imageResourceGroup -Location $location -Name $imageDefName -OsState generalized -OsType Windows -Publisher 'myCompany' -Offer 'vscodebox' -Sku '1-0-0' -Feature $features -HyperVGeneration "V2"
c:/temp/mytemplate.txt와 같은 템플릿 정의를 저장할 파일을 만듭니다.
VM Image Builder용 다음 Azure Resource Manager 템플릿을 새 템플릿 파일에 복사합니다.
이 템플릿은 원본 이미지 및 적용된 사용자 지정을 나타냅니다. Choco와 VS Code를 설치하고, 이미지 배포 위치도 표시합니다.
{ "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": { "imageTemplateName": { "type": "string" }, "api-version": { "type": "string" }, "svclocation": { "type": "string" } }, "variables": {}, "resources": [ { "name": "[parameters('imageTemplateName')]", "type": "Microsoft.VirtualMachineImages/imageTemplates", "apiVersion": "[parameters('api-version')]", "location": "[parameters('svclocation')]", "dependsOn": [], "tags": { "imagebuilderTemplate": "win11multi", "userIdentity": "enabled" }, "identity": { "type": "UserAssigned", "userAssignedIdentities": { "<imgBuilderId>": {} } }, "properties": { "buildTimeoutInMinutes": 100, "vmProfile": { "vmSize": "Standard_DS2_v2", "osDiskSizeGB": 127 }, "source": { "type": "PlatformImage", "publisher": "MicrosoftWindowsDesktop", "offer": "Windows-11", "sku": "win11-21h2-ent", "version": "latest" }, "customize": [ { "type": "PowerShell", "name": "Install Choco and Vscode", "inline": [ "Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))", "choco install -y vscode" ] } ], "distribute": [ { "type": "SharedImage", "galleryImageId": "/subscriptions/<subscriptionID>/resourceGroups/<rgName>/providers/Microsoft.Compute/galleries/<sharedImageGalName>/images/<imageDefName>", "runOutputName": "<runOutputName>", "artifactTags": { "source": "azureVmImageBuilder", "baseosimg": "win11multi" }, "replicationRegions": [ "<region1>", "<region2>" ] } ] } } ] }
다음 단계로 진행하기 전에 템플릿 파일을 닫습니다.
변수를 사용하여 새 템플릿을 구성합니다.
<Template Path>
를 템플릿 파일 위치(예:c:/temp/mytemplate
)로 바꿉니다.$templateFilePath = <Template Path> (Get-Content -path $templateFilePath -Raw ) -replace '<subscriptionID>',$subscriptionID | Set-Content -Path $templateFilePath (Get-Content -path $templateFilePath -Raw ) -replace '<rgName>',$imageResourceGroup | Set-Content -Path $templateFilePath (Get-Content -path $templateFilePath -Raw ) -replace '<runOutputName>',$runOutputName | Set-Content -Path $templateFilePath (Get-Content -path $templateFilePath -Raw ) -replace '<imageDefName>',$imageDefName | Set-Content -Path $templateFilePath (Get-Content -path $templateFilePath -Raw ) -replace '<sharedImageGalName>',$galleryName| Set-Content -Path $templateFilePath (Get-Content -path $templateFilePath -Raw ) -replace '<region1>',$location | Set-Content -Path $templateFilePath (Get-Content -path $templateFilePath -Raw ) -replace '<region2>',$replRegion2 | Set-Content -Path $templateFilePath ((Get-Content -path $templateFilePath -Raw) -replace '<imgBuilderId>',$identityNameResourceId) | Set-Content -Path $templateFilePath
템플릿을 서비스에 제출합니다.
다음 명령은 스크립트와 같은 모든 종속 아티팩트를 다운로드하여 준비 리소스 그룹에 저장합니다. 스테이징 리소스 그룹에는
IT_
접두사가 있습니다.New-AzResourceGroupDeployment -ResourceGroupName $imageResourceGroup -TemplateFile $templateFilePath -Api-Version "2020-02-14" -imageTemplateName $imageTemplateName -svclocation $location
템플릿에서
Run
명령을 호출하여 이미지를 빌드합니다.실행 프로세스를 확인하라는 메시지가 나타나면 예를 입력합니다.
Invoke-AzResourceAction -ResourceName $imageTemplateName -ResourceGroupName $imageResourceGroup -ResourceType Microsoft.VirtualMachineImages/imageTemplates -ApiVersion "2020-02-14" -Action Run
Important
이미지를 만들고 두 지역에 복제하는 데는 다소 시간이 걸릴 수 있습니다. PowerShell과 Azure Portal 간의 진행 보고에 차이가 있을 수 있습니다. 개발 상자 정의 만들기를 시작하기 전에 프로세스가 완료될 때까지 기다립니다.
실행 상태 및 프로비전 상태를 포함하여 새로 빌드된 이미지에 대한 정보를 가져옵니다.
Get-AzImageBuilderTemplate -ImageTemplateName $imageTemplateName -ResourceGroupName $imageResourceGroup | Select-Object -Property Name, LastRunStatusRunState, LastRunStatusMessage, ProvisioningState
샘플 출력:
Name LastRunStatusRunState LastRunStatusMessage ProvisioningState --------------------------------------------------------------------------------------- vscodeWinTemplate Creating
Azure Portal에서 이미지의 프로비전 상태를 볼 수도 있습니다. 갤러리로 이동하여 이미지 정의를 확인합니다.
갤러리 구성
사용자 지정 이미지가 갤러리에 저장되면 개발자 센터의 이미지를 사용하도록 갤러리를 구성할 수 있습니다. 자세한 내용은 Azure Compute Gallery 구성을 참조하세요.
사용자 지정 이미지로 Microsoft 개발 상자 설정
개발자 센터에서 갤러리 이미지를 사용할 수 있는 경우 Microsoft Dev Box에서 사용자 지정 이미지를 사용할 수 있습니다. 자세한 내용은 빠른 시작: Microsoft 개발 상자 구성을 참조하세요.