Azure Image Builder Bicep 또는 ARM 템플릿 JSON 템플릿 만들기

적용 대상: ✔️ Linux VM ✔️ Windows VM ✔️ 유연한 확장 집합

Azure Image Builder는 Bicep 파일 또는 ARM 템플릿 JSON 템플릿 파일을 사용하여 정보를 Image Builder 서비스에 전달합니다. 이 문서에서는 사용자 고유의 파일을 작성할 수 있도록 파일의 섹션을 살펴보겠습니다. 최신 API 버전은 템플릿 참조를 참조하세요. 전체 .json 파일의 예제를 보려면 Azure Image Builder GitHub참조하세요.

기본 형식은 다음과 같습니다.

{
  "type": "Microsoft.VirtualMachineImages/imageTemplates",
  "apiVersion": "2022-02-14",
  "location": "<region>",
  "tags": {
    "<name>": "<value>",
    "<name>": "<value>"
  },
  "identity": {},
  "properties": {
    "buildTimeoutInMinutes": <minutes>,
    "customize": [],
    "errorHandling":[],
    "distribute": [],
    "optimize": [],
    "source": {},
    "stagingResourceGroup": "/subscriptions/<subscriptionID>/resourceGroups/<stagingResourceGroupName>",
    "validate": {},
    "vmProfile": {
      "vmSize": "<vmSize>",
      "osDiskSizeGB": <sizeInGB>,
      "vnetConfig": {
        "subnetId": "/subscriptions/<subscriptionID>/resourceGroups/<vnetRgName>/providers/Microsoft.Network/virtualNetworks/<vnetName>/subnets/<subnetName>",
        "proxyVmSize": "<vmSize>"
      },
      "userAssignedIdentities": [
              "/subscriptions/<subscriptionID>/resourceGroups/<identityRgName>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<identityName1>",
        "/subscriptions/<subscriptionID>/resourceGroups/<identityRgName>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<identityName2>",
        "/subscriptions/<subscriptionID>/resourceGroups/<identityRgName>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<identityName3>",
        ...
      ]
    }
  }
}

형식 및 API 버전

type는 리소스 종류로, Microsoft.VirtualMachineImages/imageTemplates이어야 합니다. apiVersion은 시간이 지나면서 API가 변경됨에 따라 변경됩니다. Azure VM Image Builder 서비스에 대한 모든 주요 API 변경 및 기능 업데이트는 Azure VM Image Builder의 새로운 기능을 참조하세요.

"type": "Microsoft.VirtualMachineImages/imageTemplates",
"apiVersion": "2022-02-14",

위치

위치는 사용자 지정 이미지가 만들어지는 지역입니다. 다음 지역이 지원됩니다.

  • 미국 동부
  • 미국 동부 2
  • 미국 중서부
  • 미국 서부
  • 미국 서부 2
  • 미국 서부 3
  • 미국 중남부
  • 북유럽
  • 서유럽
  • 남부 동아시아
  • 오스트레일리아 남동부
  • 오스트레일리아 동부
  • 영국 남부
  • 영국 서부
  • 브라질 남부
  • 캐나다 중부
  • 인도 중부
  • 미국 중부
  • 프랑스 중부
  • 독일 중서부
  • 일본 동부
  • 미국 중북부
  • 노르웨이 동부
  • 스위스 북부
  • Jio 인도 서부
  • 아랍에미리트 북부
  • 동아시아
  • 한국 중부
  • 남아프리카 공화국 북부
  • 카타르 중부
  • USGov 애리조나(공개 미리 보기)
  • USGov 버지니아(공개 미리 보기)
  • 중국 북부 3(공개 미리 보기)
  • 스웨덴 중부
  • 폴란드 중부

Important

Azure Government 지역(USGov 애리조나 및 USGov 버지니아)에서 Azure Image Builder 공개 미리 보기에 액세스하려면 Microsoft.VirtualMachineImages/FairfaxPublicPreview 기능을 등록하세요.

Important

Microsoft.VirtualMachineImages/MooncakePublicPreview 기능을 등록하여 중국 북부 3 지역의 Azure Image Builder 공개 미리 보기에 액세스할 수 있습니다.

Azure Government 지역(USGov 애리조나 및 USGov 버지니아)에서 Azure VM Image Builder 공개 미리 보기에 액세스하려면 Microsoft.VirtualMachineImages/FairfaxPublicPreview 기능을 등록해야 합니다. 이렇게 하려면 PowerShell 또는 Azure CLI에서 다음 명령을 실행합니다.

Register-AzProviderPreviewFeature -ProviderNamespace Microsoft.VirtualMachineImages -Name FairfaxPublicPreview

중국 북부 3 지역의 Azure VM Image Builder 공개 미리 보기에 액세스하려면 Microsoft.VirtualMachineImages/MooncakePublicPreview 기능을 등록해야 합니다. 이렇게 하려면 PowerShell 또는 Azure CLI에서 다음 명령을 실행합니다.

Register-AzProviderPreviewFeature -ProviderNamespace Microsoft.VirtualMachineImages -Name MooncakePublicPreview
"location": "<region>"

데이터 보존

Azure VM Image Builder 서비스는 고객이 해당 지역에서 빌드를 요청할 때 엄격한 단일 지역 데이터 보존 요구 사항이 있는 지역 외부에서 고객 데이터를 저장 또는 처리하지 않습니다. 데이터 보존 요구 사항이 있는 지역에서 서비스가 중단되는 경우 다른 지역 및 지리적 위치에서 Bicep 파일/템플릿을 만들어야 합니다.

영역 중복

배포는 영역 중복을 지원하고 VHD는 기본적으로 ZRS(영역 중복 스토리지) 계정에 배포되며 Azure Compute Gallery(이전의 Shared Image Gallery) 버전은 지정된 경우 ZRS 스토리지 형식을 지원합니다.

태그

태그는 생성된 이미지에 대해 지정할 수 있는 키/값 쌍입니다.

ID

아래에 설명된 사용자 할당 ID를 추가하는 두 가지 방법이 있습니다.

Azure Image Builder 이미지 템플릿 리소스에 대한 사용자가 할당한 ID

필수 - Image Builder에 이미지 읽기/쓰기 및 Azure Storage의 스크립트 읽기 권한이 있으려면 개별 리소스에 대한 권한이 있는 Azure 사용자가 할당한 ID를 만들어야 합니다. Image Builder 권한의 작동 방식 및 관련 단계에 대한 자세한 내용은 이미지를 만들고 사용자가 할당한 관리 ID를 사용하여 Azure 스토리지 계정의 파일에 액세스를 참조하세요.

"identity": {
    "type": "UserAssigned",
    "userAssignedIdentities": {
        "<imgBuilderId>": {}
    }
}

Image Builder 서비스 사용자 할당 ID:

  • 단일 ID만 지원합니다.
  • 사용자 지정 도메인 이름을 지원하지 않습니다.

자세한 내용은 Azure 리소스에 대한 관리 ID란?을 참조하세요. 이 기능을 배포하는 방법에 대한 자세한 내용은 Azure CLI를 사용하여 Azure VM에서 Azure 리소스에 대한 관리 ID 구성을 참조하세요.

Image Builder Build VM에 대한 사용자가 할당한 ID

이 속성은 API 버전 2021-10-01 이상에서만 사용할 수 있습니다.

선택 사항 - 구독의 Image Builder 서비스에서 만든 Image Builder Build VM은 이미지를 빌드하고 사용자 지정하는 데 사용됩니다. Image Builder 빌드 VM이 구독의 Azure Key Vault와 같은 다른 서비스에 인증할 수 있는 권한을 가지려면 개별 리소스에 대한 권한이 있는 하나 이상의 Azure 사용자 할당 ID를 만들어야 합니다. 그런 다음 Azure Image Builder는 이러한 사용자 할당 ID를 빌드 VM과 연결할 수 있습니다. 그런 다음 Build VM 내에서 실행되는 사용자 지정 스크립트는 이러한 ID에 대한 토큰을 가져오고 필요에 따라 다른 Azure 리소스와 상호 작용할 수 있습니다. Azure Image Builder에 대한 사용자 할당 ID에는 Azure Image Builder에 대한 모든 사용자 할당 ID에 대한 “관리 ID 운영자” 역할 할당이 있어야 빌드 VM에 연결할 수 있습니다.

참고 항목

이미지 템플릿 리소스에 대해 만든 ID를 포함하여 Image Builder 빌드 VM에 대해 여러 ID를 지정할 수 있습니다. 기본적으로 이미지 템플릿 리소스에 대해 만든 ID는 빌드 VM에 자동으로 추가되지 않습니다.

"properties": {
  "vmProfile": {
    "userAssignedIdentities": [
      "/subscriptions/<subscriptionID>/resourceGroups/<identityRgName>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<identityName>"
    ]
  }
}

Image Builder 빌드 VM 사용자 할당 ID:

  • VM에서 구성할 하나 이상의 사용자가 할당한 관리 ID 목록을 지원합니다.
  • 구독 간 시나리오(이미지 템플릿이 동일한 테넌트의 다른 구독에서 만들어지는 동안 한 구독에서 만들어진 ID)를 지원합니다.
  • 테넌트 간 시나리오(이미지 템플릿이 다른 테넌트에서 만들어지는 동안 한 테넌트에서 만들어진 ID)를 지원하지 않습니다.

자세한 내용은 다음을 참조하세요.

속성: buildTimeoutInMinutes

이미지 템플릿을 빌드하는 동안 대기할 최대 기간입니다(모든 사용자 지정, 유효성 검사 및 배포 포함).

속성을 지정하지 않거나 값을 0으로 설정하면 기본값인 240분 또는 4시간이 사용됩니다. 최솟값은 6분이고, 최댓값은 960분 또는 16시간입니다. 시간 제한 값에 도달하면(이미지 빌드가 완료되었는지 여부에 관계없이) 다음과 비슷한 오류가 표시됩니다.

[ERROR] Failed while waiting for packerizer: Timeout waiting for microservice to
[ERROR] complete: 'context deadline exceeded'

Windows의 경우 buildTimeoutInMinutes를 60분 미만으로 설정하지 않는 것이 좋습니다. 시간 제한에 도달하면 로그를 검토하여 사용자 지정 단계가 사용자 입력과 같은 항목을 기다리고 있는지 확인합니다. 사용자 지정을 완료하는 데 더 많은 시간이 필요하면 buildTimeoutInMinutes 값을 늘립니다. 그러나 오류가 표시되기 전에 시간 초과될 때까지 기다려야 할 수 있으므로 너무 높게 설정하지 마세요.

속성: customize

Image Builder는 스크립트 실행 또는 서버 다시 부팅과 같이 이미지를 사용자 지정하는 데 사용되는 기능인 여러 "사용자 지정자"를 지원합니다.

사용 customize시:

  • 여러 사용자 지정자를 사용할 수 있습니다.
  • 사용자 지정자는 템플릿에 지정된 순서대로 실행됩니다.
  • 하나의 사용자 지정자가 실패하면 전체 사용자 지정 구성 요소가 실패하고 오류를 다시 보고합니다.
  • 템플릿에서 사용하기 전에 스크립트를 철저히 테스트합니다. 스크립트를 직접 디버그하는 것이 더 쉽습니다.
  • 스크립트에 중요한 데이터를 넣지 마세요. 인라인 명령은 이미지 템플릿 정의에서 볼 수 있습니다. 중요한 정보(암호, SAS 토큰, 인증 토큰 등 포함)가 있는 경우 액세스하려면 인증이 필요한 Azure Storage의 스크립트로 이동해야 합니다.
  • MSI를 사용하지 않는 경우 스크립트 위치는 공개적으로 액세스할 수 있어야 합니다.

customize 섹션은 배열입니다. 지원되는 사용자 지정자 유형은 File, PowerShell, Shell, WindowsRestart 및 WindowsUpdate입니다.

"customize": [
  {
    "type": "File",
    "destination": "string",
    "sha256Checksum": "string",
    "sourceUri": "string"
  },
  {
    "type": "PowerShell",
    "inline": [ "string" ],
    "runAsSystem": "bool",
    "runElevated": "bool",
    "scriptUri": "string",
    "sha256Checksum": "string",
    "validExitCodes": [ "int" ]
  },
  {
    "type": "Shell",
    "inline": [ "string" ],
    "scriptUri": "string",
    "sha256Checksum": "string"
  },
  {
    "type": "WindowsRestart",
    "restartCheckCommand": "string",
    "restartCommand": "string",
    "restartTimeout": "string"
  },
  {
    "type": "WindowsUpdate",
    "filters": [ "string" ],
    "searchCriteria": "string",
    "updateLimit": "int"
  }
]

셸 사용자 지정자

Shell 사용자 지정자는 Linux에서 셸 스크립트 실행을 지원합니다. 셸 스크립트는 공개적으로 액세스할 수 있어야 합니다. 또는 해당 스크립트에 액세스하려면 Image Builder에 대한 MSI를 구성해야 합니다.

"customize": [
  {
    "type": "Shell",
    "name": "<name>",
    "scriptUri": "<link to script>",
    "sha256Checksum": "<sha256 checksum>"
  }
],
"customize": [
  {
    "type": "Shell",
    "name": "<name>",
    "inline": "<commands to run>"
  }
]

사용자 지정 속성은 다음과 같습니다.

  • type – Shell

  • name - 사용자 지정을 추적하기 위한 이름

  • scriptUri - 파일 위치에 대한 URI

  • 인라인 - 쉼표로 구분된 셸 명령의 배열입니다.

  • sha256Checksum - 파일의 sha256 체크섬 값. 이 값을 로컬로 생성하면 Image Builder에서 체크섬 및 유효성 검사를 수행합니다.

    mac/Linux에서 터미널을 사용하여 sha256Checksum을 생성하려면 다음을 실행합니다. sha256sum <fileName>

참고 항목

인라인 명령은 이미지 템플릿 정의의 일부로 저장되며 이미지 정의를 덤프할 때 이를 볼 수 있습니다. 중요한 명령 또는 값(암호, SAS 토큰, 인증 토큰 등 포함)이 있는 경우 이러한 항목을 스크립트로 이동하고 사용자 ID를 사용하여 Azure Storage에 인증하는 것이 좋습니다.

슈퍼 사용자 권한

sudo 접두사를 명령 앞에 붙여 슈퍼 사용자 권한으로 해당 명령을 실행합니다. 명령을 스크립트에 추가하거나 인라인 명령을 사용할 수 있습니다. 예를 들어 다음과 같습니다.

"type": "Shell",
"name": "setupBuildPath",
"inline": [
    "sudo mkdir /buildArtifacts",
    "sudo cp /tmp/index.html /buildArtifacts/index.html"
]

scriptUri를 사용하여 참조할 수 있는 sudo를 사용하는 스크립트의 예:

#!/bin/bash -e

echo "Telemetry: creating files"
mkdir /myfiles

echo "Telemetry: running sudo 'as-is' in a script"
sudo touch /myfiles/somethingElevated.txt

Windows 다시 시작 사용자 지정자

WindowsRestart 사용자 지정자를 사용하면 Windows VM을 다시 시작하고 VM이 다시 온라인 상태가 될 때까지 기다릴 수 있습니다. 이 사용자 지정자를 사용하면 다시 부팅이 필요한 소프트웨어를 설치할 수 있습니다.

"customize": [
  {
    "type": "WindowsRestart",
    "restartCommand": "shutdown /r /f /t 0",
    "restartCheckCommand": "echo Azure-Image-Builder-Restarted-the-VM  > c:\\buildArtifacts\\azureImageBuilderRestart.txt",
    "restartTimeout": "5m"
  }
]

사용자 지정 속성은 다음과 같습니다.

  • type: WindowsRestart
  • restartCommand - 다시 시작을 실행하는 명령(선택 사항). 기본값은 'shutdown /r /f /t 0 /c \"packer restart\"'입니다.
  • restartCheckCommand – 다시 시작이 성공 했는지 확인하는 명령입니다(선택 사항).
  • restartTimeout - 크기 및 단위 문자열로 지정된 다시 시작 시간 제한입니다. 예를 들어 5m(5분) 또는 2h(2시간)입니다. 기본값은 5m입니다.

참고 항목

Linux 다시 시작 커스터마이저가 없습니다.

PowerShell 사용자 지정자

PowerShell 사용자 지정자는 Windows에서 PowerShell 스크립트 및 인라인 명령 실행을 지원하며, IB에서 스크립트에 액세스하려면 해당 스크립트에 공개적으로 액세스할 수 있어야 합니다.

"customize": [
  {
    "type": "PowerShell",
    "name":   "<name>",
    "scriptUri": "<path to script>",
    "runElevated": <true false>,
    "runAsSystem": <true false>,
    "sha256Checksum": "<sha256 checksum>"
  },
  {
    "type": "PowerShell",
    "name": "<name>",
    "inline": "<PowerShell syntax to run>",
    "validExitCodes": [<exit code>],
    "runElevated": <true or false>,
    "runAsSystem": <true or false>
  }
]

사용자 지정 속성은 다음과 같습니다.

  • type – PowerShell.

  • scriptUri - PowerShell 스크립트 파일의 위치에 대한 URI입니다.

  • inline - 실행할 인라인 명령이며 쉼표로 구분됩니다.

  • validExitCodes – 선택 사항이며, 스크립트/인라인 명령에서 반환될 수 있는 유효한 코드입니다. 이 속성은 보고된 스크립트/인라인 명령 오류를 방지합니다.

  • runElevated – 선택적, 부울, 관리자 권한으로 명령 및 스크립트 실행을 지원합니다.

  • runAsSystem - 선택 사항인 부울이며 PowerShell 스크립트를 시스템 사용자로 실행해야 하는지 여부를 결정합니다.

  • sha256Checksum - 파일의 SHA256 체크섬을 로컬로 생성하고 체크섬 값을 소문자로 업데이트하면 Image Builder가 이미지 템플릿 배포 중에 체크섬의 유효성을 검사합니다.

    sha256Checksum을 생성하려면 PowerShell에서 Get-FileHash cmdlet을 사용합니다.

파일 사용자 지정자

File 사용자 지정자를 사용하면 Image Builder에서 GitHub 리포지토리 또는 Azure 스토리지에서 파일을 다운로드할 수 있습니다. 사용자 지정자는 Linux와 Windows를 모두 지원합니다. 빌드 아티팩트를 사용하는 이미지 빌드 파이프라인이 있는 경우 빌드 공유에서 다운로드하도록 파일 사용자 지정자를 설정하고 아티팩트를 이미지로 이동할 수 있습니다.

"customize": [
  {
    "type": "File",
    "name": "<name>",
    "sourceUri": "<source location>",
    "destination": "<destination>",
    "sha256Checksum": "<sha256 checksum>"
  }
]

파일 사용자 지정자 속성:

  • sourceUri -액세스할 수 있는 스토리지 엔드포인트이며, 이 엔드포인트는 GitHub 또는 Azure 스토리지일 수 있습니다. 전체 디렉터리가 아닌 하나의 파일만 다운로드할 수 있습니다. 디렉터리를 다운로드해야 하는 경우 압축된 파일을 사용한 다음 셸 또는 PowerShell 사용자 지정자를 사용하여 압축을 풉

    참고 항목

    sourceUri가 Azure Storage 계정인 경우 Blob이 공용으로 표시되는지 여부에 관계없이 Blob에 대한 읽기 액세스 권한을 관리되는 사용자 ID에 부여합니다. 스토리지 권한을 설정하려면 이 예제를 참조하세요.

  • destination – 전체 대상 경로 및 파일 이름입니다. 참조된 경로 및 하위 디렉터리가 있어야 하며, 셸 또는 PowerShell 사용자 지정자를 사용하여 이러한 경로를 미리 설정합니다. 스크립트 사용자 지정자를 사용하여 경로를 만들 수 있습니다.

이 사용자 지정자는 Windows 디렉터리 및 Linux 경로에서 지원되지만, 다음과 같은 몇 가지 차이점이 있습니다.

  • Linux – 이미지 빌더에서 쓸 수 있는 유일한 경로는 /tmp입니다.
  • Windows – 경로 제한이 없지만 해당 경로가 존재해야 합니다.

파일을 다운로드하거나 지정된 디렉터리에 배치하는 동안 중에 오류가 발생하면 사용자 지정 단계가 실패하며, 이 오류는 customization.log에 기록됩니다.

참고 항목

파일 사용자 지정자는 20MB 이하 소용량 파일 다운로드에만 적합합니다. 더 큰 파일 다운로드의 경우 스크립트 또는 인라인 명령을 사용한 다음, 코드를 사용하여 Linux wget 또는 curlWindows와 같은 파일을 다운로드합니다 Invoke-WebRequest. Azure Storage에 있는 파일의 경우 Image Builder 빌드 VM에 대한 사용자 할당 ID 설명서에 따라 빌드 VM에 해당 파일을 볼 수 있는 권한이 있는 ID를 할당해야 합니다. Azure에 저장되지 않은 모든 파일은 Azure Image Builder가 다운로드할 수 있도록 공개적으로 액세스할 수 있어야 합니다.

  • sha256Checksum - 파일의 SHA256 체크섬을 로컬로 생성하고 체크섬 값을 소문자로 업데이트하면 Image Builder가 이미지 템플릿 배포 중에 체크섬의 유효성을 검사합니다.

    sha256Checksum을 생성하려면 PowerShell에서 Get-FileHash cmdlet을 사용합니다.

Windows 업데이트 사용자 지정자

WindowsUpdate 사용자 지정자는 Packer 커뮤니티에서 유지 관리하는 오픈소스 프로젝트인 Packer용 커뮤니티 Windows 업데이트 프로비전 프로그램을 기반으로 합니다. Microsoft는 Image Builder 서비스를 사용하여 프로비전 프로그램을 테스트 및 유효성 검사하고, 관련 문제 조사를 지원하고, 문제를 해결하기 위해 노력하지만, 오픈 소스 프로젝트는 Microsoft에서 공식적으로 지원하지 않습니다. Windows 업데이트 프로비저닝 프로그램에 대한 자세한 설명서 및 도움말은 프로젝트 리포지토리를 참조하세요.

"customize": [
  {
    "type": "WindowsUpdate",
    "searchCriteria": "IsInstalled=0",
    "filters": [
      "exclude:$_.Title -like '*Preview*'",
      "include:$true"
    ],
    "updateLimit": 20
  }
]

사용자 지정자 속성:

  • type – WindowsUpdate.
  • searchCriteria - 선택 사항으로 설치되는 업데이트 형식(예: 권장 또는 중요)을 정의합니다. BrowseOnly=0 및 IsInstalled=0(권장)이 기본값입니다.
  • filters – 선택 사항. 업데이트를 포함하거나 제외하도록 필터를 지정할 수 있습니다.
  • updateLimit – 선택 사항. 설치할 수 있는 업데이트 수를 정의합니다. 기본값은 1000입니다.

참고 항목

Windows 업데이트 사용자 지정자는 아직 실행 중인 미해결 Windows 다시 시작 또는 애플리케이션 설치가 여전히 실행 중인 경우 실패할 수 있습니다. 일반적으로 customization.log System.Runtime.InteropServices.COMException (0x80240016): Exception from HRESULT: 0x80240016이 오류가 표시 될 수 있습니다. Windows 다시 시작에 추가하거나 애플리케이션이 Windows 업데이트 실행하기 전에 인라인 명령 또는 스크립트에서 절전 모드 또는 대기 명령을 사용하여 설치를 완료하는 데 충분한 시간을 허용하는 것이 좋습니다.

일반화

기본적으로 Azure Image Builder는 각 이미지 사용자 지정 단계가 끝날 때 deprovision 코드를 실행하여 이미지를 일반화합니다. 일반화는 이미지를 설정하여 여러 VM을 만드는 데 다시 사용할 수 있는 프로세스입니다. Windows VM의 경우 Azure Image Builder는 Sysprep을 사용합니다. Linux의 경우 Azure Image Builder는 waagent -deprovision을 실행합니다.

Azure Image Builder가 일반화에 사용하는 명령은 모든 상황에 적합하지 않을 수 있으므로, 필요한 경우 이 명령을 사용자 지정할 수 있습니다.

기존 사용자 지정을 마이그레이션하고 다른 Sysprep/waagent 명령을 사용하는 경우 Image Builder 일반 명령을 사용할 수 있습니다. VM 만들기가 실패하는 경우 자체 Sysprep 또는 waagent 명령을 사용하세요.

Azure Image Builder에서 Windows 사용자 지정 이미지를 성공적으로 만들고, 이 이미지에서 VM을 만든 다음, VM 만들기가 실패하거나 성공적으로 완료되지 않는 경우 Windows Server Sysprep 설명서를 검토하거나 Windows Server Sysprep 고객 서비스 지원 팀에 지원 요청을 제기해야 합니다. 이 팀은 문제를 해결하고 올바른 Sysprep 사용에 대해 조언할 수 있습니다.

기본 Sysprep 명령

Write-Output '>>> Waiting for GA Service (RdAgent) to start ...'
while ((Get-Service RdAgent).Status -ne 'Running') { Start-Sleep -s 5 }
Write-Output '>>> Waiting for GA Service (WindowsAzureTelemetryService) to start ...'
while ((Get-Service WindowsAzureTelemetryService) -and ((Get-Service WindowsAzureTelemetryService).Status -ne 'Running')) { Start-Sleep -s 5 }
Write-Output '>>> Waiting for GA Service (WindowsAzureGuestAgent) to start ...'
while ((Get-Service WindowsAzureGuestAgent).Status -ne 'Running') { Start-Sleep -s 5 }
if( Test-Path $Env:SystemRoot\system32\Sysprep\unattend.xml ) {
  Write-Output '>>> Removing Sysprep\unattend.xml ...'
  Remove-Item $Env:SystemRoot\system32\Sysprep\unattend.xml -Force
}
if (Test-Path $Env:SystemRoot\Panther\unattend.xml) {
  Write-Output '>>> Removing Panther\unattend.xml ...'
  Remove-Item $Env:SystemRoot\Panther\unattend.xml -Force
}
Write-Output '>>> Sysprepping VM ...'
& $Env:SystemRoot\System32\Sysprep\Sysprep.exe /oobe /generalize /quiet /quit
while($true) {
  $imageState = (Get-ItemProperty HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup\State).ImageState
  Write-Output $imageState
  if ($imageState -eq 'IMAGE_STATE_GENERALIZE_RESEAL_TO_OOBE') { break }
  Start-Sleep -s 5
}
Write-Output '>>> Sysprep complete ...'

기본 Linux 프로비전 해제 명령

WAAGENT=/usr/sbin/waagent
waagent -version 1> /dev/null 2>&1
if [ $? -eq 0 ]; then
  WAAGENT=waagent
fi
$WAAGENT -force -deprovision+user && export HISTSIZE=0 && sync

명령 재정의

명령을 재정의하려면 PowerShell 또는 셸 스크립트 프로비저닝기를 사용하여 정확한 파일 이름으로 명령 파일을 만들고 올바른 디렉터리에 배치합니다.

  • Windows: c:\DeprovisioningScript.ps1
  • Linux: /tmp/DeprovisioningScript.sh

Image Builder에서 이러한 명령을 읽고, 이러한 명령은 AIB 로그, customization.log에 기록됩니다. 로그를 수집하는 방법은 문제 해결을 참조하세요.

속성: errorHandling

errorHandling 속성을 사용하면 이미지를 만드는 동안 오류가 처리되는 방법을 구성할 수 있습니다.

{
  "errorHandling": {
    "onCustomizerError": "abort",
    "onValidationError": "cleanup"
  }
}

errorHandling 속성을 사용하면 이미지를 만드는 동안 오류가 처리되는 방법을 구성할 수 있습니다. 다음과 같은 두 가지 속성이 있습니다.

  • onCustomizerError - 이미지 만들기의 사용자 지정자 단계에서 오류가 발생할 때 수행할 작업을 지정합니다.
  • onValidationError - 이미지 템플릿의 유효성을 검사하는 동안 오류가 발생할 때 수행할 작업을 지정합니다.

또한 이 errorHandling 속성에는 이미지를 만드는 동안 오류를 처리할 수 있는 두 가지 값이 있습니다.

  • 클린up - Packer 또는 사용자 지정/유효성 검사 중 하나에 오류가 발생하더라도 Packer에서 만든 임시 리소스가 클린 있는지 확인합니다. 이 기본 기존 동작과의 이전 버전과의 호환성을 포함합니다.
  • abort - Packer에서 오류가 발생하는 경우 AIB(Azure Image Builder) 서비스는 임시 리소스의 클린 건너뜁니다. AIB 템플릿의 소유자는 구독에서 이러한 리소스를 클린 담당합니다. 이러한 리소스에는 임시 VM에 남아 있는 로그 및 파일과 같은 유용한 정보가 포함될 수 있으므로 Packer에서 발생한 오류를 조사하는 데 도움이 될 수 있습니다.

속성: distribute

Azure Image Builder는 세 가지 배포 대상을 지원합니다.

  • ManagedImage - 관리 이미지입니다.
  • sharedImage - Azure Compute Gallery.
  • VHD - 스토리지 계정의 VHD입니다.

동일한 구성에서 두 대상 형식 모두에 이미지를 배포할 수 있습니다.

참고 항목

기본 AIB sysprep 명령에는 "/mode:vm"이 포함되지 않지만, HyperV 역할이 설치되는 이미지를 만들 때 이 속성이 필요할 수 있습니다. 이 명령 인수를 추가해야 하는 경우 Sysprep 명령을 재정의해야 합니다.

배포할 대상이 둘 이상 있을 수 있으므로 Image Builder는 기본 쿼리하여 액세스할 수 있는 모든 배포 대상의 runOutputName상태를 확인합니다. 이 runOutputName 개체는 배포 후 해당 배포에 대한 정보를 쿼리할 수 있는 개체입니다. 예를 들어 VHD의 위치 또는 이미지 버전이 복제본(replica) 또는 SIG 이미지 버전이 만들어진 지역을 쿼리할 수 있습니다. 모든 배포 대상의 속성입니다. runOutputName 각 배포 대상에 고유해야 합니다. Azure Compute Gallery 배포를 쿼리하는 예제는 다음과 같습니다.

subscriptionID=<subcriptionID>
imageResourceGroup=<resourceGroup of image template>
runOutputName=<runOutputName>

az resource show \
  --ids "/subscriptions/$subscriptionID/resourcegroups/$imageResourceGroup/providers/Microsoft.VirtualMachineImages/imageTemplates/ImageTemplateLinuxRHEL77/runOutputs/$runOutputName"  \
  --api-version=2021-10-01

출력

{
  "id": "/subscriptions/xxxxxx/resourcegroups/rheltest/providers/Microsoft.VirtualMachineImages/imageTemplates/ImageTemplateLinuxRHEL77/runOutputs/rhel77",
  "identity": null,
  "kind": null,
  "location": null,
  "managedBy": null,
  "name": "rhel77",
  "plan": null,
  "properties": {
    "artifactId": "/subscriptions/xxxxxx/resourceGroups/aibDevOpsImg/providers/Microsoft.Compute/galleries/devOpsSIG/images/rhel/versions/0.24105.52755",
    "provisioningState": "Succeeded"
  },
  "resourceGroup": "rheltest",
  "sku": null,
  "tags": null,
  "type": "Microsoft.VirtualMachineImages/imageTemplates/runOutputs"
}

배포: managedImage

이미지 출력은 관리 이미지 리소스입니다.

{
  "type":"ManagedImage",
  "imageId": "<resource ID>",
  "location": "<region>",
  "runOutputName": "<name>",
  "artifactTags": {
      "<name>": "<value>",
      "<name>": "<value>"
  }
}

속성 배포:

  • type – ManagedImage
  • imageId – 대상 이미지의 리소스 ID입니다. 필요한 형식: /subscriptions/<subscriptionId>/resourceGroups/<destinationResourceGroupName>/providers/Microsoft.Compute/images/<imageName>
  • location - 관리형 이미지의 위치입니다.
  • runOutputName – 분포를 식별하는 고유 이름입니다.
  • artifactTags - 선택적 사용자 지정 키\값 태그입니다.

참고 항목

대상 리소스 그룹이 있어야 합니다. 다른 지역에 이미지를 배포하려는 경우 배포 시간이 늘어납니다.

배포: sharedImage

Azure Compute Gallery는 이미지 영역 복제, 버전 관리 및 사용자 지정 이미지 공유를 관리할 수 있는 새로운 이미지 관리 서비스입니다. Azure Image Builder는 이 서비스를 통한 배포를 지원하므로 Azure Compute Galleries에서 지원하는 지역에 이미지를 배포할 수 있습니다.

Azure Compute Gallery는 다음으로 구성됩니다.

  • 갤러리 - 여러 이미지에 대한 컨테이너입니다. 갤러리는 한 지역에 배포됩니다.
  • 이미지 정의 - 이미지에 대한 개념적 그룹화입니다.
  • 이미지 버전 - VM 또는 확장 집합을 배포하는 데 사용되는 이미지 형식입니다. 이미지 버전은 VM을 배포해야 하는 다른 지역으로 복제본(replica)ted할 수 있습니다.

갤러리에 배포하려면 먼저 갤러리와 이미지 정의를 만들어야 합니다(갤러리 만들기 참조).

참고 항목

이미지 버전 ID는 고유하거나 기존 Azure Compute Gallery에 있는 모든 이미지 버전과 달라야 합니다.

{
  "type": "SharedImage",
  "galleryImageId": "<resource ID>",
  "runOutputName": "<name>",
  "artifactTags": {
      "<name>": "<value>",
      "<name>": "<value>"
  }
}

다음 JSON은 replicationRegions 필드를 사용하여 Azure Compute Gallery에 배포하는 방법의 예입니다.

  "replicationRegions": [
      "<region where the gallery is deployed>",
      "<region>"
  ]

참고 항목

replicationRegionstargetRegions가 업데이트된 속성이므로 갤러리 배포에서 더 이상 사용되지 않습니다. 자세한 내용은 targetRegions를 참조하세요.

배포: targetRegions

다음 JSON은 targetRegions 필드를 사용하여 Azure Compute Gallery에 배포하는 방법의 예입니다.

"distribute": [
      {
        "type": "SharedImage",
        "galleryImageId": "<resource ID>",
        "runOutputName": "<name>",
        "artifactTags": {
          "<name>": "<value>",
          "<name>": "<value>"
        },
        "targetRegions": [
             {
              "name": "eastus",
              "replicaCount": 2,
              "storageAccountType": "Standard_ZRS"
             },
             {
              "name": "eastus2",
              "replicaCount": 3,
              "storageAccountType": "Premium_LRS"
             }
          ]
       },
    ]

갤러리의 속성 배포:

  • type - sharedImage

  • galleryImageId – Azure Compute Gallery의 ID이며, 이 속성은 다음 두 가지 형식으로 지정할 수 있습니다.

    • 자동 버전 관리 - Image Builder에서 단조로운 버전 번호를 생성합니다. 이 속성은 동일한 템플릿에서 이미지를 계속 다시 빌드하려는 경우에 유용합니다. 형식은 /subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Compute/galleries/<sharedImageGalleryName>/images/<imageGalleryName>입니다.
    • 명시적 버전 관리 - 이미지 작성기에서 사용할 버전 번호를 전달할 수 있습니다. 형식은 다음과 같습니다. /subscriptions/<subscriptionID>/resourceGroups/<rgName>/providers/Microsoft.Compute/galleries/<sharedImageGalName>/images/<imageDefName>/versions/<version - for example: 1.1.1>
  • runOutputName – 분포를 식별하는 고유 이름입니다.

  • artifactTags - 선택적 사용자 지정 키\값 태그입니다.

  • replicationRegions - 복제할 지역의 배열입니다. 지역 중 하나는 갤러리가 배포된 지역이어야 합니다. 빌드는 복제가 완료될 때까지 완료되지 않기 때문에 영역을 추가하면 빌드 시간도 증가합니다. 이 필드는 API 버전 2022-07-01을 기준으로 사용되지 않습니다. "SharedImage" 형식을 배포할 때 targetRegions를 사용하세요.

  • targetRegions - 복제용 지역의 배열입니다. 이것은 2022-07-01 API의 일부로 새로 도입되었으며 SharedImage 형식 배포에만 적용됩니다.

  • excludeFromLatest(선택 사항) - 만든 이미지 버전을 갤러리 정의에서 최신 버전으로 사용하지 않도록 표시할 수 있습니다. 기본값은 'false'입니다.

  • storageAccountType(선택 사항) - AIB에서 만들 이미지 버전에 대해 다음과 같은 유형의 스토리지를 지정할 수 있도록 지원합니다.

    • "Standard_LRS"
    • "Standard_ZRS","

참고 항목

이미지 템플릿과 참조되는 image definition이 동일한 위치에 있지 않으면 이미지를 만드는 데 더 오래 걸립니다. Image Builder에는 현재 이미지 버전 리소스에 대한 location 매개 변수가 없기 때문에 부모 image definition에서 가져옵니다. 예를 들어 이미지 정의가 westus에 있고 이미지 버전이 eastus에 복제되도록 하려는 경우 Blob이 westus에 복사되고 이미지 버전 리소스가 westus에 만들어진 다음, eastus에 복제됩니다. 복제 시간이 더해지지 않도록 하려면 image definition 및 이미지 템플릿이 동일한 위치에 있어야 합니다.

버전 관리

versioning 속성은 sharedImage 배포 형식에만 해당됩니다. 이것은 가능한 두 값이 있는 열거형입니다.

  • latest - 디자인당 엄격하게 증가하는 새로운 스키마
  • source - 원본 이미지의 버전 번호에 기반하는 스키마.

기본 버전 번호 매김 스키마는 latest입니다. 최신 스키마에는 최신 버전을 생성할 주 버전을 지정하는 추가 속성, "major"가 있습니다.

참고 항목

sharedImage 배포에 대한 기존 버전 생성 논리는 더 이상 사용되지 않습니다. 갤러리에서 항상 최신 버전인 단조롭게 증가하는 버전과 원본 이미지의 버전 번호를 기반으로 생성된 버전이라는 두 가지 새로운 옵션이 제공됩니다. 버전 생성 스키마를 지정하는 열거형을 사용하면 나중에 추가 버전 생성 스키마를 사용하여 확장할 수 있습니다.

    "distribute": [
        "versioning": {
            "scheme": "Latest",
            "major": 1
        }
    ]

versioning 속성:

  • scheme - 배포할 새 버전 번호를 생성합니다. Latest 또는 Source가 두 가지 가능한 값입니다.
  • major - 최신 버전을 생성할 주 버전을 지정합니다. schemeLatest로 설정된 경우에만 적용됩니다. 예를 들어 다음 버전이 게시된 갤러리에서 0.1.1, 0.1.2, 1.0.0, 1.0.1, 1.1.0, 1.1.1, 1.2.0, 2.0.0, 2.0.1, 2.1.0
    • 주 버전이 설정되지 않았거나 2로 설정된 경우 Latest 스키마는 버전 2.1.1을 생성합니다.
    • 주 버전이 1로 설정된 경우 최신 스키마는 버전 1.2.1을 생성합니다.
    • 주 버전이 0으로 설정된 경우 최신 스키마는 버전 0.1.3을 생성합니다.

배포: VHD

VHD로 출력할 수 있습니다. 그런 다음 VHD를 복사하여 Azure MarketPlace에 게시하거나 Azure Stack에서 사용할 수 있습니다.

{
  "type": "VHD",
  "runOutputName": "<VHD name>",
  "artifactTags": {
      "<name>": "<value>",
      "<name>": "<value>"
  }
}

OS 지원: Windows 및 Linux

VHD 매개 변수 배포:

  • type - VHD.
  • runOutputName – 분포를 식별하는 고유 이름입니다.
  • 태그 - 선택적 사용자가 지정한 키 값 쌍 태그입니다.

Azure Image Builder에서는 사용자가 스토리지 계정 위치를 지정할 수 없지만, runOutputs의 상태를 쿼리하여 위치를 가져올 수 있습니다.

az resource show \
  --ids "/subscriptions/$subscriptionId/resourcegroups/<imageResourceGroup>/providers/Microsoft.VirtualMachineImages/imageTemplates/<imageTemplateName>/runOutputs/<runOutputName>"  | grep artifactUri

참고 항목

VHD가 만들어지면 가능한 한 빨리 다른 위치에 복사합니다. VHD는 이미지 템플릿을 Azure Image Builder 서비스에 제출할 때 만든 임시 리소스 그룹의 스토리지 계정에 저장됩니다. 이미지 템플릿을 삭제하면 VHD가 손실됩니다.

다음 JSON은 이미지를 VHD로 사용자 지정 스토리지 계정에 배포합니다.

"distribute": [
  {
    "type": "VHD",
    "runOutputName": "<VHD name>",
    "artifactTags": {
        "<name>": "<value>",
        "<name>": "<value>"
    },
    "uri": "<replace with Azure storage URI>"
  }
]

VHD 배포 속성:

uri - 배포된 VHD Blob에 대한 선택적 Azure Storage URI입니다. 기본값(빈 문자열)을 사용하지 않습니다. 이 경우 VHD는 준비 리소스 그룹의 스토리지 계정에 게시됩니다.

속성: optimize

VM 이미지를 만드는 동안 optimize 속성을 사용하도록 설정할 수 있으며 이 속성을 통해 VM 최적화로 이미지 생성 시간을 개선할 수 있습니다.

"optimize": {
      "vmboot": {
        "state": "Enabled"
      }
    }
  • vmboot: 부팅 시간 또는 기타 성능 측면을 개선할 수 있는 최적화를 제어하는 데 사용되는 VM(가상 머신)의 부팅 프로세스와 관련된 구성입니다.
  • state: vmboot 내의 부팅 최적화 기능의 상태이며, Enabled 값이 설정되어 기능이 켜져 이미지 생성 시간이 개선됨을 알 수 있습니다.

자세한 내용은 Azure VM Image Builder를 사용하여 갤러리 이미지에 대한 VM 최적화를 참조 하세요.

속성: 원본

source 섹션에는 Image Builder에서 사용할 원본 이미지에 대한 정보가 포함되어 있습니다. Azure Image Builder는 원본 이미지로 일반화된 이미지만 지원하며, 특수 이미지는 현재 지원되지 않습니다.

API에는 이미지 빌드의 원본을 정의하는 SourceType이 필요하며 현재 세 가지 형식이 있습니다.

  • PlatformImage - 원본 이미지가 Marketplace 이미지임을 나타냅니다.
  • ManagedImage - 일반 관리형 이미지에서 시작할 때 사용됩니다.
  • SharedImageVersion - Azure Compute Gallery의 이미지 버전을 원본으로 사용할 때 사용됩니다.

참고 항목

기존 Windows 사용자 지정 이미지를 사용하는 경우 단일 Windows 7 또는 Windows Server 2008 R2 이미지에서 Sysprep 명령을 최대 3회 실행하거나, 이후 버전의 단일 Windows 이미지에서 1,001회 실행할 수 있습니다. 자세한 내용은 sysprep 설명서를 참조하세요.

PlatformImage 원본

Azure Image Builder는 Windows Server 및 클라이언트 그리고 Linux Azure Marketplace 이미지를 지원합니다. 전체 목록은 Azure Image Builder 알아보기를 참조하세요.

"source": {
  "type": "PlatformImage",
  "publisher": "Canonical",
  "offer": "UbuntuServer",
  "sku": "18.04-LTS",
  "version": "latest"
}

여기에 있는 속성은 AZ CLI를 사용하여 VM을 만드는 데 사용되는 것과 동일하며, 아래를 실행하여 속성을 가져옵니다.

az vm image list -l westus -f UbuntuServer -p Canonical --output table --all

버전에서 latest를 사용할 수 있습니다. 버전은 템플릿이 제출될 때가 아니라 이미지 빌드가 수행될 때 평가됩니다. Azure Compute Gallery 대상과 함께 이 기능을 사용하는 경우 템플릿을 다시 전송하지 않고 주기적으로 이미지 빌드를 다시 실행하여 가장 최근 이미지에서 이미지를 다시 만들 수 있습니다.

마켓플레이스 계획 정보 지원

계획 정보를 지정할 수도 있습니다. 예를 들면 다음과 같습니다.

"source": {
  "type": "PlatformImage",
  "publisher": "RedHat",
  "offer": "rhel-byos",
  "sku": "rhel-lvm75",
  "version": "latest",
  "planInfo": {
    "planName": "rhel-lvm75",
    "planProduct": "rhel-byos",
    "planPublisher": "redhat"
  }
}

ManagedImage 원본

원본 이미지를 일반화된 VHD 또는 VM의 기존 관리형 이미지로 설정합니다.

참고 항목

원본 관리형 이미지는 지원되는 OS여야 하며 이미지가 Azure Image Builder 템플릿과 동일한 구독 및 지역에 상주해야 합니다.

"source": {
  "type": "ManagedImage",
  "imageId": "/subscriptions/<subscriptionId>/resourceGroups/{destinationResourceGroupName}/providers/Microsoft.Compute/images/<imageName>"
}

관리 imageId 되는 이미지의 ResourceId여야 합니다. 사용 가능한 이미지를 나열하는 데 사용합니다 az image list .

SharedImageVersion 원본

원본 이미지를 Azure Compute Gallery의 기존 이미지 버전으로 설정합니다.

참고 항목

원본 공유 이미지 버전은 지원되는 OS여야 하고 이미지 버전은 Azure Image Builder 템플릿과 동일한 지역에 상주해야 합니다. 그렇지 않은 경우 Image Builder 템플릿 지역에 이미지 버전을 복제합니다.

"source": {
  "type": "SharedImageVersion",
  "imageVersionID": "/subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>/providers/Microsoft.Compute/galleries/<sharedImageGalleryName>/images/<imageDefinitionName/versions/<imageVersion>"
}
  • imageVersionId - 이미지 버전의 ARM 템플릿 리소스 ID입니다. 이미지 버전 이름이 ‘latest’인 경우 이미지 빌드가 발생할 때 버전이 평가됩니다. imageVersionId는 이미지 버전의 ResourceId여야 합니다. az sig image-version list를 사용하여 이미지 버전을 나열합니다.

다음 JSON은 원본 이미지를 직접 공유 갤러리에 저장된 이미지로 설정합니다.

참고 항목

직접 공유 갤러리는 현재 미리 보기로 제공됩니다.

    source: {
      "type": "SharedImageVersion",
      "imageVersionId": "<replace with resourceId of the image stored in the Direct Shared Gallery>"
    },

다음 JSON은 원본 이미지를 Azure Compute Gallery에 저장된 이미지의 최신 이미지 버전으로 설정합니다.

"properties": {
    "source": {
        "type": "SharedImageVersion",
        "imageVersionId": "/subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Compute/galleries/<azureComputeGalleryName>/images/<imageDefinitionName>/versions/latest"
    }
},

SharedImageVersion 속성:

imageVersionId - 이미지 버전의 ARM 템플릿 리소스 ID입니다. 이미지 버전 이름이 ‘latest’인 경우 이미지 빌드가 발생할 때 버전이 평가됩니다.

속성: stagingResourceGroup

stagingResourceGroup 속성에는 Image Builder 서비스에서 이미지 빌드 프로세스 중에 사용하기 위해 만드는 준비 리소스 그룹에 대한 정보가 포함됩니다. stagingResourceGroup은 이미지 빌드 프로세스 중에 Image Builder에서 만든 리소스 그룹을 더 세밀하게 제어하려는 사용자를 위한 선택적 속성입니다. 고유한 리소스 그룹을 만들고 stagingResourceGroup 섹션에서 해당 리소스 그룹을 지정하거나 Image Builder가 리소스 그룹을 대신 만들도록 합니다.

Important

할당된 준비 리소스 그룹은 다른 이미지 템플릿과 연결할 수 없고, 이미지 템플릿과 동일한 지역에서 비어 있어야 하며(내부에는 리소스가 없음), Azure Image Builder 이미지 템플릿 리소스에 할당된 ID에 "기여자" 또는 "소유자" RBAC가 적용되어 있어야 합니다.

"properties": {
  "stagingResourceGroup": "/subscriptions/<subscriptionID>/resourceGroups/<stagingResourceGroupName>"
}

템플릿 만들기 시나리오

  • stagingResourceGroup 속성이 비어 있음

    stagingResourceGroup 속성이 지정되지 않거나 빈 문자열로 지정된 경우 Image Builder 서비스에서 "IT_***" 기본 이름 규칙을 사용하여 준비 리소스 그룹을 만듭니다. 준비 리소스 그룹에는 기본 태그, createdBy, imageTemplateName, imageTemplateResourceGroupName이 적용되었습니다. 또한 기본 RBAC는 “기여자”인 Azure Image Builder 템플릿 리소스에 할당된 ID에 적용됩니다.

  • stagingResourceGroup 속성이 존재하는 리소스 그룹을 사용하여 지정됨

    stagingResourceGroup 속성이 존재하는 리소스 그룹을 사용하여 지정된 경우 Image Builder 서비스에서 리소스 그룹이 다른 이미지 템플릿과 연결되어 있지 않고, 비어 있고(내부에 리소스가 없음), 이미지 템플릿과 동일한 지역에 있고, Azure Image Builder 이미지 템플릿 리소스에 할당된 ID에 적용된 “기여자” 또는 “소유자” RBAC를 가지고 있는지 확인합니다. 앞에서 언급한 요구 사항 중 하나라도 충족되지 않으면 오류가 throw됩니다. 준비 리소스 그룹에는 usedBy, imageTemplateName, imageTemplateResourceGroupName 태그가 추가되었습니다. 기존 태그는 삭제되지 않습니다.

Important

Windows 원본 이미지를 사용하여 기존 리소스 그룹 및 VNet을 Azure Image Builder 서비스에 지정하려고 할 때 Azure Image Builder의 자사 앱에 해당하는 서비스 주체의 리소스 그룹에 기여자 역할을 할당해야 합니다. 리소스 그룹에 기여자 역할을 할당하는 방법에 대한 CLI 명령 및 포털 지침은 VM Azure Image Builder 문제 해결: 디스크 생성 시 권한 부여 오류 설명서를 참조하세요.

  • stagingResourceGroup 속성이 존재하지 않는 리소스 그룹을 사용하여 지정됨

    stagingResourceGroup 속성이 존재하지 않는 리소스 그룹을 사용하여 지정된 경우 Image Builder 서비스는 stagingResourceGroup 속성에 제공된 이름을 사용하여 준비 리소스 그룹을 만듭니다. 지정된 이름이 리소스 그룹에 대한 Azure 명명 요구 사항을 충족하지 않으면 오류가 발생합니다. 준비 리소스 그룹에는 기본 태그, createdBy, imageTemplateName, imageTemplateResourceGroupName이 적용되었습니다. 기본적으로 Azure Image Builder 이미지 템플릿 리소스에 할당된 ID에는 리소스 그룹에서 “기여자” RBAC가 적용됩니다.

템플릿 삭제

Image Builder 서비스에서 만든 모든 스테이징 리소스 그룹은 이미지 템플릿이 삭제된 후 삭제됩니다. 삭제에는 stagingResourceGroup 속성에 지정되었지만 이미지 빌드 이전에는 존재하지 않았던 스테이징 리소스 그룹이 포함됩니다.

Image Builder에서 스테이징 리소스 그룹을 만들지 않았지만 이 리소스 그룹 내의 리소스를 만든 경우 Image Builder 서비스에 리소스를 삭제하는 데 필요한 적절한 권한 또는 역할이 있으면 이미지 템플릿이 삭제된 후 해당 리소스가 삭제됩니다.

속성: validate

validate 속성을 사용하여 플랫폼 이미지뿐 아니라 Azure Image Builder를 사용하여 만들었는지 여부에 관계없이 직접 만드는 모든 사용자 지정 이미지의 유효성을 검사할 수 있습니다.

Azure Image Builder는 sourceValidationOnly 속성을 사용하여 설정할 수 있는 ‘Source-Validation-Only’ 모드를 지원합니다. sourceValidationOnly 속성이 true로 설정되면 source 섹션에 지정된 이미지의 유효성이 직접 검사됩니다. 사용자 지정 이미지를 생성한 다음, 유효성을 검사하기 위해 별도의 빌드가 실행되지 않습니다.

inVMValidations 속성은 이미지에서 수행될 유효성 검사기 목록을 가져옵니다. Azure Image Builder는 파일, PowerShell 및 셸 유효성 검사기를 지원합니다.

continueDistributeOnFailure 속성은 유효성 검사가 실패하는 경우 출력 이미지가 배포되는지 여부를 담당합니다. 기본적으로 유효성 검사가 실패하고 이 속성이 false로 설정되면 출력 이미지가 배포되지 않습니다. 유효성 검사가 실패하고 이 속성이 true로 설정되면 출력 이미지가 계속 배포됩니다. 사용할 이미지가 배포되지 않을 수 있으므로 이 옵션은 주의해서 사용해야 합니다. 두 경우(true 또는 false) 모두에서 유효성 검사가 실패하면 엔드투엔드 이미지 실행이 실패한 것으로 보고됩니다. 이 속성은 유효성 검사의 성공 여부에 영향을 주지 않습니다.

사용 validate시:

  • 여러 유효성 검사기를 사용할 수 있습니다.
  • 유효성 검사기는 템플릿에 지정된 순서대로 실행됩니다.
  • 한 유효성 검사기가 실패하면 전체 유효성 검사 구성 요소가 실패하고 다시 오류를 보고합니다.
  • 템플릿에서 사용하기 전에 스크립트를 철저히 테스트하는 것이 좋습니다. 사용자 고유의 VM에서 스크립트를 디버깅하는 것이 더 쉽습니다.
  • 스크립트에 중요한 데이터를 넣지 마세요.
  • MSI를 사용하지 않는 경우 스크립트 위치는 공개적으로 액세스할 수 있어야 합니다.

validate 속성을 사용하여 Windows 이미지의 유효성을 검사하는 방법:

{
   "properties":{
      "validate":{
         "continueDistributeOnFailure":false,
         "sourceValidationOnly":false,
         "inVMValidations":[
            {
               "type":"File",
               "destination":"string",
               "sha256Checksum":"string",
               "sourceUri":"string"
            },
            {
               "type":"PowerShell",
               "name":"test PowerShell validator inline",
               "inline":[
                  "<command to run inline>"
               ],
               "validExitCodes":"<exit code>",
               "runElevated":"<true or false>",
               "runAsSystem":"<true or false>"
            },
            {
               "type":"PowerShell",
               "name":"<name>",
               "scriptUri":"<path to script>",
               "runElevated":"<true false>",
               "sha256Checksum":"<sha256 checksum>"
            }
         ]
      }
   }
}

inVMValidations 속성:

  • type – PowerShell.

  • name - 유효성 검사기의 이름

  • scriptUri - PowerShell 스크립트 파일의 URI.

  • inline – 쉼표로 구분된 실행할 명령의 배열.

  • validExitCodes – 선택 사항. 스크립트/인라인 명령에서 반환될 수 있는 유효한 코드입니다. 이를 지정하면 보고된 스크립트/인라인 명령의 실패를 피할 수 있습니다.

  • runElevated – 선택적, 부울, 관리자 권한으로 명령 및 스크립트 실행을 지원합니다.

  • sha256Checksum - 파일의 sha256 검사sum 값이 로컬로 생성되고 Image Builder가 검사sum 및 유효성을 검사합니다.

    sha256Checksum을 생성하려면 Windows에서 PowerShell을 사용하여 Get-Hash를 실행합니다.

validate 속성을 사용하여 Linux 이미지의 유효성을 검사하는 방법

{
  "properties": {
    "validate": {
      "continueDistributeOnFailure": false,
      "sourceValidationOnly": false,
      "inVMValidations": [
        {
          "type": "Shell",
          "name": "<name>",
          "inline": [
            "<command to run inline>"
          ]
        },
        {
          "type": "Shell",
          "name": "<name>",
          "scriptUri": "<path to script>",
          "sha256Checksum": "<sha256 checksum>"
        },
        {
          "type": "File",
          "destination": "string",
          "sha256Checksum": "string",
          "sourceUri": "string"
        }
      ]
    }
  }
}

inVMValidations 속성:

  • type – 수행할 유효성 검사 유형으로 지정된 셸 또는 파일입니다.

  • name - 유효성 검사기의 이름

  • scriptUri - 스크립트 파일의 URI

  • inline - 쉼표로 구분된 실행할 명령의 배열.

  • sha256Checksum - 파일의 sha256 검사sum 값이 로컬로 생성되고 Image Builder가 검사sum 및 유효성을 검사합니다.

    mac/Linux에서 터미널을 사용하여 sha256Checksum을 생성하려면 다음을 실행합니다. sha256sum <fileName>

  • destination - 파일의 대상입니다.

  • sha256Checksum - 파일의 SHA256 체크섬을 지정합니다.

  • sourceUri - 파일의 원본 URI입니다.

속성: vmProfile

vmSize(선택 사항)

Image Builder는 Gen1 이미지의 경우 Standard_D1_v2, Gen2 이미지의 경우 Standard_D2ds_v4의 기본 SKU 크기를 사용합니다. 세대는 source에서 지정한 이미지에 의해 정의됩니다. vmSize는 다음과 같은 이유로 재정의할 수 있습니다.

  • 메모리, CPU 및 대용량 파일(GB) 처리가 필요한 사용자 지정을 수행합니다.
  • Windows 빌드를 실행하려면 "Standard_D2_v2" 또는 동등한 VM 크기를 사용해야 합니다.
  • VM 격리가 필요합니다.
  • 특정 하드웨어가 필요한 이미지를 사용자 지정합니다. 예를 들어 GPU VM의 경우 GPU VM 크기가 필요합니다.
  • 빌드 VM에서 엔드투엔드 미사용 암호화가 필요합니다. 로컬 임시 디스크를 사용하지 않는 지원 빌드 VM 크기를 지정해야 합니다.

osDiskSizeGB

기본적으로 Image Builder는 이미지의 크기를 변경하지 않으며 원본 이미지의 크기를 사용합니다. 필요에 따라 OS 디스크(Win 및 Linux)의 크기 늘릴 수 있으며, 값이 0이면 원본 이미지와 동일한 크기를 그대로 유지합니다. OS 디스크 크기는 원본 이미지의 크기보다 작게 줄일 수 없습니다.

{
  "osDiskSizeGB": 100
}

vnetConfig(선택 사항)

VNet 속성을 지정하지 않으면 Image Builder에서 자체 VNet, 공용 IP 및 NSG(네트워크 보안 그룹)를 만듭니다. 공용 IP는 서비스에서 빌드 VM과 통신하는 데 사용됩니다. 공용 IP를 사용하지 않거나 Image Builder에서 구성 서버(DSC, Chef, Puppet, Ansible), 파일 공유와 같은 기존 VNet 리소스에 액세스할 수 있도록 하려면 VNet을 지정할 수 있습니다. 자세한 내용은 네트워킹 설명서를 검토하세요.

"vnetConfig": {
  "subnetId": "/subscriptions/<subscriptionID>/resourceGroups/<vnetRgName>/providers/Microsoft.Network/virtualNetworks/<vnetName>/subnets/<subnetName>"
}

이미지 템플릿 작업

이미지 빌드 시작

빌드를 시작하려면 이미지 템플릿 리소스에서 '실행'을 호출해야 합니다. run 명령의 예는 다음과 같습니다.

Invoke-AzResourceAction -ResourceName $imageTemplateName -ResourceGroupName $imageResourceGroup -ResourceType Microsoft.VirtualMachineImages/imageTemplates -ApiVersion "2021-10-01" -Action Run -Force
az resource invoke-action \
  --resource-group $imageResourceGroup \
  --resource-type  Microsoft.VirtualMachineImages/imageTemplates \
  -n helloImageTemplateLinux01 \
  --action Run

이미지 빌드 취소

잘못된 것으로 생각되는 이미지 빌드를 실행하거나, 사용자 입력을 기다리거나, 성공적으로 완료되지 않을 것으로 생각되는 경우 빌드를 취소할 수 있습니다.

빌드는 언제든지 취소할 수 있습니다. 배포 단계가 시작된 경우에도 취소할 수 있지만 완료되지 않았을 수 있는 모든 이미지를 정리해야 합니다. 취소 명령은 취소가 완료될 때까지 기다리지 않습니다. 다음 상태 명령을 사용하여 lastrunstatus.runstate의 취소 진행률을 모니터링합니다.

cancel 명령의 예는 다음과 같습니다.

Invoke-AzResourceAction -ResourceName $imageTemplateName -ResourceGroupName $imageResourceGroup -ResourceType Microsoft.VirtualMachineImages/imageTemplates -ApiVersion "2021-10-01" -Action Cancel -Force
az resource invoke-action \
  --resource-group $imageResourceGroup \
  --resource-type  Microsoft.VirtualMachineImages/imageTemplates \
  -n helloImageTemplateLinux01 \
  --action Cancel

다음 단계

Azure Image Builder GitHub에는 다양한 시나리오에 대한 샘플 .json 파일이 있습니다.