你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

部署堆栈(预览版)

Azure 部署堆栈是一种 Azure 资源,能够将一组 Azure 资源作为一个原子单位进行管理。 将 Bicep 文件或 ARM JSON 模板提交到部署堆栈后,会定义堆栈管理的资源。 如果删除了之前包含在模板中的资源,则会根据部署堆栈指定的 actionOnUnmanage 行为对其进行分离或删除。 与其他 Azure 资源类似,限制使用 Azure 基于角色的访问控制 (Azure RBAC) 对部署堆栈进行访问。

可以使用 Azure CLI、Azure PowerShell 或 Azure 门户配合 Bicep 文件来创建和更新部署堆栈。 这些 Bicep 文件转换为 ARM JSON 模板,然后由堆栈部署为部署对象。 除了熟悉的部署资源,部署堆栈还提供其他功能,作为这些功能的超集。

Microsoft.Resources/deploymentStacks 是部署堆栈的资源类型。 它由一个主模板组成,可跨范围对其描述的资源执行一对多更新,并能阻止对这些资源进行任何不想要的更改。

在规划部署和确定同一堆栈应包含哪些资源组时,一定要考虑到这些资源的管理生命周期,其中包含创建、更新和删除。 例如,假设你需要为不同资源组范围内的多个应用程序团队预配一些测试虚拟机。 这种情况下,可以使用部署堆栈来创建此类测试环境,并通过对部署堆栈进行后续更新来更新测试虚拟机配置。 项目完成后,可能必须移除或删除创建的任何资源,例如测试用的虚拟机。 通过利用部署堆栈,可通过指定合适的删除标记,轻松移除受管理资源。 这种方法更简便,可以在清理环境期间节省时间,因为其只涉及对堆栈资源进行一次更新,而不用一个一个去修改或删除各个资源组范围内的每个测试用虚拟机。

部署堆栈要求 Azure PowerShell 10.1.0 或更高版本,或者 Azure CLI 2.50.0 或更高版本

请跟随教程完成快速入门:创建部署堆栈,创建你的第一个部署堆栈。

为什么使用部署堆栈?

部署堆栈提供以下优势:

  • 将不同范围内的资源整合为有凝聚力的实体,简化预配和管理。
  • 通过拒绝设置防止有人对受管理资源进行不想要的修改。
  • 在部署堆栈更新期间采用删除标记来高效清理环境。
  • 为部署堆栈使用标准模板,例如 Bicep、ARM 模板或模板规格。

已知限制

  • 隐式创建的资源不由堆栈管理。 因此,无法拒绝分配或清理。
  • 拒绝分配不支持标记。
  • 管理组范围内不支持拒绝分配。
  • 部署堆栈无法删除密钥保管库机密。 如果要从模板中删除密钥保管库机密,请确保也使用分离模式执行部署堆栈更新/删除命令。

已知问题

  • 删除资源组目前会绕过拒绝分配。 在资源组范围内创建部署堆栈时,Bicep 文件不包含资源组的定义。 尽管设置为拒绝分配,但可以删除资源组及其包含的堆栈。 但是,如果在组内的任何资源上处于活动状态,则删除操作将失败。
  • 预览版不提供 What-if
  • 将限制管理组范围的堆栈不能部署到另一个管理组。 它只能部署到堆栈本身的管理组或子订阅。

创建部署堆栈

可以在资源组、订阅或管理组范围内创建部署堆栈。 传递到部署堆栈中的模板定义为模板部署指定的目标范围内要创建或更新的资源。

  • 资源组范围内的堆栈可以部署传递到其中存在部署堆栈的同一资源组范围内的模板。
  • 订阅范围内的堆栈可以部署传递到资源组范围(如指定)或存在部署堆栈的同一订阅范围的模板。
  • 管理组范围内的堆栈可以部署传递到指定的订阅范围的模板。

请一定注意哪里存在部署堆栈,以及使用拒绝设置功能创建的拒绝分配。 例如,通过创建在订阅范围内、将模板部署到资源组范围的部署堆栈,且拒绝设置模式为 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 文件进行更改。 进行修改后,可以使用以下两个选项来更新部署堆栈:运行更新命令,或重新运行创建命令。

可通过基础结构即代码 (IaC) 设计模式完全控制受管理资源的列表。

使用“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"

改用新命令

会收到类似于以下内容的警告:

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 更新不受管理资源,请使用包含以下其中删除标记之一的创建堆栈命令更新堆栈。 有关详细信息,请参阅创建部署堆栈

  • DeleteAll:如果是受管理资源和资源组,请使用删除而不是分离。
  • DeleteResources:如果只有受管理资源,请使用删除而不是分离。
  • DeleteResourceGroups:如果只有受管理资源组,请使用删除而不是分离。 单独使用 DeleteResourceGroups 是无效。 必须将 DeleteResourceGroupsDeleteResources 一起使用。

例如:

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

警告

删除具有 DeleteAllDeleteResourceGroups 属性的资源组时,会同时删除受管理资源组以及其中包含的所有资源。

删除部署堆栈

如果运行不包含删除标记的删除命令,则不受管理资源将被分离,但不会被删除。 若要删除不受管理资源,请使用以下开关:

  • 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 门户图形用户界面 (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 文件,然后运行更新命令或重新运行创建命令。 有关详细信息,请参阅更新部署堆栈

从部署堆栈中删除受管理资源

若要删除受管理资源,请从基础 Bicep 文件中删除资源定义,然后运行更新命令或重新运行创建命令。 有关详细信息,请参阅更新部署堆栈

防止受管理资源被删除

创建部署堆栈时,可以向受管理资源分配特定类型的权限,防止未经授权的安全主体删除这些资源。 这些设置称为拒绝设置。 堆栈应存储在父范围内。

Azure PowerShell 包含以下参数,用于自定义拒绝分配:

  • DenySettingsMode:定义禁止对托管资源进行的操作,以防止未经授权的安全主体尝试删除或更新这些资源。 除非明确授予权限,否则此限制适用于所有人。 值包括:NoneDenyDeleteDenyWriteAndDelete
  • 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>'

后续步骤

若要完成快速入门,请参阅快速入门:创建部署堆栈