배포 스택(미리 보기)

Azure 배포 스택은 Azure 리소스 그룹을 원자 단위로 관리할 수 있는 Azure 리소스의 일종입니다. Bicep 파일 또는 ARM JSON 템플릿이 배포 스택에 제출되면 배포 스택은 스택에서 관리하는 리소스를 정의합니다. 이전에 템플릿에 포함된 리소스가 제거되면 해당 리소스는 배포 스택에 지정된 actionOnUnmanage 동작에 따라 분리되거나 삭제됩니다. 다른 Azure 리소스와 마찬가지로 Azure RBAC(Azure 역할 기반 액세스 제어)를 사용하여 배포 스택에 대한 액세스를 제한할 수 있습니다.

Bicep 파일과 함께 Azure CLI, Azure PowerShell 또는 Azure Portal을 활용하여 배포 스택을 만들고 업데이트할 수 있습니다. 이러한 Bicep 파일은 ARM JSON 템플릿으로 변환된 다음, 스택에 의해 배포 개체로 배포됩니다. 배포 스택은 익숙한 배포 리소스 외에도 추가 기능을 제공하며, 이러한 기능의 상위 집합 역할을 합니다.

Microsoft.Resources/deploymentStacks는 배포 스택의 리소스 종류입니다. 설명하는 리소스에 대한 범위 전체에서 일대다 업데이트를 수행하고 해당 리소스에 대한 원치 않는 변경을 차단할 수 있는 기본 템플릿으로 구성됩니다.

배포를 계획하고 동일한 스택에 포함할 리소스 그룹을 결정할 때에는 만들기, 업데이트, 삭제를 포함하여 해당 리소스의 관리 수명 주기를 고려해야 합니다. 예를 들어 여러 리소스 그룹 범위에서 다양한 애플리케이션 팀이 사용할 테스트 VM을 프로비전해야 한다고 가정하겠습니다. 이 경우 배포 스택을 활용하여 이러한 테스트 환경을 만들고 이후에 배포 스택을 업데이트하여 테스트 VM 구성을 업데이트할 수 있습니다. 프로젝트를 완료한 후에는 만든 리소스(예: 테스트 VM)를 제거하거나 삭제해야 할 수도 있습니다. 배포 스택을 활용하면 적절한 삭제 플래그를 지정하여 관리되는 리소스를 쉽게 제거할 수 있습니다. 이 효율적인 접근 방식은 다양한 리소스 그룹 범위에서 각 테스트 VM을 개별적으로 수정하거나 제거하는 대신 스택 리소스를 한 번만 업데이트하므로 환경 정리에 소요되는 시간이 절약됩니다.

배포 스택을 사용하려면 Azure PowerShell 버전 10.1.0 이상 또는 Azure CLI 버전 2.50.0 이상이 필요합니다.

첫 번째 배포 스택을 만들려면 빠른 시작: 배포 스택 만들기를 진행하세요.

배포 스택을 사용하는 이유

배포 스택은 다음과 같은 이점이 있습니다.

  • 여러 범위에서 응집력 있는 엔터티로써 리소스의 프로비전 및 관리를 간소화합니다.
  • 거부 설정을 통해 관리되는 리소스에 대한 원치 않는 수정을 차단합니다.
  • 배포 스택을 업데이트하는 동안 삭제 플래그를 사용하여 효율적으로 환경을 정리합니다.
  • Bicep, ARM 템플릿 또는 템플릿 사양과 같은 표준 템플릿을 배포 스택에 활용합니다.

알려진 제한 사항

  • 암시적으로 만들어진 리소스는 스택이 관리하지 않습니다. 따라서 거부 할당 또는 정리가 불가능합니다.
  • 거부 할당은 태그를 지원하지 않습니다.
  • 관리 그룹 범위 내에서는 거부 할당이 지원되지 않습니다.
  • 배포 스택은 키 자격 증명 모음 비밀을 삭제할 수 없습니다. 템플릿에서 키 자격 증명 모음 비밀을 제거하는 경우 분리 모드에서 배포 스택 업데이트/삭제 명령도 실행해야 합니다.

알려진 문제

  • 현재는 리소스 그룹을 삭제하면 거부 할당이 무시됩니다. 리소스 그룹 범위에서 배포 스택을 만들 때 Bicep 파일에는 리소스 그룹에 대한 정의가 포함되지 않습니다. 거부 할당 설정에도 불구하고 리소스 그룹 및 포함된 스택을 삭제할 수 있습니다. 그러나 그룹 내의 모든 리소스에서 잠금이 활성 상태이면 삭제 작업이 실패합니다.
  • 미리 보기에서는 가상 시나리오를 사용할 수 없습니다.
  • 관리 그룹 범위 스택은 다른 관리 그룹에 배포하는 것이 제한됩니다. 스택 자체의 관리 그룹이나 자식 구독에만 배포할 수 있습니다.

배포 스택 만들기

배포 스택 리소스는 리소스 그룹, 구독 또는 관리 그룹 범위에서 만들 수 있습니다. 배포 스택에 전달된 템플릿은 템플릿 배포에 지정된 대상 범위에서 만들거나 업데이트할 리소스를 정의합니다.

  • 리소스 그룹 범위의 스택은 배포 스택이 있는 동일한 리소스 그룹 범위에 전달된 템플릿을 배포할 수 있습니다.
  • 구독 범위의 스택은 배포 스택이 있는 리소스 그룹 범위(지정된 경우) 또는 동일한 구독 범위에 전달된 템플릿을 배포할 수 있습니다.
  • 관리 그룹 범위의 스택은 지정된 구독 범위에 전달된 템플릿을 배포할 수 있습니다.

배포 스택이 있는 곳에는 거부 설정 기능을 사용하여 만든 거부 할당도 있다는 점에 유의해야 합니다. 예를 들어 구독 범위에서 리소스 그룹 범위에 템플릿을 배포하는 배포 스택을 만들고 거부 설정 모드 DenyDelete를 사용하면 관리되는 리소스를 지정된 리소스 그룹에 쉽게 프로비전하고 해당 리소스를 삭제하려는 시도를 차단할 수 있습니다. 이 방법을 사용하면 리소스 그룹 수준이 아닌 구독 수준에서 배포 스택을 분리하여 배포 스택의 보안을 강화할 수도 있습니다. 이렇게 분리하면 프로비전된 리소스를 작업하는 개발자 팀은 리소스 그룹만 보고 쓸 수 있으며, 배포 스택은 더 높은 수준에서 격리된 상태로 유지됩니다. 이렇게 하면 배포 스택을 편집하고 거부 할당을 변경할 수 있는 사용자 수가 최소화됩니다. 자세한 내용은 삭제로부터 관리되는 리소스 보호를 참조하세요.

create-stack 명령을 사용하여 배포 스택을 업데이트할 수도 있습니다.

리소스 그룹 범위에서 배포 스택을 만들려면 다음을 수행합니다.

New-AzResourceGroupDeploymentStack `
  -Name "<deployment-stack-name>" `
  -ResourceGroupName "<resource-group-name>" `
  -TemplateFile "<bicep-file-name>" `
  -DenySettingsMode "none"

구독 범위에서 배포 스택을 만들려면 다음을 수행합니다.

New-AzSubscriptionDeploymentStack `
  -Name "<deployment-stack-name>" `
  -Location "<location>" `
  -TemplateFile "<bicep-file-name>" `
  -DeploymentResourceGroupName "<resource-group-name>" `
  -DenySettingsMode "none"

DeploymentResourceGroupName 매개 변수는 관리되는 리소스를 저장하는 데 사용할 리소스 그룹을 지정합니다. 이 매개 변수를 지정하지 않으면 관리되는 리소스가 구독 범위에 저장됩니다.

관리 그룹 범위에서 배포 스택을 만들려면 다음을 수행합니다.

New-AzManagmentGroupDeploymentStack `
  -Name "<deployment-stack-name>" `
  -Location "<location>" `
  -TemplateFile "<bicep-file-name>" `
  -DeploymentSubscriptionId "<subscription-id>" `
  -DenySettingsMode "none"

deploymentSubscriptionId 매개 변수는 관리되는 리소스를 저장하는 데 사용할 구독을 지정합니다. 이 매개 변수를 지정하지 않으면 관리되는 리소스가 관리 그룹 범위에 저장됩니다.

배포 스택 나열

리소스 그룹 범위의 배포 스택 리소스를 나열하려면 다음을 수행합니다.

Get-AzResourceGroupDeploymentStack `
  -ResourceGroupName "<resource-group-name>"

구독 범위의 배포 스택 리소스를 나열하려면 다음을 수행합니다.

Get-AzSubscriptionDeploymentStack

관리 그룹 범위의 배포 스택 리소스를 나열하려면 다음을 수행합니다.

Get-AzManagementGroupDeploymentStack `
  -ManagementGroupId "<management-group-id>"

배포 스택 업데이트

관리되는 리소스를 추가 또는 삭제해야 할 수도 있는 배포 스택 업데이트를 수행하려면 기본 Bicep 파일을 변경해야 합니다. 수정을 마친 후, 배포 스택을 업데이트하는 두 가지 옵션이 있습니다. 하나는 update 명령을 실행하는 것이고, 다른 하나는 create 명령을 다시 실행하는 것입니다.

관리되는 리소스 목록은 IaC(Infrastructure as Code) 디자인 패턴을 통해 완벽하게 제어할 수 있습니다.

Set 명령 사용

리소스 그룹 범위에서 배포 스택을 업데이트하려면 다음을 수행합니다.

Set-AzResourceGroupDeploymentStack `
  -Name "<deployment-stack-name>" `
  -ResourceGroupName "<resource-group-name>" `
  -TemplateFile "<bicep-file-name>" `
  -DenySettingsMode "none"

구독 범위에서 배포 스택을 업데이트하려면 다음을 수행합니다.

Set-AzSubscriptionDeploymentStack `
   -Name "<deployment-stack-name>" `
   -Location "<location>" `
   -TemplateFile "<bicep-file-name>" `
   -DeploymentResourceGroupName "<resource-group-name>" `
  -DenySettingsMode "none"

DeploymentResourceGroupName 매개 변수는 배포 스택 리소스를 저장하는 데 사용할 리소스 그룹을 지정합니다. 리소스 그룹 이름을 지정하지 않으면 배포 스택 서비스가 자동으로 새 리소스 그룹을 만듭니다.

관리 그룹 범위에서 배포 스택을 업데이트하려면 다음을 수행합니다.

Set-AzManagmentGroupDeploymentStack `
  -Name "<deployment-stack-name>" `
  -Location "<location>" `
  -TemplateFile "<bicep-file-name>" `
  -DeploymentSubscriptionId "<subscription-id>" `
  -DenySettingsMode "none"

New 명령 사용

다음과 비슷한 경고가 표시됩니다.

The deployment stack 'myStack' you're trying to create already exists in the current subscription/management group/resource group. Do you want to overwrite it? Detaching: resources, resourceGroups (Y/N)

자세한 내용은 배포 스택 만들기를 참조하세요.

분리 및 삭제 제어

분리된 리소스(또는 관리되지 않는 리소스)란 배포 스택이 추적하거나 관리하지는 않지만 여전히 Azure 내에 있는 리소스를 말합니다.

관리되지 않는 리소스를 삭제하도록 Azure에 지시하려면 다음 삭제 플래그 중 하나를 사용하여 create stack 명령으로 스택을 업데이트합니다. 자세한 내용은 배포 스택 만들기를 참조하세요.

  • DeleteAll: 관리되는 리소스와 리소스 그룹에는 detach 대신 delete를 사용합니다.
  • DeleteResources: 관리되는 리소스에만 detach 대신 delete를 사용합니다.
  • DeleteResourceGroups: 관리되는 리소스 그룹에만 detach 대신 delete를 사용합니다. DeleteResourceGroups를 단독으로 사용하는 것은 유효하지 않습니다. DeleteResourceGroupsDeleteResources와 함께 사용해야 합니다.

예시:

New-AzSubscriptionDeploymentStack `
  -Name "<deployment-stack-name" `
  -TemplateFile "<bicep-file-name>" `
  -DenySettingsMode "none" `
  -DeleteResourceGroups `
  -DeleteResources

Warning

DeleteAll 또는 DeleteResourceGroups 속성을 사용하여 리소스 그룹을 삭제하면 관리되는 리소스 그룹과 그 안에 있는 모든 리소스도 삭제됩니다.

배포 스택 삭제

삭제 플래그 없이 delete 명령을 실행하면 관리되지 않는 리소스가 분리되지만 삭제되지는 않습니다. 관리되지 않는 리소스를 삭제하려면 다음 스위치를 사용합니다.

  • DeleteAll: 리소스와 리소스 그룹을 모두 삭제합니다.
  • DeleteResources: 리소스만 삭제합니다.
  • DeleteResourceGroups: 리소스 그룹만 삭제합니다.

모든 스위치를 삭제하도록 지정하더라도 배포 스택이 있는 리소스 그룹 내에 관리되지 않는 리소스가 있으면 관리되지 않는 리소스와 리소스 그룹 자체는 삭제되지 않습니다.

리소스 그룹 범위의 배포 스택 리소스를 삭제하려면 다음을 수행합니다.

Remove-AzResourceGroupDeploymentStack `
  -name "<deployment-stack-name>" `
  -ResourceGroupName "<resource-group-name>" `
  [-DeleteAll/-DeleteResourceGroups/-DeleteResources]

구독 범위의 배포 스택 리소스를 삭제하려면 다음을 수행합니다.

Remove-AzSubscriptionDeploymentStack `
  -Name "<deployment-stack-name>" `
  [-DeleteAll/-DeleteResourceGroups/-DeleteResources]

관리 그룹 범위의 배포 스택 리소스를 삭제하려면 다음을 수행합니다.

Remove-AzManagementGroupDeploymentStack `
  -Name "<deployment-stack-name>" `
  -ManagementGroupId "<management-group-id>" `
  [-DeleteAll/-DeleteResourceGroups/-DeleteResources]

배포 스택에서 관리되는 리소스 보기

공개 미리 보기 기간에는 배포 스택 서비스에 Azure Portal GUI(그래픽 사용자 인터페이스)가 없습니다. 배포 스택 내에서 관리되는 리소스를 보려면 다음 Azure Powershell/Azure CLI 명령을 사용합니다.

리소스 그룹 범위의 관리되는 리소스를 보려면 다음을 수행합니다.

(Get-AzResourceGroupDeploymentStack -Name "<deployment-stack-name>" -ResourceGroupName "<resource-group-name>").Resources

구독 범위의 관리되는 리소스를 보려면 다음을 수행합니다.

(Get-AzSubscriptionDeploymentStack -Name "<deployment-stack-name>").Resources

관리 그룹 범위의 관리되는 리소스를 보려면 다음을 수행합니다.

(Get-AzManagementGroupDeploymentStack -Name "<deployment-stack-name>" -ManagementGroupId "<management-group-id>").Resources

배포 스택에 리소스 추가

관리되는 리소스를 추가하려면 기본 Bicep 파일에 리소스 정의를 추가한 다음, update 명령을 실행하거나 create 명령을 다시 실행합니다. 자세한 내용은 배포 스택 업데이트를 참조하세요.

배포 스택에서 관리되는 리소스 삭제

관리되는 리소스를 삭제하려면 기본 Bicep 파일의 리소스 정의를 제거한 다음, update 명령을 실행하거나 create 명령을 다시 실행합니다. 자세한 내용은 배포 스택 업데이트를 참조하세요.

관리되는 리소스를 삭제하지 못하게 보호

배포 스택을 만들 때, 특정 유형의 권한을 관리되는 리소스에 할당하여 권한 없는 보안 주체에 의한 삭제를 방지할 수 있습니다. 이러한 설정을 거부 설정이라고 합니다. 부모 범위에 스택을 저장하려고 합니다.

Azure PowerShell에는 거부 할당을 사용자 지정하는 다음 매개 변수가 포함되어 있습니다.

  • DenySettingsMode: 권한 없는 보안 주체가 관리되는 리소스를 삭제하거나 업데이트하려는 시도를 차단하기 위해 관리되는 리소스에 대해 금지되는 작업을 정의합니다. 이 제한은 액세스 권한이 명시적으로 부여되는 경우를 제외하고는 모든 사용자에게 적용됩니다. 값은 None, DenyDeleteDenyWriteAndDelete입니다.
  • DenySettingsApplyToChildScopes: 거부 설정은 관리되는 리소스 아래의 중첩된 리소스에 적용됩니다.
  • DenySettingsExcludedAction: 거부 설정에서 제외되는 역할 기반 관리 작업의 목록입니다. 최대 200개의 작업이 허용됩니다.
  • DenySettingsExcludedPrincipal: 잠금에서 제외된 Microsoft Entra 보안 주체 ID 목록입니다. 최대 5개의 보안 주체가 허용됩니다.

리소스 그룹 범위에서 거부 설정을 적용하려면 다음을 수행합니다.

New-AzResourceGroupDeploymentStack `
  -Name "<deployment-stack-name>" `
  -ResourceGroupName "<resource-group-name>" `
  -TemplateFile "<bicep-file-name>" `
  -DenySettingsMode "DenyDelete" `
  -DenySettingsExcludedAction "Microsoft.Compute/virtualMachines/write Microsoft.StorageAccounts/delete" `
  -DenySettingsExcludedPrincipal "<object-id>,<object-id>"

구독 범위에서 거부 설정을 적용하려면 다음을 수행합니다.

New-AzSubscriptionDeploymentStack `
  -Name "<deployment-stack-name>" `
  -Location "<location>" `
  -TemplateFile "<bicep-file-name>" `
  -DenySettingsMode "DenyDelete" `
  -DenySettingsExcludedAction "Microsoft.Compute/virtualMachines/write Microsoft.StorageAccounts/delete" `
  -DenySettingsExcludedPrincipal "<object-id>,<object-id>"

DeploymentResourceGroupName 매개 변수를 사용하여 배포 스택이 만들어지는 리소스 그룹 이름을 지정합니다. 범위를 지정하지 않으면 배포 스택의 범위가 사용됩니다.

관리 그룹 범위에서 거부 설정을 적용하려면 다음을 수행합니다.

New-AzManagmentGroupDeploymentStack `
  -Name "<deployment-stack-name>" `
  -Location "<location>" `
  -TemplateFile "<bicep-file-name>" `
  -DenySettingsMode "DenyDelete" `
  -DenySettingsExcludedActions "Microsoft.Compute/virtualMachines/write Microsoft.StorageAccounts/delete" `
  -DenySettingsExcludedPrincipal "<object-id>,<object-id>"

DeploymentSubscriptionId 매개 변수를 사용하여 배포 스택이 만들어지는 구독 ID를 지정합니다. 범위를 지정하지 않으면 배포 스택의 범위가 사용됩니다.

배포 스택에서 관리되는 리소스 분리

기본적으로 배포 스택은 관리되지 않는 리소스가 스택의 관리 범위에 더 이상 포함되지 않을 때 관리되지 않는 리소스를 분리하지만 삭제하지는 않습니다. 자세한 내용은 배포 스택 업데이트를 참조하세요.

배포 스택에서 템플릿 내보내기

배포 스택에서 JSON 출력으로 리소스를 내보낼 수 있습니다. 출력을 파일로 파이프할 수 있습니다.

리소스 그룹 범위에서 배포 스택을 내보내려면 다음을 수행합니다.

Save-AzResourceGroupDeploymentStack `
   -Name '<deployment-stack-name>' `
   -ResourceGroupName '<resource-group-name>' `

구독 범위에서 배포 스택을 내보내려면 다음을 수행합니다.

Save-AzSubscriptionDeploymentStack `
  -name '<deployment-stack-name>'

관리 그룹 범위에서 배포 스택을 내보내려면 다음을 수행합니다.

Save-AzManagmentGroupDeploymentStack `
  -Name '<deployment-stack-name>' `
  -ManagementGroupId '<management-group-id>'

다음 단계

빠른 시작을 진행하려면 빠른 시작: 배포 스택 만들기를 참조하세요.