Azure 部署堆疊是一項資源,可讓您將一組 Azure 資源當作單一的整合單位來管理。 當您將 Bicep 檔案或 Azure Resource Manager JSON 範本 (ARM JSON 範本) 提交至部署堆疊時,您可以定義堆疊所管理的資源。 如果您從範本中移除資源,則可以根據部署堆疊的指定 actionOnUnmanage 行為來卸離或刪除該資源。 您可以使用 Azure 角色型存取控制 (Azure RBAC)來限制對部署堆疊的存取,類似於其他 Azure 資源。
若要建立和更新部署堆疊,請使用 Azure CLI、Azure PowerShell 或 Azure 入口網站搭配 Bicep 檔案。 堆疊會將這些 Bicep 檔案轉譯成 ARM JSON 範本,並將其部署為部署物件。 部署堆疊除了 熟悉的部署資源 之外,還提供其他功能,而且是這些功能的超集。
部署堆疊的資源類型為 Microsoft.Resources/deploymentStacks, 它由一個主要範本組成,可以針對其所描述的資源,在不同範圍內執行一對多的更新,並封鎖這些資源的任何不需要的變更。
規劃部署並判斷哪些資源群組應該屬於相同堆疊時,請考慮這些資源的管理生命週期,包括建立、更新和刪除。 例如,您可能需要為不同資源群組範圍的各種應用程式小組布建一些測試虛擬機。 您可以使用部署堆疊來建立這些測試環境,並透過部署堆疊的後續更新來更新測試虛擬機組態。 完成項目之後,您可能需要移除或刪除您所建立的任何資源,例如測試虛擬機。 使用部署堆疊並指定適當的刪除旗標來移除受控資源。 這種簡化的方法可節省環境清除期間的時間,因為它牽涉到堆疊資源的單一更新,而不是在各種資源群組範圍中個別修改或移除每個測試虛擬機。
部署堆疊需要 Azure PowerShell 12.0.0 版或更新版本 ,或 Azure CLI 2.61.0 版或更新版本。
若要建立您的第一個部署堆疊,請參閱快速入門:建立部署堆疊。
為何要使用部署堆疊?
部署堆疊可提供下列優勢:
- 以整合實體形式,將不同範圍資源的佈建與管理簡化。
- 透過拒絕設定防止對受控資源的不必要修改。
- 在部署堆疊更新期間,使用刪除旗標有效執行環境清除作業。
- 使用標準範本,例如 Bicep、ARM 範本或部署堆疊的標準範本規格。
已知的限制
- 在單一範圍內可以建立的部署堆疊有800個限制。
- 在任何指定範圍內,最多可以存在 2,000 個「拒絕指派」條目。
- 部署堆疊不會管理隱含建立的資源。 因此,您無法針對這些資源使用 拒絕指派 或清除。
- 拒絕指派不支援標記。
- 拒絕指派在管理群組範圍不受支援。 不過,如果部署指向訂用帳戶範圍,則會在管理群組堆疊中支援。
- 部署堆疊無法刪除金鑰保存庫袐密。 如果您要從範本移除金鑰保存庫袐密,請務必也以中斷連結模式執行部署堆疊更新/刪除命令。
已知問題
- 刪除資源群組目前會略過拒絕指派。 當您在資源群組範圍中建立部署堆疊時,Bicep 檔案不會包含資源群組的定義。 儘管拒絕指派設定,但您可以刪除資源群組及其所包含的堆疊。 然而,若群組內任一資源遭到鎖定,刪除作業將會失敗。
- 目前尚未提供假設狀況支援。
- 管理群組範圍內的堆疊無法部署到另一個管理群組。 其只能部署到堆疊本身的管理群組或子訂用帳戶。
- Azure PowerShell 命令說明會列出
DeleteResourcesAndResourcesGroups切換的ActionOnUnmanage值。 當您使用此值時,命令會分離受管控的資源和資源群組。 下一個更新會移除此值。 請勿使用此值。 - 在某些情況下,New 和 Set Azure PowerShell cmdlet 可能會返回一個無法明確採取行動的泛型範本驗證錯誤。 下一個版本將會修正這個 Bug。 如果錯誤不清楚,請在偵錯模式中執行 Cmdlet,以查看原始回應中更詳細的錯誤。
- Microsoft Graph 提供者 不支援部署堆疊。
內建角色
警告
RBAC 權限 Microsoft.Resources/deploymentStacks/manageDenySetting/action 的強制執行正於跨區域推出,包括政府雲端。
部署堆疊有兩個內建角色:
- Azure 部署堆疊參與者:使用者可以管理部署堆疊,但無法在部署堆棧內建立或刪除拒絕指派。
- Azure 部署堆疊擁有者:用戶可以管理部署堆疊,包括那些具有拒絕指派權限的使用者。
建立部署堆疊
您可以在資源群組、訂用帳戶或管理群組範圍建立部署堆疊資源。 您提供的部署堆疊範本會定義在目標範圍建立或更新的資源。
- 資源群組範圍的堆疊可以將範本部署到部署堆疊所在的相同資源群組。
- 訂用帳戶範圍的堆疊可以將範本部署到資源群組或部署堆疊所在的相同訂用帳戶。
- 管理群組範圍的堆疊可以將範本部署至訂用帳戶。
請務必注意,部署堆疊的所在位置,必定存在利用拒絕設定功能建立的拒絕指派。 例如,藉由在訂用帳戶範圍內,建立用於將範本部署至資源群組範圍的部署堆疊,且拒絕設定模式為 DenyDelete,便能輕鬆將受控資源佈建至指定的資源群組,並封鎖對這些資源的刪除嘗試。 這種方法可協助您透過在訂用帳戶層級而非資源群組層級區隔,增強部署堆疊的安全性。 此區隔可確保開發人員團隊使用已布建資源時,僅具對資源群組的可視性和寫入權限。 部署堆疊會維持在較高層級的隔離狀態。 此組態可將可編輯部署堆疊的用戶數目降到最低,並對其拒絕指派進行變更。 如需詳細資訊,請參閱保護受控資源免於遭到刪除。
您也可以使用 create-stack 命令來 更新部署堆疊。
若要在資源群組範圍內建立部署堆疊:
New-AzResourceGroupDeploymentStack `
-Name "<deployment-stack-name>" `
-ResourceGroupName "<resource-group-name>" `
-TemplateFile "<bicep-file-name>" `
-ActionOnUnmanage "detachAll" `
-DenySettingsMode "none"
若要在訂用帳戶範圍內建立部署堆疊:
New-AzSubscriptionDeploymentStack `
-Name "<deployment-stack-name>" `
-Location "<location>" `
-TemplateFile "<bicep-file-name>" `
-DeploymentResourceGroupName "<resource-group-name>" `
-ActionOnUnmanage "detachAll" `
-DenySettingsMode "none"
DeploymentResourceGroupName 參數可指定用於儲存受控資源的資源群組。 如果您未指定 參數,受控資源會儲存在訂用帳戶範圍中。
若要在管理群組範圍內建立部署堆疊:
New-AzManagementGroupDeploymentStack `
-Name "<deployment-stack-name>" `
-Location "<location>" `
-TemplateFile "<bicep-file-name>" `
-DeploymentSubscriptionId "<subscription-id>" `
-ActionOnUnmanage "detachAll" `
-DenySettingsMode "none"
deploymentSubscriptionId 參數可指定用於儲存受控資源的訂用帳戶。 如果您未指定 參數,受控資源會儲存在管理群組範圍中。
列出部署堆疊
若要在資源群組範圍內列出部署堆疊資源:
Get-AzResourceGroupDeploymentStack `
-ResourceGroupName "<resource-group-name>"
若要在訂用帳戶範圍內列出部署堆疊資源:
Get-AzSubscriptionDeploymentStack
若要在管理群組範圍內列出部署堆疊資源:
Get-AzManagementGroupDeploymentStack `
-ManagementGroupId "<management-group-id>"
更新部署堆疊
若要更新部署堆疊,這可能牽涉到新增或刪除受控資源,您必須對基礎 Bicep 檔案進行變更。 進行修改之後,您可以執行更新命令或重新執行 create 命令來更新部署堆疊。
基礎結構即程式代碼設計模式可讓您完全控制受控資源清單。
使用 Set 命令
若要在資源群組範圍內更新部署堆疊:
Set-AzResourceGroupDeploymentStack `
-Name "<deployment-stack-name>" `
-ResourceGroupName "<resource-group-name>" `
-TemplateFile "<bicep-file-name>" `
-ActionOnUnmanage "detachAll" `
-DenySettingsMode "none"
若要在訂用帳戶範圍內更新部署堆疊:
Set-AzSubscriptionDeploymentStack `
-Name "<deployment-stack-name>" `
-Location "<location>" `
-TemplateFile "<bicep-file-name>" `
-DeploymentResourceGroupName "<resource-group-name>" `
-ActionOnUnmanage "detachAll" `
-DenySettingsMode "none"
DeploymentResourceGroupName 參數可指定用於儲存部署堆疊資源的資源群組。 如果未指定資源群組名稱,部署堆疊服務會為您建立新的資源群組。
若要在管理群組範圍內更新部署堆疊:
Set-AzManagementGroupDeploymentStack `
-Name "<deployment-stack-name>" `
-Location "<location>" `
-TemplateFile "<bicep-file-name>" `
-DeploymentSubscriptionId "<subscription-id>" `
-ActionOnUnmanage "detachAll" `
-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 刪除非受控資源,請使用建立堆棧命令更新堆疊,並包含 ActionOnUnmanage 參數。 如需詳細資訊,請參閱建立部署堆疊。
使用 ActionOnUnmanage 參數來定義在更新或刪除堆疊之後,不再受控的資源會發生什麼情況。 允許的值如下:
-
deleteAll:針對受控資源和資源群組使用刪除,而不是分離。 -
deleteResources:僅針對受管理的資源使用刪除,而不是分離。 -
detachAll:解除已控管的資源和資源群組的連結。
例如:
New-AzSubscriptionDeploymentStack `
-Name "<deployment-stack-name" `
-TemplateFile "<bicep-file-name>" `
-DenySettingsMode "none" `
-ActionOnUnmanage "deleteAll"
警告
當將action-on-unmanage參數設定為deleteAll時,您會刪除受控資源群組及其內含的所有資源。
處理堆疊不同步錯誤
更新或刪除部署堆疊時,您可能會遇到下列堆疊不同步錯誤,指出堆疊資源清單未正確同步。
The deployment stack '{0}' might not have an accurate list of managed resources. To prevent resources from being accidentally deleted, check that the managed resource list doesn't have any additional values. If there is any uncertainty, it's recommended to redeploy the stack with the same template and parameters as the current iteration. To bypass this warning, specify the 'BypassStackOutOfSyncError' flag.
您可以從 Azure 入口網站取得資源清單,或使用相同的參數重新部署目前部署的 Bicep 檔案。 輸出會顯示受控資源。
...
Resources: /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/demoRg/providers/Microsoft.Network/virtualNetworks/vnetthmimleef5fwk
/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/demoRg/providers/Microsoft.Storage/storageAccounts/storethmimleef5fwk
在您檢閱並確認堆疊中的資源清單之後,請在 Azure PowerShell 中使用 BypassStackOutOfSyncError 開關重新執行命令(或者在 Azure CLI 中使用 bypass-stack-out-of-sync-error)。 只有在徹底檢閱堆疊中的資源清單之後,才使用此參數。 根據預設,請勿使用此參數。
刪除部署堆疊
ActionOnUnmanage 參數會將動作定義為不再受控的資源。 參數具有下列值:
-
DeleteAll:同時刪除資源和資源群組。 -
DeleteResources:只刪除資源。 -
DetachAll:中斷連結資源。
即使您指定刪除全部開關,部署堆疊所在的資源群組內的非受控資源仍會阻止資源群組和這些非受控資源本身被刪除。
若要在資源群組範圍內刪除部署堆疊資源:
Remove-AzResourceGroupDeploymentStack `
-name "<deployment-stack-name>" `
-ResourceGroupName "<resource-group-name>" `
-ActionOnUnmanage "<deleteAll/deleteResources/detachAll>"
若要在訂用帳戶範圍內刪除部署堆疊資源:
Remove-AzSubscriptionDeploymentStack `
-Name "<deployment-stack-name>" `
-ActionOnUnmanage "<deleteAll/deleteResources/detachAll>"
若要在管理群組範圍內刪除部署堆疊資源:
Remove-AzManagementGroupDeploymentStack `
-Name "<deployment-stack-name>" `
-ManagementGroupId "<management-group-id>" `
-ActionOnUnmanage "<deleteAll/deleteResources/detachAll>"
檢視部署堆疊中的受控資源
部署堆疊服務尚未有 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 檔案中移除資源定義,然後執行更新命令,或重新執行建立命令。 如需詳細資訊,請參閱更新部署堆疊。
保護受控資源
您可以將特定權限指派給部署堆疊的受控資源,以防止未經授權的安全性主體將其刪除或更新。 這些權限稱為拒絕設定。 將堆疊儲存在父層範圍。 例如,若要保護訂用帳戶中的資源,請將堆疊放在父範圍,也就是直接上層的管理群組。
拒絕設定僅適用於 控制平面作業 ,不適用於 數據平面作業。 例如,您可以透過控制平面建立記憶體帳戶和金鑰保存庫,這表示部署堆疊會管理它們。 不過,您可以透過數據平面建立子資源,例如秘密或 Blob 容器,這表示部署堆疊無法管理它們。
拒絕設定僅適用明確建立的資源,而不是隱含建立的資源。 例如,受控 AKS 叢集會建立多個其他服務來支援,例如虛擬機器。 在此情況下,由於虛擬機器未在 Bicep 檔案中定義,而且是隱式創建的資源,因此不受制於部署堆疊的拒絕設定規則。
注意
最新版本需要堆疊範圍的特定許可權,才能:
- 建立或更新部署流程,並將拒絕的設定設為非
None值。 - 使用
None以外的值的現有拒絕設定來更新或刪除部署堆疊。
使用部署堆疊內建角色來授與權限。
Azure PowerShell 包含下列參數,可用於自訂拒絕指派:
-
DenySettingsMode:定義禁止對受控資源進行的作業,防止未經授權的安全性主體嘗試刪除或更新資源。 除非您明確授與存取權,否則此限制適用於所有人。 值包括:None、DenyDelete和DenyWriteAndDelete。 -
DenySettingsApplyToChildScopes:指定時,拒絕設定模式設定也會套用至受控資源的子範圍。 例如,Bicep 檔案會定義 Microsoft.Sql/servers 資源 (父項目) 和 Microsoft.Sql/servers/databases 資源 (子項目)。 如果您使用已啟用DenySettingsApplyToChildScopes設定且DenySettingsMode設定為DenyWriteAndDelete的 Bicep 檔案建立部署堆棧,則無法將任何其他子資源新增至 Microsoft.Sql/servers 資源或 Microsoft.Sql/servers/databases 資源。 -
DenySettingsExcludedAction:排除於否定性設定之外的角色型管理作業清單。 最多允許 200 個動作。 -
DenySettingsExcludedPrincipal:排除於鎖定之外的 Microsoft Entra 主體識別碼清單。 最多允許 5 個主體。
若想在資源群組範圍設置內套用拒絕設定:
New-AzResourceGroupDeploymentStack `
-Name "<deployment-stack-name>" `
-ResourceGroupName "<resource-group-name>" `
-TemplateFile "<bicep-file-name>" `
-ActionOnUnmanage "detachAll" `
-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>" `
-ActionOnUnmanage "detachAll" `
-DenySettingsMode "denyDelete" `
-DenySettingsExcludedAction "Microsoft.Compute/virtualMachines/write Microsoft.StorageAccounts/delete" `
-DenySettingsExcludedPrincipal "<object-id>,<object-id>"
使用 DeploymentResourceGroupName 參數指定已建立部署堆疊的資源群組名稱。 如果未指定範圍,將會使用部署堆疊的範圍。
若想在管理群組範圍設置內套用拒絕設定:
New-AzManagementGroupDeploymentStack `
-Name "<deployment-stack-name>" `
-Location "<location>" `
-TemplateFile "<bicep-file-name>" `
-ActionOnUnmanage "detachAll" `
-DenySettingsMode "denyDelete" `
-DenySettingsExcludedActions "Microsoft.Compute/virtualMachines/write Microsoft.StorageAccounts/delete" `
-DenySettingsExcludedPrincipal "<object-id>,<object-id>"
使用 DeploymentSubscriptionId 參數指定已建立部署堆疊的訂用帳戶識別碼。 如果未指定範圍,將會使用部署堆疊的範圍。
中斷部署堆疊與受控資源的連結
根據預設,當部署堆疊不再包含在堆疊的管理範圍內時,部署堆疊會中斷連結,但不會刪除非受控資源。 如需詳細資訊,請參閱更新部署堆疊。
從部署堆疊匯出範本
您可以從部署堆疊將資源匯出至 JSON 輸出。 您可以將輸出輸送至檔案。
若要在資源群組範圍內輸出部署堆疊:
Save-AzResourceGroupDeploymentStack `
-Name "<deployment-stack-name>" `
-ResourceGroupName "<resource-group-name>" `
若要在訂用帳戶範圍內輸出部署堆疊:
Save-AzSubscriptionDeploymentStack `
-name "<deployment-stack-name>"
若要在管理群組範圍內輸出部署堆疊:
Save-AzManagementGroupDeploymentStack `
-Name "<deployment-stack-name>" `
-ManagementGroupId "<management-group-id>"
下一步
若要完成 Bicep 部署快速入門,請參閱 快速入門:使用 Bicep 建立及部署部署堆疊。