部署堆疊 (預覽)

Azure 部署堆疊是一種 Azure 資源類型,可將一組 Azure 資源作做為不可部分完成的單位進行管理。 Bicep 檔案或 ARM JSON 範本提交至部署堆疊後,部署堆疊會定義由堆疊管理的資源。 如果移除了先前包含在範本中的資源,則會根據部署堆疊指定的 actionOnUnmanage 行為將其中斷連結或刪除。 類似於其他 Azure 資源,可以使用 Azure 角色型存取控制 (Azure RBAC) 限制部署堆疊。

若要建立與更新部署堆疊,可以搭配 Bicep 檔案使用 Azure CLI、Azure PowerShell 或 Azure 入口網站。 Bicep 檔案會轉換為 ARM JSON 範本,然後由堆疊部署為部署物件。 除了熟悉的部署資源,部署堆疊也做為超集提供其他功能。

部署堆疊的資源類型為 Microsoft.Resources/deploymentStacks, 包含一個主要範本,可針對其描述的資源跨範圍執行一對多更新,並阻止對資源進行非必要的變更。

規劃部署並判斷應將哪些資源群組納入同一堆疊時,請務必考慮資源的管理生命週期,包括建立、更新和刪除。 例如,假設您需要在不同資源群組範圍內,為多個應用程式小組佈建測試 VM。 在此案例中,可以使用部署堆疊建立測試環境,並透過部署堆疊的後續更新來更新測試虛擬機器設定。 專案完成後,可能必須移除或刪除所建立的任何資源,例如測試 VM。 透過使用部署堆疊,可指定適合的刪除旗標,輕鬆移除受控資源。 這種方法僅須針對堆疊資源進行一次更新,不必在不同資源群組範圍中逐個修改或移除測試虛擬機器,因此過程更加簡便,並能縮短環境清除的時間。

部署堆疊需要 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 是無效的。 DeleteResourceGroups 必須與 DeleteResources 一起使用。

例如:

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 主體識別碼清單。 最多允許 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 參數指定已建立部署堆疊的訂用帳戶識別碼。 如果未指定範圍,將會使用部署堆疊的範圍。

中斷部署堆疊與受控資源的連結

根據預設,當部署堆疊不再包含在堆疊的管理範圍內時,部署堆疊會中斷連結,但不會刪除非受控資源。 如需詳細資訊,請參閱更新部署堆疊

從部署堆疊匯出範本

您可以從部署堆疊將資源匯出至 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>'

下一步

若要進行快速入門,請參閱快速入門:建立部署堆疊