다음을 통해 공유


ARM 템플릿 배포 what-if 작업

ARM 템플릿(Azure Resource Manager 템플릿)을 배포하기 전에 변경 내용을 미리 볼 수 있습니다. Azure Resource Manager는 템플릿을 배포할 때 리소스가 어떻게 변경되는지 확인할 수 있는 what-if 작업을 제공합니다. 가정 작업은 기존 리소스를 변경하지 않습니다. 대신, 지정된 템플릿이 배포되는 경우 변경 내용을 예측합니다.

Azure PowerShell, Azure CLI 또는 REST API 작업에서 what-if 작업을 사용할 수 있습니다. 리소스 그룹, 구독, 관리 그룹 및 테넌트 수준 배포에 대해 지원되는 What-if입니다.

학습 리소스

what-if 및 실습 지침에 대한 자세한 내용은 what-if를 사용하여 Azure 배포 변경 미리 보기를 참조하세요.

필수 조건

필요한 권한

Bicep 파일 또는 ARM(Azure Resource Manager) 템플릿을 배포하려면 배포하는 리소스에 대한 쓰기 액세스 권한과 리소스 유형의 모든 작업에 Microsoft.Resources/deployments 액세스해야 합니다. 예를 들어 가상 머신을 배포하려면 Microsoft.Compute/virtualMachines/writeMicrosoft.Resources/deployments/* 권한이 필요합니다. 가상 작업에는 동일한 사용 권한 요구 사항이 있습니다.

Azure CLI 버전 2.76.0 이상 및 Azure PowerShell 버전 13.4.0 이상 에서는 이 프로세스 중에 ARM이 Bicep 템플릿의 유효성을 철저히 검사하는 방법을 결정하는 ValidationLevel 스위치를 도입했습니다. 자세한 내용은 What-if 명령을 참조하세요.

역할 및 사용 권한 목록은 Azure 기본 제공 역할을 참조하세요.

What-if 제한

"What-if는 이러한 제한에 도달할 때까지 중첩된 템플릿을 확장합니다."

  • 중첩된 템플릿 500개.
  • 여러 리소스 그룹 간에 걸쳐 배포되는 800개의 리소스 그룹
  • 중첩된 템플릿을 확장하는 데 5분이 걸립니다.

한도 중 하나에 도달하면 나머지 리소스의 변경 유형무시로 설정됩니다.

Azure PowerShell 모듈 설치

PowerShell에서 what-if를 사용하려면 Az 모듈 버전 4.2 이상이 있어야 합니다.

모듈을 설치하려면 다음을 사용합니다.

Install-Module -Name Az -Force

모듈 설치에 대한 자세한 내용은 Azure PowerShell 설치를 참조하세요.

Azure CLI 모듈 설치

Azure CLI에서 what-if를 사용하려면 Azure CLI 2.14.0 이상이 있어야 합니다. 필요한 경우 최신 버전의 Azure CLI를 설치합니다.

결과 보기

PowerShell 또는 Azure CLI에서 what-if를 사용하는 경우 출력에는 다양한 유형의 변경 내용을 확인하는 데 도움이 되는 색으로 구분된 결과가 포함됩니다.

전체 리소스 페이로드 및 변경 유형이 있는 Resource Manager 템플릿 배포 what-if 작업의 스크린샷.

텍스트 출력은 다음과 같습니다.

Resource and property changes are indicated with these symbols:
  - Delete
  + Create
  ~ Modify

The deployment will update the following scope:

Scope: /subscriptions/./resourceGroups/ExampleGroup

  ~ Microsoft.Network/virtualNetworks/vnet-001 [2018-10-01]
    - tags.Owner: "Team A"
    ~ properties.addressSpace.addressPrefixes: [
      - 0: "10.0.0.0/16"
      + 0: "10.0.0.0/15"
      ]
    ~ properties.subnets: [
      - 0:

          name:                     "subnet001"
          properties.addressPrefix: "10.0.0.0/24"

      ]

Resource changes: 1 to modify.

비고

what-if 작업은 참조 함수를 확인할 수 없습니다. 참조 함수를 포함하는 템플릿 식으로 속성을 설정할 때마다, what-if 보고서는 속성이 변경될 것임을 알립니다. 이 동작은 what-if가 속성의 현재 값(예: truefalse 부울 값)과 해결되지 않은 템플릿 식을 비교하기 때문에 발생합니다. 물론 이러한 값은 일치하지 않습니다. 템플릿을 배포하면 템플릿 식이 다른 값으로 확인될 때만 속성이 변경됩니다.

가상 명령

Azure PowerShell

템플릿을 배포하기 전에 변경 내용을 미리 보려면 New-AzResourceGroupDeployment 또는 New-AzSubscriptionDeployment를 사용합니다. -Whatif 배포 명령에 switch 매개 변수를 추가합니다.

  • 리소스 그룹 배포의 경우 New-AzResourceGroupDeployment -Whatif

  • 구독 수준 배포의 경우 New-AzSubscriptionDeployment -WhatifNew-AzDeployment -Whatif

switch 매개 변수를 -Confirm 사용하여 변경 내용을 미리 볼 수 있으며 배포를 계속하라는 메시지가 표시됩니다.

  • 리소스 그룹 배포의 경우 New-AzResourceGroupDeployment -Confirm
  • 구독 수준 배포의 경우 New-AzSubscriptionDeployment -ConfirmNew-AzDeployment -Confirm

위의 명령은 수동으로 검사할 수 있는 텍스트 요약을 반환합니다. 프로그래밍 방식으로 변경 내용을 검사할 수 있는 개체를 얻으려면 Get-AzResourceGroupDeploymentWhatIfResult 또는 Get-AzSubscriptionDeploymentWhatIfResult를 사용합니다.

  • 리소스 그룹 배포의 경우 $results = Get-AzResourceGroupDeploymentWhatIfResult
  • 구독 수준 배포의 경우 $results = Get-AzSubscriptionDeploymentWhatIfResult 또는 $results = Get-AzDeploymentWhatIfResult

Azure 커맨드 라인 인터페이스 (CLI)

템플릿을 배포하기 전에 변경 내용을 미리 보려면 다음을 사용합니다.

스위치(또는 짧은 형식--confirm-with-what-if)를 사용하여 -c 변경 내용을 미리 볼 수 있으며 배포를 계속하라는 메시지가 표시됩니다. 이 스위치를 다음에 추가하세요:

예를 들어 az deployment group create --confirm-with-what-if 또는 -c를 사용하여 리소스 그룹을 배포합니다.

위의 명령은 수동으로 검사할 수 있는 텍스트 요약을 반환합니다. 프로그래밍 방식으로 변경 내용을 검사할 수 있는 JSON 개체를 얻으려면 스위치를 --no-pretty-print 사용합니다. 예를 들어 리소스 그룹 배포에 사용합니다 az deployment group what-if --no-pretty-print .

색 없이 결과를 반환하려면 Azure CLI 구성 파일을 엽니다. no_color로 설정합니다.

Azure REST API

REST API의 경우 다음을 사용합니다.

유형 변경

what-if 작업에는 다음과 같은 7가지 유형의 변경 내용이 나열됩니다.

  • 만들기: 리소스는 현재 존재하지 않지만 템플릿에 정의되어 있습니다. 리소스가 만들어집니다.
  • 삭제: 이 변경 유형은 배포에 전체 모드 를 사용하는 경우에만 적용됩니다. 리소스가 있지만 템플릿에 정의되지 않았습니다. 전체 모드에서는 리소스가 삭제됩니다. 전체 모드 삭제를 지원하는 리소스만 이 변경 유형에 포함됩니다.
  • 무시: 리소스가 있지만 템플릿에 정의되지 않았습니다. 리소스는 배포되거나 수정되지 않습니다. 중첩된 템플릿을 확장하는 제한에 도달하면 이 변경 유형이 발생합니다. What-if 제한을 참조하세요.
  • NoChange: 리소스가 존재하며 템플릿에 정의됩니다. 리소스는 다시 배포되지만 리소스의 속성은 변경되지 않습니다. 이 변경 형식은 ResultFormat 을 기본값으로 설정하면 FullResourcePayloads반환됩니다.
  • NoEffect: 이 속성은 준비 전용이며 서비스에서 무시됩니다. 예를 들어 sku.tier 속성은 항상 sku.name 네임스페이스에서 Microsoft.ServiceBus과 일치하도록 설정됩니다.
  • 수정: 리소스가 존재하며 템플릿에 정의됩니다. 리소스가 다시 배포되고 리소스의 속성이 변경됩니다. 이 변경 형식은 ResultFormat 을 기본값으로 설정하면 FullResourcePayloads반환됩니다.
  • 배포: 리소스가 존재하며 템플릿에 정의됩니다. 리소스가 다시 배포됩니다. 리소스의 속성은 변경될 수도 있고 변경되지 않을 수도 있습니다. 이 작업은 속성이 변경될지 여부를 결정하기에 충분한 정보가 없는 경우 이 변경 형식을 반환합니다. ResultFormat이 .로 설정된 ResourceIdOnly경우에만 이 조건이 표시됩니다.

결과 형식

예측된 변경 내용에 대해 반환되는 세부 정보 수준을 제어합니다. 두 가지 옵션이 있습니다.

  • FullResourcePayloads - 변경될 리소스 목록과 변경될 속성에 대한 세부 정보를 반환합니다.
  • ResourceIdOnly - 변경될 리소스 목록을 반환합니다.

기본값은 FullResourcePayloads입니다.

PowerShell 배포 명령의 경우 매개 변수를 -WhatIfResultFormat 사용합니다. 프로그래밍 방식 개체 명령에서 매개 변수를 ResultFormat 사용합니다.

Azure CLI의 경우 --result-format 매개 변수를 사용합니다.

다음 결과는 두 가지 출력 형식을 보여 줍니다.

  • 전체 리소스 페이로드

    Resource and property changes are indicated with these symbols:
      - Delete
      + Create
      ~ Modify
    
    The deployment will update the following scope:
    
    Scope: /subscriptions/./resourceGroups/ExampleGroup
    
      ~ Microsoft.Network/virtualNetworks/vnet-001 [2018-10-01]
        - tags.Owner: "Team A"
        ~ properties.addressSpace.addressPrefixes: [
          - 0: "10.0.0.0/16"
          + 0: "10.0.0.0/15"
          ]
        ~ properties.subnets: [
          - 0:
            name:                     "subnet001"
            properties.addressPrefix: "10.0.0.0/24"
    
          ]
    
    Resource changes: 1 to modify.
    
  • 리소스 ID만

    Resource and property changes are indicated with this symbol:
      ! Deploy
    
    The deployment will update the following scope:
    
    Scope: /subscriptions/./resourceGroups/ExampleGroup
    
      ! Microsoft.Network/virtualNetworks/vnet-001
    
    Resource changes: 1 to deploy.
    

what-if 작업 실행

환경 설정

what-if 작동 방식을 확인하려면 몇 가지 테스트를 실행해 보겠습니다. 먼저 가상 네트워크를 만드는 템플릿을 배포합니다. 이 가상 네트워크를 사용하여 what-if 시나리오에서 변경 사항이 어떻게 보고되는지 테스트합니다.

New-AzResourceGroup `
  -Name ExampleGroup `
  -Location centralus
New-AzResourceGroupDeployment `
  -ResourceGroupName ExampleGroup `
  -TemplateUri "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/what-if/what-if-before.json"

테스트 수정

배포가 완료되면 what-if 작업을 테스트할 준비가 된 것입니다. 이번에는 가상 네트워크를 변경하는 템플릿을 배포합니다. 원래 태그가 하나 누락되고 서브넷이 제거되었으며 주소 접두사는 변경되었습니다.

New-AzResourceGroupDeployment `
  -Whatif `
  -ResourceGroupName ExampleGroup `
  -TemplateUri "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/what-if/what-if-after.json"

what-if 출력은 다음과 유사하게 표시됩니다.

변경 내용을 보여 주는 Resource Manager 템플릿 배포 what-if 작업 출력의 스크린샷

텍스트 출력은 다음과 같습니다.

Resource and property changes are indicated with these symbols:
  - Delete
  + Create
  ~ Modify

The deployment will update the following scope:

Scope: /subscriptions/./resourceGroups/ExampleGroup

  ~ Microsoft.Network/virtualNetworks/vnet-001 [2018-10-01]
    - tags.Owner: "Team A"
    ~ properties.addressSpace.addressPrefixes: [
      - 0: "10.0.0.0/16"
      + 0: "10.0.0.0/15"
      ]
    ~ properties.subnets: [
      - 0:

        name:                     "subnet001"
        properties.addressPrefix: "10.0.0.0/24"

      ]

Resource changes: 1 to modify.

출력 맨 위에 변경 형식을 나타내기 위해 색이 정의됩니다.

출력의 맨 아래에는 소유자 태그가 삭제된 것으로 표시됩니다. 주소 접두사는 10.0.0.0/16에서 10.0.0.0/15로 변경되었습니다. subnet001이라는 서브넷이 삭제되었습니다. 이러한 변경 내용은 배포되지 않았습니다. 템플릿을 배포할 때 발생하는 변경 내용의 미리 보기가 표시됩니다.

삭제된 것으로 나열된 속성 중 일부는 실제로 변경되지 않습니다. 속성은 템플릿에 없을 때 삭제된 것으로 잘못 보고될 수 있지만 배포하는 동안 자동으로 기본값으로 설정됩니다. 이 결과는 what-if 응답에서 "노이즈"로 간주됩니다. 마지막으로 배포된 리소스에는 속성에 대해 설정된 값이 있습니다. what-if 작업이 완료되면 이러한 속성이 결과에서 필터링됩니다.

프로그래밍 방식으로 가정 시나리오 결과 평가

이제 명령을 변수로 설정하여 프로그래밍 방식으로 what-if 결과를 평가해 보겠습니다.

$results = Get-AzResourceGroupDeploymentWhatIfResult `
  -ResourceGroupName ExampleGroup `
  -TemplateUri "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/what-if/what-if-after.json"

각 변경 내용에 대한 요약을 볼 수 있습니다.

foreach ($change in $results.Changes)
{
  $change.Delta
}

삭제 확인

what-if 작업은 배포 모드 사용을 지원합니다. 완료 모드로 설정하면 템플릿에 없는 리소스가 삭제됩니다. 다음 예제에서는 전체 모드로 정의된 리소스가 없는 템플릿을 배포합니다 .

템플릿을 배포하기 전에 변경 내용을 미리 보려면 배포 명령과 함께 switch 확인 매개 변수를 사용합니다. 변경 내용이 예상대로인 경우 배포를 완료하도록 응답합니다.

New-AzResourceGroupDeployment `
  -ResourceGroupName ExampleGroup `
  -Mode Complete `
  -Confirm `
  -TemplateUri "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/what-if/azuredeploy.json"

템플릿에 정의된 리소스가 없고 배포 모드가 완료되도록 설정되어 있으므로 가상 네트워크가 삭제됩니다.

배포 모드에서 Resource Manager 템플릿 배포 what-if 작업 출력이 완료된 스크린샷.

텍스트 출력은 다음과 같습니다.

Resource and property changes are indicated with this symbol:
  - Delete

The deployment will update the following scope:

Scope: /subscriptions/./resourceGroups/ExampleGroup

  - Microsoft.Network/virtualNetworks/vnet-001

      id:
"/subscriptions/./resourceGroups/ExampleGroup/providers/Microsoft.Network/virtualNet
works/vnet-001"
      ___location:        "centralus"
      name:            "vnet-001"
      tags.CostCenter: "12345"
      tags.Owner:      "Team A"
      type:            "Microsoft.Network/virtualNetworks"

Resource changes: 1 to delete.

Are you sure you want to execute the deployment?
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "Y"):

예상되는 변경 내용이 표시되고 배포를 실행할지 확인할 수 있습니다.

SDK들

Azure SDK를 통해 what-if 작업을 사용할 수 있습니다.

다음 단계