Azure Resource Manager 部署模型

部署資源時,您要指定部署為累加式更新或是完整更新。 這兩種模式之間的差異在於 Resource Manager 如何處理資源群組中不在範本內的現有資源。

針對這兩種模式,Resource Manager 會嘗試建立範本中指定的所有資源。 若資源已存在於資源群組中,且其設定並未變更,則不會對該資源進行任何變更。 如果您變更資源的屬性值,則會使用這些新的值來更新資源。 如果您嘗試更新現有資源的位置或類型,則部署會失敗並出現錯誤。 反之,請使用您所需的位置或類型來部署新的資源。

預設的模式為累加式。

完整模式

在完整模式中,Resource Manager 會刪除現存於資源群組中但未在範本內指定的資源。

注意

在以完整模式部署範本之前,請一律使用假設狀況作業。 假設狀況會顯示要建立、刪除或修改的資源。 使用假設狀況來避免不慎刪除資源。

如果您的範本包含因為條件評估為 false 而未部署的資源,結果會取決於您用來部署範本的 REST API 版本。 如果您使用的版本早於 2019-05-10,則不會刪除資源。 使用 2019-05-10 或更新版本時,會刪除資源。 Azure PowerShell 和 Azure CLI 的最新版本會刪除資源。

使用具有複製迴圈的完整模式時請小心。 在解析複製迴圈刪除,未在範本中指定的任何資源都會遭到刪除。

如果您部署至範本中的多個資源群組,部署作業中所指定資源群組中的資源就符合刪除的資格。 不會刪除次要資源群組中的資源。

資源類型處理完整模式刪除的方式有所不同。 當不在以完整模式部署的範本中時,將自動刪除父代資源。 當不在範本中時,不會自動刪除某些子系資源。 但是,如果刪除父資源,這些子資源就會遭到刪除。

例如,如果您的資源群組包含 DNS 區域 (Microsoft.Network/dnsZones 資源類型) 和 CNAME 記錄 (Microsoft.Network/dnsZones/CNAME 資源類型),DNS 區域是 CNAME 記錄的父資源。 如果您使用完整模式部署,且範本中不包含 DNS 區域,則 DNS 區域和 CNAME 記錄都將同時刪除。 如果您在範本中包含 DNS 區域,但未包含 CNAME 記錄,則不會刪除 CNAME。

如需資源類型如何處理刪除的清單,請參閱刪除完整模式部署的 Azure 資源

如果資源群組已鎖定,完整模式就不會刪除資源。

注意

只有根層級範本支援完整部署模式。 針對連結或巢狀的範本,您必須使用累加模式。

訂用帳戶層級部署不支援完整模式。

目前,入口網站不支援完整模式。

累加模式

在「累加模式」中,Resource Manager 會保留存在於資源群組中但未在範本內指定的未變更資源。 範本中的資源會「新增」至資源群組。

重要

在累加模式中重新部署現有資源時,會重新套用所有屬性。 這些屬性不會以累加方式新增。 常見的誤解是認為未在範本中指定的屬性會保持不變。 如果您未指定特定屬性,Resource Manager 會將部署解譯為覆寫那些值。 範本中未包含的屬性會重設為預設值。 指定資源的所有非預設值,而不只是您要更新的值。 範本中的資源定義一律包含資源的最終狀態。 其無法表示對現有資源的部分更新。

警告

在某些罕見的情況下,您可以在某個資源或其中一個子資源上指定屬性。 兩個常見範例是虛擬網路上的子網路Web 應用程式的網站設定值。 在這些情況下,您必須謹慎處理累加式更新。

針對子網路,透過 Microsoft.Network/virtualNetworks 資源上的 subnets 屬性指定值。 請勿透過子資源 Microsoft.Network/virtualNetworks/subnets 來定義值。 只要子網路定義於虛擬網路上,您就可以重新部署虛擬網路,而不會遺失子網路。

針對網站設定值,這些值會在子資源類型 Microsoft.Web/sites/config 中實作。 如果您重新部署 Web 應用程式,並為網站設定值指定空物件,就不會更新子資源。 但是,如果您提供新的網站設定值,則會更新子資源類型。

範例結果

若要說明增量和完整模式之間的差異,請考慮下列案例。

資源群組包含:

  • 資源 A
  • 資源 B
  • 資源 C

範本包含:

  • 資源 A
  • 資源 B
  • 資源 D

部署於累加模式時,資源群組具有:

  • 資源 A
  • 資源 B
  • 資源 C
  • 資源 D

若部署在完整模式中,資源 C 會遭到刪除。 資源群組具有:

  • 資源 A
  • 資源 B
  • 資源 D

設定部署模式

若要在使用 PowerShell 部署時設定部署模式,請使用 Mode 參數。

New-AzResourceGroupDeployment `
  -Mode Complete `
  -Name ExampleDeployment `
  -ResourceGroupName ExampleResourceGroup `
  -TemplateFile c:\MyTemplates\storage.json

若要在使用 Azure CLI 部署時設定部署模式,使用 mode 參數。

az deployment group create \
  --mode Complete \
  --name ExampleDeployment \
  --resource-group ExampleResourceGroup \
  --template-file storage.json

下列範例示範設定為累加部署模式的已連結範本:

"resources": [
  {
    "type": "Microsoft.Resources/deployments",
    "apiVersion": "2020-10-01",
    "name": "linkedTemplate",
    "properties": {
      "mode": "Incremental",
          <nested-template-or-external-template>
    }
  }
]

下一步