PowerShell을 사용하여 VM Image Builder로 Windows VM 만들기

적용 대상: ✔️ Windows VM

이 문서에서는 Azure VM Image Builder PowerShell 모듈을 사용하여 사용자 지정된 Windows VM 이미지를 만드는 방법을 보여 줍니다.

필수 조건

Azure 구독이 없는 경우 시작하기 전에 체험 계정을 만듭니다.

PowerShell을 로컬로 사용하도록 선택하는 경우 이 문서에서는 Azure PowerShell 모듈을 설치하고 Connect-AzAccount cmdlet을 사용하여 Azure 계정에 연결해야 합니다. 자세한 내용은 Azure PowerShell 설치를 참조하세요.

일부 단계에는 Az.ImageBuilder 모듈의 cmdlet이 필요합니다. 다음 명령을 사용하여 별도로 설치합니다.

Install-Module -Name Az.ImageBuilder

Azure Cloud Shell

Azure는 브라우저를 통해 사용할 수 있는 대화형 셸 환경인 Azure Cloud Shell을 호스트합니다. Cloud Shell에서 Bash 또는 PowerShell을 사용하여 Azure 서비스 작업을 수행할 수 있습니다. 로컬 환경에 아무 것도 설치할 필요 없이 Azure Cloud Shell의 미리 설치된 명령을 사용하여 이 문서의 코드를 실행할 수 있습니다.

Azure Cloud Shell을 시작하려면 다음을 수행합니다.

옵션 예제/링크
코드 또는 명령 블록의 오른쪽 상단에서 시도를 선택합니다. 시도를 선택해도 코드 또는 명령이 Cloud Shell에 자동으로 복사되지 않습니다. Screenshot that shows an example of Try It for Azure Cloud Shell.
https://shell.azure.com으로 이동하거나 Cloud Shell 시작 단추를 선택하여 브라우저에서 Cloud Shell을 엽니다. Button to launch Azure Cloud Shell.
Azure Portal의 오른쪽 위에 있는 메뉴 모음에서 Cloud Shell 단추를 선택합니다. Screenshot that shows the Cloud Shell button in the Azure portal

Azure Cloud Shell을 사용하려면:

  1. Cloud Shell을 시작합니다.

  2. 코드 블록(또는 명령 블록)에서 복사 단추를 선택하여 코드 또는 명령을 복사합니다.

  3. Windows 및 Linux에서 Ctrl+Shift+V를 선택하거나 macOS에서 Cmd+Shift+V를 선택하여 코드 또는 명령을 Cloud Shell 세션에 붙여넣습니다.

  4. Enter를 선택하여 코드 또는 명령을 실행합니다.

여러 Azure 구독이 있는 경우 리소스에 대한 요금이 청구되는 적절한 구독을 선택합니다. Set-AzContext cmdlet을 사용하여 특정 구독을 선택합니다.

Set-AzContext -SubscriptionId 00000000-0000-0000-0000-000000000000

공급자 등록

아직 등록하지 않은 경우 Azure 구독에 사용할 다음 리소스 공급자를 등록합니다.

  • Microsoft.Compute
  • Microsoft.KeyVault
  • Microsoft.Storage
  • Microsoft.Network
  • Microsoft.VirtualMachineImages
  • Microsoft.ManagedIdentity
  • Microsoft.ContainerInstance
Get-AzResourceProvider -ProviderNamespace Microsoft.Compute, Microsoft.KeyVault, Microsoft.Storage, Microsoft.VirtualMachineImages, Microsoft.Network, Microsoft.ManagedIdentity |
  Where-Object RegistrationState -ne Registered |
    Register-AzResourceProvider

변수 정의

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

# Destination image resource group name
$imageResourceGroup = 'myWinImgBuilderRG'

# Azure region
$location = 'WestUS2'

# Name of the image to be created
$imageTemplateName = 'myWinImage'

# Distribution properties of the managed image upon completion
$runOutputName = 'myDistResults'

Azure 구독 ID에 대한 변수를 만듭니다. subscriptionID 변수에 구독 ID가 포함되어 있는지 확인하기 위해 다음 예의 두 번째 줄을 실행할 수 있습니다.

# Your Azure Subscription ID
$subscriptionID = (Get-AzContext).Subscription.Id
Write-Output $subscriptionID

리소스 그룹 만들기

New-AzResourceGroup cmdlet을 사용하여 Azure 리소스 그룹을 만듭니다. 리소스 그룹은 Azure 리소스가 그룹으로 배포되고 관리되는 논리 컨테이너입니다.

다음 예에서는 $location 변수에 지정한 지역의 $imageResourceGroup 변수 이름을 기반으로 리소스 그룹을 만듭니다. 해당 리소스 그룹은 이미지 구성 템플릿 아티팩트와 해당 이미지를 저장하는 데에 사용됩니다.

New-AzResourceGroup -Name $imageResourceGroup -Location $location

사용자 ID 만들기 및 역할 권한 설정

다음 예를 사용하여 지정된 리소스 그룹에 이미지를 만들 수 있는 Azure Image Builder 권한을 부여합니다. 이 권한이 없으면 이미지 빌드 프로세스가 성공적으로 완료되지 않습니다.

  1. 역할 정의 및 ID 이름에 대한 변수를 만듭니다. 이 기본값은 고유해야 합니다.

    [int]$timeInt = $(Get-Date -UFormat '%s')
    $imageRoleDefName = "Azure Image Builder Image Def $timeInt"
    $identityName = "myIdentity$timeInt"
    
  2. 사용자 ID를 만듭니다.

    New-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName -Location $location
    
  3. 변수에 ID 리소스 및 보안 주체 ID를 저장합니다.

    $identityNameResourceId = (Get-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName).Id
    $identityNamePrincipalId = (Get-AzUserAssignedIdentity -ResourceGroupName $imageResourceGroup -Name $identityName).PrincipalId
    

이미지를 배포하도록 ID에 필요한 권한 할당

  1. JSON 구성 파일을 다운로드하여 이 문서에 정의된 설정에 따라 수정합니다.

    $myRoleImageCreationUrl = 'https://raw.githubusercontent.com/azure/azvmimagebuilder/master/solutions/12_Creating_AIB_Security_Roles/aibRoleImageCreation.json'
    $myRoleImageCreationPath = "myRoleImageCreation.json"
    
    Invoke-WebRequest -Uri $myRoleImageCreationUrl -OutFile $myRoleImageCreationPath -UseBasicParsing
    
    $Content = Get-Content -Path $myRoleImageCreationPath -Raw
    $Content = $Content -replace '<subscriptionID>', $subscriptionID
    $Content = $Content -replace '<rgName>', $imageResourceGroup
    $Content = $Content -replace 'Azure Image Builder Service Image Creation Role', $imageRoleDefName
    $Content | Out-File -FilePath $myRoleImageCreationPath -Force
    
  2. 역할 정의를 만듭니다.

    New-AzRoleDefinition -InputFile $myRoleImageCreationPath
    
  3. VM Image Builder 서비스 주체에 역할 정의를 부여합니다.

    $RoleAssignParams = @{
      ObjectId = $identityNamePrincipalId
      RoleDefinitionName = $imageRoleDefName
      Scope = "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup"
    }
    New-AzRoleAssignment @RoleAssignParams
    

참고 항목

“New-AzRoleDefinition: 역할 정의 한도가 초과되었습니다. 더 이상 역할 정의를 만들 수 없습니다.” 오류가 표시되면 Azure RBAC(역할 기반 액세스 제어) 문제 해결을 참조하세요.

  1. 갤러리를 만듭니다.

    $myGalleryName = 'myImageGallery'
    $imageDefName = 'winSvrImages'
    
    New-AzGallery -GalleryName $myGalleryName -ResourceGroupName $imageResourceGroup -Location $location
    
  2. 갤러리 정의를 만듭니다.

    $GalleryParams = @{
      GalleryName = $myGalleryName
      ResourceGroupName = $imageResourceGroup
      Location = $location
      Name = $imageDefName
      OsState = 'generalized'
      OsType = 'Windows'
      Publisher = 'myCo'
      Offer = 'Windows'
      Sku = 'Win2019'
    }
    New-AzGalleryImageDefinition @GalleryParams
    

이미지 만들기

  1. VM Image Builder 원본 개체를 만듭니다. 유효한 매개 변수 값은 Azure PowerShell을 사용하여 Azure Marketplace에서 Windows VM 이미지 찾기를 참조하세요.

    $SrcObjParams = @{
      PlatformImageSource = $true
      Publisher = 'MicrosoftWindowsServer'
      Offer = 'WindowsServer'
      Sku = '2019-Datacenter'
      Version = 'latest'
    }
    $srcPlatform = New-AzImageBuilderTemplateSourceObject @SrcObjParams
    
  2. VM Image Builder 배포자 개체를 만듭니다.

    $disObjParams = @{
      SharedImageDistributor = $true
      ArtifactTag = @{tag='dis-share'}
      GalleryImageId = "/subscriptions/$subscriptionID/resourceGroups/$imageResourceGroup/providers/Microsoft.Compute/galleries/$myGalleryName/images/$imageDefName"
      ReplicationRegion = $location
      RunOutputName = $runOutputName
      ExcludeFromLatest = $false
    }
    $disSharedImg = New-AzImageBuilderTemplateDistributorObject @disObjParams
    
  3. VM Image Builder 사용자 지정 개체를 만듭니다.

    $ImgCustomParams01 = @{
      PowerShellCustomizer = $true
      Name = 'settingUpMgmtAgtPath'
      RunElevated = $false
      Inline = @("mkdir c:\\buildActions", "mkdir c:\\buildArtifacts", "echo Azure-Image-Builder-Was-Here  > c:\\buildActions\\buildActionsOutput.txt")
    }
    $Customizer01 = New-AzImageBuilderTemplateCustomizerObject @ImgCustomParams01
    
  4. 두 번째 VM Image Builder 사용자 지정 개체를 만듭니다.

    $ImgCustomParams02 = @{
      FileCustomizer = $true
      Name = 'downloadBuildArtifacts'
      Destination = 'c:\\buildArtifacts\\index.html'
      SourceUri = 'https://raw.githubusercontent.com/azure/azvmimagebuilder/master/quickquickstarts/exampleArtifacts/buildArtifacts/index.html'
    }
    $Customizer02 = New-AzImageBuilderTemplateCustomizerObject @ImgCustomParams02
    
  5. VM Image Builder 템플릿을 만듭니다.

    $ImgTemplateParams = @{
      ImageTemplateName = $imageTemplateName
      ResourceGroupName = $imageResourceGroup
      Source = $srcPlatform
      Distribute = $disSharedImg
      Customize = $Customizer01, $Customizer02
      Location = $location
      UserAssignedIdentityId = $identityNameResourceId
    }
    New-AzImageBuilderTemplate @ImgTemplateParams
    

템플릿을 만들면 메시지가 반환되고 $imageResourceGroup에 VM Image Builder 구성 템플릿이 만들어집니다.

템플릿 만들기 프로세스가 성공했는지 확인하려면 다음 예를 사용합니다.

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

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

Warning

준비 리소스 그룹을 바로 삭제하지 마세요. 이미지 템플릿 아티팩트를 삭제하면 준비 리소스 그룹도 삭제됩니다.

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

  • Azure VM Image Builder 실패 문제 해결을 참조하세요.

  • 템플릿 제출을 다시 시도하기 전에 다음 예에 따라 삭제합니다.

    Remove-AzImageBuilderTemplate -ImageTemplateName $imageTemplateName -ResourceGroupName $imageResourceGroup
    

이미지 빌드 시작하기

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

Start-AzImageBuilderTemplate -ResourceGroupName $imageResourceGroup -Name $imageTemplateName

이미지 빌드 프로세스가 완료될 때까지 기다립니다. 이 작업은 최대 1시간이 걸릴 수 있습니다.

오류가 발생하는 경우 Azure VM Image Builder 실패 문제 해결을 검토하세요.

VM 만들기

  1. VM 로그인 자격 증명을 변수에 저장합니다. 암호는 복잡해야 합니다.

    $Cred = Get-Credential
    
  2. 만든 이미지를 사용하여 VM을 만듭니다.

    $ArtifactId = (Get-AzImageBuilderTemplateRunOutput -ImageTemplateName $imageTemplateName -ResourceGroupName $imageResourceGroup).ArtifactId
    
    New-AzVM -ResourceGroupName $imageResourceGroup -Image $ArtifactId -Name myWinVM01 -Credential $Cred
    

사용자 지정 확인

  1. VM을 만들 때 설정한 사용자 이름 및 암호를 사용하여 VM에 대한 원격 데스크톱 연결을 만듭니다.

  2. VM 내에서 PowerShell을 열고 다음 예와 같이 Get-Content를 실행합니다.

    Get-Content -Path C:\buildActions\buildActionsOutput.txt
    

    출력은 이미지 사용자 지정 프로세스 중에 만든 파일의 콘텐츠를 기반으로 합니다.

    Azure-Image-Builder-Was-Here
    
  3. 동일한 PowerShell 세션에서 다음 예와 같이 c:\buildArtifacts\index.html이 있는지 확인하여 두 번째 사용자 지정이 성공적으로 완료되었는지 확인합니다.

    Get-ChildItem c:\buildArtifacts\
    

    결과는 이미지 사용자 지정 프로세스 중에 파일이 다운로드되었음을 보여 주는 디렉터리 목록이어야 합니다.

        Directory: C:\buildArtifacts
    
    Mode                 LastWriteTime         Length Name
    ----                 -------------         ------ ----
    -a---          29/01/2021    10:04            276 index.html
    

리소스 정리

이 프로세스 중에 만든 리소스가 더 이상 필요하지 않은 경우 다음을 수행하여 삭제할 수 있습니다.

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

    Remove-AzImageBuilderTemplate -ResourceGroupName $imageResourceGroup -Name $imageTemplateName
    
  2. 이미지 리소스 그룹을 삭제합니다.

    주의

    다음 예에서는 지정된 리소스 그룹과 해당 그룹에 포함된 모든 리소스를 삭제합니다. 리소스 그룹에 이 문서의 범위에 속하지 않는 리소스가 포함되어 있는 경우 해당 리소스도 삭제됩니다.

    Remove-AzResourceGroup -Name $imageResourceGroup
    

다음 단계

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