什么是部署堆栈?
Azure 部署堆栈是一种 Azure 资源,可让你将 Azure 资源集合的生命周期作为单个原子单元进行管理,即使这些资源跨越多个资源组或订阅。 使用它,你可以进行一致且可重复的部署,简化管理,并实现资源的有效缩放和更新。
本单元介绍 Azure 中的资源组织以及部署堆栈如何帮助你以以前不可能实现的方式管理资源。
资源组织
可以通过多种方法在 Azure 中组织资源。 可以选择根据环境(生产、暂存、开发)、应用程序生命周期或功能(例如,连接性或计算资源)来组织资源。 组织规模、应用程序数量和数据驻留等因素都会影响这些决策,每种情况都有通用的最佳做法。
对于部署环境,可以将它们分成不同的订阅甚至管理组。 应用程序的所有组件都可能存在于单个资源组中,也可能存在于多个资源组甚至多个订阅中。 对于 Azure 资源组织,最佳做法建议根据生命周期和安全性将资源组织到资源组中。
单资源组应用程序
有时候,对应用程序使用单个资源组是有意义的。 如果你是 Azure 新手,刚开始使用开发环境,或者部署没有很多资源的生产应用程序,则可以使用单个资源组。
资源组经常用作权限的安全边界。 如果安全要求不严格,则可在资源组范围内管理单个基于角色的访问控制 (RBAC) 分配。
假设应用程序由应用服务、应用程序见解和部署到单个资源组的 SQL 数据库组成。 组织有单独的团队负责管理计算、Web 应用程序和数据库。 如果组织的安全策略需要精细的 RBAC,则有必要在资源范围而不是资源组范围内确定权限范围。
随着时间的推移,与应用程序无关的资源也可能会部署到同一资源组。 例如,你的同事部署了新的 Azure Key Vault,但在部署时意外选择了错误的资源组。 这种情况可能很难确定哪些资源属于哪个应用程序,并可能导致意外删除关键资源之类的问题。
多资源组应用程序
当应用程序缩放到需要改变的程度时会发生什么? 可能需要将应用程序的各个部件分成单独的资源组,以简化安全控制。 例如,可以将所有计算资源放入计算资源组中,将应用程序资源放入应用程序资源组中,将所有数据库放入数据库资源组中。
使用该模型,你可以将权限范围限定到计算、应用程序和数据库团队及其相应的资源组。 虽然这种做法也许能解决问题,但你引入了分散管理。 由于 Azure 中的大多数部署都局限于资源组,因此你再也不能将资源作为单个单元进行管理。
如果将应用程序资源部署到单独的资源组,则可能很难识别哪些资源是应用程序的一部分。 可以使用 Azure 标记来帮助识别应用程序中的资源,但资源可能未正确标记。
在多资源组模型中,部署操作可能需要执行多次。 部署资源时,可能需要执行多个部署命令,具体取决于部署方法。 Azure 中的大多数部署都局限于资源组,因此需要首先部署网络资源,然后再部署应用程序资源。 这同样适用于删除操作。 如果需要删除与应用程序相关的所有资源组,则可能需要执行多个删除操作。
输入部署堆栈
部署堆栈会改变你对跨资源组和订阅的资源组织的看法。 使用部署堆栈,你可以对组成应用程序的所有资源进行分组,无论它们位于 Azure 资源组织层次结构中的什么位置。 可以将它们作为一个单元进行管理。 使用部署堆栈,可以对组成堆栈的资源集合执行生命周期操作。
请将部署堆栈视为一系列将应用程序的资源分组为一个单元的指针。 可以在不同范围(例如资源组、订阅和管理组)内创建部署堆栈。
考虑一下前面的示例。 通过使用单个堆栈部署应用程序及其资源,你现在可以在订阅级别和跨资源组范围内将应用程序作为单个单元进行管理。 每个资源组及其资源均由堆栈管理。
使用部署堆栈
可以在部署堆栈上执行什么操作? 可以创建、列出、更新和删除部署堆栈。 就资源来说,你可以查看堆栈中的资源、添加和删除堆栈内的资源,以及保护堆栈及其资源免遭删除。
创建和部署部署堆栈及其资源的操作与标准 Azure 部署几乎相同,并且它使用你习惯的 ARM JSON 模板、Bicep 文件或模板规格。 例如:
将 Bicep 文件部署到资源组的 Azure CLI 命令为:
az deployment group create \
--resource-group rg-depositsApplication \
--template-file ./main.bicep
在资源组范围内创建部署堆栈的 Azure CLI 命令是:
az stack group create \
--name stack-deposits \
--resource-group rg-depositsApplication \
--template-file ./main.bicep \
--action-on-unmanage detachAll \
--deny-settings-mode none
使用部署堆栈可以进行有效的环境清理。 使用部署堆栈,你可以通过单个 API 调用删除堆栈及其所有资源,而无需了解依赖关系。 此功能以可靠的方式简化了资源删除操作,提高了资源删除速度。 例如:
在资源组范围内删除部署堆栈及其资源的 Azure CLI 命令是:
az stack group delete \
--name stack-deposits \
--resource-group rg-depositsApplication \
--action-on-unmanage detachAll
注意
你可能已将完整模式部署用作现有部署策略的一部分。 如果是这样,请考虑将部署堆栈作为下一个发展方向,以及作为更安全的选项。
托管的资源
将 Bicep 文件、ARM JSON 模板或模板规格提交到部署堆栈时,该堆栈将负责管理文件中描述的资源。 由堆栈管理的资源称为“托管资源”,但这些资源仍通过原始模板文件进行修改。
如果某个资源不再需要由部署堆栈管理,则可修改堆栈,使之不再包含该资源。 部署堆栈的“对取消管理进行操作”行为决定了从部署堆栈的定义中删除的资源会发生什么情况。 该行为将在本单元后面讨论,它决定了是否从堆栈中分离或删除资源、资源组或管理组。
拒绝设置
此外还可以为堆栈及其资源配置“拒绝设置”,以防止未经授权的更改。 这些拒绝分配是可自定义的。 可以将模式设置为无标志、拒绝删除或拒绝写入和删除(听起来可能类似于 Azure 锁)。 此外还可以从拒绝分配中排除特定操作或服务主体。 考虑使用拒绝设置,以提供额外的保护层,防止意外修改和删除。