Share via


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 Image Builder는 다음과 같은 특징이 있어서 VM 이미지를 만드는 복잡성이 감소합니다.

  • VM 이미지를 만들기 위해 복잡한 도구, 프로세스 및 수동 단계를 사용할 필요가 없습니다. VM Image Builder는 이미지(Sysprep)를 일반화해야 하는 필요성과 같은 모든 세부 사항과 Azure 관련 요구 사항을 없애고 숨깁니다. 그리고 상급 사용자에게 이러한 요구 사항을 재정의할 수 있는 기능을 제공합니다.

  • 클릭 및 이동 환경을 위해 기존 이미지 빌드 파이프라인과 함께 작동합니다. 파이프라인에서 VM Image Builder를 호출하거나 Azure VM Image Builder 서비스 DevOps 작업을 사용할 수 있습니다.

  • 다양한 원본에서 사용자 지정 데이터를 가져오므로 한 곳에서 모든 데이터를 수집할 필요가 없습니다.

  • 이미지를 전역적으로 배포, 복제, 버전 관리 및 크기 조정하기 위한 이미지 관리 시스템을 만드는 Azure Compute Gallery와 통합합니다. 또한 동일한 결과 이미지를 처음부터 다시 빌드하지 않고 가상 하드 디스크로 배포하거나 하나 이상의 관리되는 이미지로 배포할 수 있습니다.

Important

Microsoft 개발 상자는 사용하도록 설정된 보안 형식 신뢰할 수 있는 시작를 사용하는 이미지만 지원합니다.

필수 조건

VM Image Builder를 사용하여 만든 사용자 지정 이미지를 프로비전하려면 다음이 필요합니다.

첫 번째 단계는 Azure VM Image Builder 및 Azure PowerShell을 사용하여 Azure Compute Gallery에서 이미지 버전을 만든 다음, 이미지를 전역적으로 배포하는 것입니다. Azure CLI를 사용하여 이 작업을 수행할 수도 있습니다.

  1. 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 
    
  2. PowerShell 모듈을 설치합니다.

    'Az.ImageBuilder', 'Az.ManagedServiceIdentity' | ForEach-Object {Install-Module -Name $_ -AllowPrerelease}
    
  3. 두 번 이상 사용하는 정보를 저장하는 변수를 만듭니다.

    1. 다음 샘플 코드를 복사합니다.
    2. <Resource group>을 개발자 센터를 만드는 데 사용한 리소스 그룹으로 바꿉니다.
    3. 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"  
    
  4. PowerShell에서 다음 코드를 실행하여 사용자 할당 ID를 만들고 리소스 그룹에 대한 권한을 설정합니다.

    VM Image Builder는 제공된 사용자 ID를 사용하여 이미지를 Azure Compute Gallery에 삽입합니다. 다음 예에서는 이미지 배포에 대한 특정 작업을 사용하여 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
    
  5. 이미지를 배포하도록 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 Gallery와 함께 VM Image Builder를 사용하려면 기존 갤러리 및 이미지 정의가 있어야 합니다. VM Image Builder는 갤러리와 이미지 정의를 자동으로 만들지 않습니다.

  1. 다음 명령을 실행하여 새 갤러리와 이미지 정의를 만듭니다.

    이 코드는 신뢰할 수 있는 시작 보안 형식으로 정의를 만들고 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" 
    
  2. c:/temp/mytemplate.txt와 같은 템플릿 정의를 저장할 파일을 만듭니다.

  3. 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>"
                   ]
                }
             ]
          }
         }
       ]
      }
    

    다음 단계로 진행하기 전에 템플릿 파일을 닫습니다.

  4. 변수를 사용하여 새 템플릿을 구성합니다.

    <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 
    
  5. 템플릿을 서비스에 제출합니다.

    다음 명령은 스크립트와 같은 모든 종속 아티팩트를 다운로드하여 준비 리소스 그룹에 저장합니다. 스테이징 리소스 그룹에는 IT_ 접두사가 있습니다.

    New-AzResourceGroupDeployment  -ResourceGroupName $imageResourceGroup  -TemplateFile $templateFilePath  -Api-Version "2020-02-14"  -imageTemplateName $imageTemplateName  -svclocation $location 
    
  6. 템플릿에서 Run 명령을 호출하여 이미지를 빌드합니다.

    실행 프로세스를 확인하라는 메시지가 나타나면 를 입력합니다.

    Invoke-AzResourceAction  -ResourceName $imageTemplateName  -ResourceGroupName $imageResourceGroup  -ResourceType Microsoft.VirtualMachineImages/imageTemplates  -ApiVersion "2020-02-14"  -Action Run
    

    Important

    이미지를 만들고 두 지역에 복제하는 데는 다소 시간이 걸릴 수 있습니다. PowerShell과 Azure Portal 간의 진행 보고에 차이가 있을 수 있습니다. 개발 상자 정의 만들기를 시작하기 전에 프로세스가 완료될 때까지 기다립니다.

  7. 실행 상태 및 프로비전 상태를 포함하여 새로 빌드된 이미지에 대한 정보를 가져옵니다.

    Get-AzImageBuilderTemplate -ImageTemplateName $imageTemplateName -ResourceGroupName $imageResourceGroup | Select-Object -Property Name, LastRunStatusRunState, LastRunStatusMessage, ProvisioningState 
    

    샘플 출력:

    Name                 LastRunStatusRunState    LastRunStatusMessage   ProvisioningState
    ---------------------------------------------------------------------------------------
    vscodeWinTemplate                                                    Creating
    

    Azure Portal에서 이미지의 프로비전 상태를 볼 수도 있습니다. 갤러리로 이동하여 이미지 정의를 확인합니다.

    Screenshot that shows the provisioning state of the customized image version.

사용자 지정 이미지가 갤러리에 프로비전된 후 개발자 센터의 이미지를 사용하도록 갤러리를 구성할 수 있습니다. 자세한 내용은 Azure Compute Gallery 구성을 참조하세요.

사용자 지정 이미지로 Microsoft 개발 상자 설정

개발자 센터에서 갤러리 이미지를 사용할 수 있게 되면 Microsoft 개발 상자에서 사용자 지정 이미지를 사용할 수 있습니다. 자세한 내용은 빠른 시작: Microsoft 개발 상자 구성을 참조하세요.