ARM 템플릿 배포 가상 작업
Azure Resource Manager 템플릿(ARM 템플릿)을 배포하기 전에 변경 내용을 미리 볼 수 있습니다. Azure Resource Manager는 템플릿을 배포하는 경우 리소스가 어떻게 변경되는지 확인할 수 있도록 하는 가상 작업을 제공합니다. 가상 작업은 기존 리소스를 변경하지 않습니다. 대신, 지정된 템플릿이 배포되는 경우 변경 내용을 예측합니다.
Azure PowerShell, Azure CLI 또는 REST API 작업을 사용하여 가상 작업을 사용할 수 있습니다. 가상은 리소스 그룹, 구독, 관리 그룹, 테넌트 수준 배포에 지원됩니다.
학습 리소스
what-if에 대한 자세한 내용과 실습 지침은 what-if를 사용하여 Azure 배포 변경 내용 미리 보기를 참조하세요.
필요한 사용 권한
Bicep 파일 또는 ARM 템플릿을 배포하려면 배포하는 리소스에 대한 쓰기 액세스 및 Microsoft.Resources/deployments 리소스 형식의 모든 작업에 대한 액세스가 필요합니다. 예를 들어 가상 머신을 배포하려면 Microsoft.Compute/virtualMachines/write
및 Microsoft.Resources/deployments/*
권한이 필요합니다. 가상 작업에는 동일한 사용 권한 요구 사항이 있습니다.
역할 및 사용 권한 목록은 Azure 기본 제공 역할을 참조하세요.
What-if 제한
What-if는 다음 제한에 도달할 때까지 중첩된 템플릿을 확장합니다.
- 중첩된 템플릿 500개.
- 리소스 그룹 간 배포의 리소스 그룹 800개.
- 중첩된 템플릿을 확장하는 데 소요되는 5분.
제한 중 하나에 도달하면 나머지 리소스의 변경 유형이 무시로 설정됩니다.
Azure PowerShell 모듈 설치
PowerShell에서 ‘가상’을 사용하려면 Az 모듈 4.2 이상 버전을 사용해야 합니다.
모듈 설치 시 다음을 사용합니다.
Install-Module -Name Az -Force
모듈을 설치하는 방법에 관한 자세한 내용은 Azure PowerShell 설치를 참조하세요.
Azure CLI 모듈 설치
Azure CLI에서 가상을 사용하려면 Azure CLI 2.14.0 이상이 있어야 합니다. 필요한 경우 최신 버전의 Azure CLI를 설치합니다.
결과 보기
PowerShell 또는 Azure CLI에서 가상을 사용하는 경우 다양한 형식의 변경 내용을 볼 수 있도록 하는 색으로 구분된 결과가 출력에 포함됩니다.
텍스트 출력은 다음과 같습니다.
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.
참고 항목
가상 작업은 reference 함수를 확인할 수 없습니다. 속성을 reference 함수를 포함하는 템플릿 식으로 설정할 때마다 가상은 속성 변경을 보고합니다. 해당 동작은 가상이 속성(예: 부울 값에 관한 true
또는 false
)의 현재 값을 확인되지 않은 템플릿 식과 비교하기 때문에 발생합니다. 분명히 이러한 값은 일치하지 않습니다. 템플릿을 배포할 때 속성은 템플릿 식이 다른 값으로 확인되는 경우에만 변경됩니다.
가상 명령
Azure PowerShell
템플릿을 배포하기 전에 변경 내용을 미리 보려면 New-AzResourceGroupDeployment 또는 New-AzSubscriptionDeployment를 사용합니다. -Whatif
스위치 매개 변수를 배포 명령에 추가합니다.
리소스 그룹 배포의 경우
New-AzResourceGroupDeployment -Whatif
구독 수준 배포의 경우
New-AzSubscriptionDeployment -Whatif
및New-AzDeployment -Whatif
-Confirm
스위치 매개 변수를 사용하여 변경 내용을 미리 보고 배포를 계속하라는 프롬프트를 받을 수 있습니다.
- 리소스 그룹 배포의 경우
New-AzResourceGroupDeployment -Confirm
- 구독 수준 배포의 경우
New-AzSubscriptionDeployment -Confirm
및New-AzDeployment -Confirm
이전 명령은 수동으로 검사할 수 있는 텍스트 요약을 반환합니다. 프로그래밍 방식으로 변경 내용을 검사할 수 있는 개체를 가져오려면 Get-AzResourceGroupDeploymentWhatIfResult 또는 Get-AzSubscriptionDeploymentWhatIfResult를 사용합니다.
- 리소스 그룹 배포의 경우
$results = Get-AzResourceGroupDeploymentWhatIfResult
- 구독 수준 배포의 경우
$results = Get-AzSubscriptionDeploymentWhatIfResult
또는$results = Get-AzDeploymentWhatIfResult
Azure CLI
템플릿을 배포하기 전에 변경 내용을 미리 보려면 다음을 사용합니다.
- 리소스 그룹 배포의 경우 az deployment group what-if
- 구독 수준 배포의 경우 az deployment sub what-if
- 관리 그룹 배포의 경우 az deployment mg what-if
- 테넌트 배포의 경우 az deployment tenant what-if
--confirm-with-what-if
스위치(또는 약식인 -c
)를 사용하여 변경 내용을 미리 보고 배포를 계속하라는 프롬프트를 받을 수 있습니다. 다음에 스위치를 추가합니다.
- az deployment group create
- az deployment sub create.
- az deployment mg create
- az deployment tenant create
예를 들어 리소스 그룹 배포의 경우 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의 경우 다음을 사용합니다.
- 리소스 그룹 배포의 경우 Deployments - What If
- 구독 배포의 경우 Deployments - What If At Subscription Scope
- 관리 그룹 배포의 경우 Deployments - What If At Management Group Scope
- 테넌트 배포의 경우 Deployments - What If At Tenant Scope.
변경 형식
가상 작업은 다음과 같은 7가지 형식의 변경 내용을 나열합니다.
- 만들기: 현재는 리소스가 없지만 템플릿에 정의되어 있습니다. 리소스가 생성됩니다.
- 삭제: 해당 변경 형식은 배포에 전체 모드를 사용하는 경우에만 적용됩니다. 리소스가 있지만 템플릿에 정의되어 있지 않습니다. 전체 모드에서는 리소스가 삭제됩니다. ‘전체 모드’ 삭제를 지원하는 리소스만 이 변경 형식에 포함됩니다.
- 무시: 리소스가 있지만 템플릿에 정의되어 있지 않습니다. 리소스가 배포 또는 수정되지 않습니다. 중첩된 템플릿 확장의 제한에 도달하면 이 변경 유형이 표시됩니다. What-if 제한을 참조하세요.
- NoChange: 리소스가 있고 템플릿에 정의되어 있습니다. 리소스가 다시 배포되지만 리소스의 속성이 변경되지 않습니다. 이 변경 유형은 ResultFormat이 기본값인
FullResourcePayloads
로 설정된 경우에 반환됩니다. - NoEffect: 속성은 준비 전용이며 서비스에서 무시됩니다. 예를 들어
sku.tier
속성은 항상Microsoft.ServiceBus
네임스페이스에서sku.name
과 일치하도록 설정됩니다. - 수정: 리소스가 있고 템플릿에 정의되어 있습니다. 리소스가 다시 배포되고 리소스의 속성이 변경됩니다. 이 변경 유형은 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.
가상 작업 실행
환경 설정
가상이 작동하는 방식을 확인하기 위해 일부 테스트를 실행해 보겠습니다. 먼저 가상 네트워크를 만드는 템플릿을 배포합니다. 이 가상 네트워크를 사용하여 변경 내용이 어떻게 가상으로 보고되는지 테스트할 수 있습니다.
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"
테스트 수정
배포가 완료되면 가상 작업을 테스트할 준비가 된 것입니다. 이번에는 가상 네트워크를 변경하는 템플릿을 배포합니다. 원래 태그 중 하나가 누락되고, 서브넷이 제거되고, 주소 접두사가 변경되었습니다.
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 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이라는 서브넷이 삭제되었습니다. 이러한 변경 내용은 배포되지 않았습니다. 템플릿을 배포하는 경우 변경 내용의 미리 보기가 표시됩니다.
삭제된 것으로 표시되는 일부 속성은 실제로 변경되지 않습니다. 속성은 템플릿에 없을 때 삭제된 것으로 잘못 보고될 수 있지만, 배포 중에 기본값으로 자동 설정됩니다. 이 결과는 가상 응답에서 "노이즈"로 간주됩니다. 최종 배포된 리소스는 속성에 설정된 값을 갖습니다. 가상 작업이 완성됨에 따라 해당 속성은 결과에서 필터링됩니다.
가상 결과를 프로그래밍 방식으로 평가
이제 명령을 변수에 설정하여 가상 결과를 프로그래밍 방식으로 평가해 보겠습니다.
$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
}
삭제 확인
배포 모드를 사용하는 가상 작업 지원. 전체 모드로 설정된 경우 템플릿에 없는 리소스는 삭제됩니다. 다음 예제에서는 전체 모드에서 정의된 리소스가 없는 템플릿을 배포합니다.
템플릿을 배포하기 전에 변경 내용을 미리 보려면 배포 명령에서 confirm 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 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를 통해 가상 작업을 사용할 수 있습니다.
Python의 경우 가상를 사용합니다.
Java의 경우 DeploymentWhatIf Class를 사용합니다.
.NET의 경우 DeploymentWhatIf Class를 사용합니다.
다음 단계
- ARM Deployment Insights 확장은 Azure DevOps 파이프라인에서 가상 작업을 통합하는 쉬운 방법을 제공합니다.
- 파이프라인에서 가상 작업을 사용하려면 파이프라인에서 가상을 사용하여 ARM 템플릿 테스트를 참조하세요.
- 가상 작업에서 잘못된 결과가 표시되는 경우 https://aka.ms/whatifissues에서 문제를 보고하세요.
- 가상의 사용에 관한 Learn 모듈은 변경 내용 미리 보기 및 가상 및 ARM 템플릿 테스트 도구 키트를 사용하여 Azure 리소스 유효성 검사를 참조하세요.