定義在 ARM 範本中部署資源的順序

部署資源時,您可能需要先確定某些資源在其他資源之前存在。 例如,部署資料庫之前,您需要SQL邏輯伺服器。 您可以將一個資源標示為依存于另一個資源,以建立此關係。 使用 dependsOn 元素來定義明確的相依性。 使用參照或清單函數來定義隱含相依性。

Azure Resource Manager 會評估資源之間的相依性,並依其從屬順序進行部署。 當資源彼此不相依時,Resource Manager 會同時部署資源。 您只需要定義部署在同一個範本中的資源的相依性。

dependsOn

在 Azure Resource Manager 範本 (ARM 範本) 中,元素可讓您將一個資源定義為依賴一或多個 dependsOn 資源。 其值為 JavaScript 物件標記法 (JSON) 字串陣列,每個字串都是資源名稱或識別碼。 陣列可以包含條件式部署 的資源。 當條件式資源未部署時,Azure Resource Manager 會自動將其從所需的相依性移除。

下列範例顯示的網路介面取決於虛擬網路、網路安全性群組和公用 IP 位址。 有關完整範本,請參閱 Linux VM 的快速啟動範本

{
    "type": "Microsoft.Network/networkInterfaces",
    "apiVersion": "2020-06-01",
    "name": "[variables('networkInterfaceName')]",
    "location": "[parameters('location')]",
    "dependsOn": [
      "[resourceId('Microsoft.Network/networkSecurityGroups/', parameters('networkSecurityGroupName'))]",
      "[resourceId('Microsoft.Network/virtualNetworks/', parameters('virtualNetworkName'))]",
      "[resourceId('Microsoft.Network/publicIpAddresses/', variables('publicIpAddressName'))]"
    ],
    ...
}

雖然您可能會傾向使用地圖來繪製資源之間的關係,但瞭解您這樣做的原因 dependsOn 很重要。 例如,若要記錄資源如何相互關聯, dependsOn 並不是正確的方法。 部署之後,您無法查詢元素 dependsOn 中定義的資源。 設定不必要的相依性會減少部署時間,因為 Resource Manager 無法同時部署這些資源。

子資源

子資源與父資源之間不會自動建立隱含的部署相依性。 如果您需要在父資源之後部署子資源,請設定 dependsOn 屬性。

下列範例顯示伺服器SQL邏輯。 請注意,資料庫與伺服器之間已定義明確的相依性,即使資料庫是伺服器的子級。

"resources": [
  {
    "type": "Microsoft.Sql/servers",
    "apiVersion": "2020-02-02-preview",
    "name": "[parameters('serverName')]",
    "location": "[parameters('location')]",
    "properties": {
      "administratorLogin": "[parameters('administratorLogin')]",
      "administratorLoginPassword": "[parameters('administratorLoginPassword')]"
    },
    "resources": [
      {
        "type": "databases",
        "apiVersion": "2020-08-01-preview",
        "name": "[parameters('sqlDBName')]",
        "location": "[parameters('location')]",
        "sku": {
          "name": "Standard",
          "tier": "Standard"
          },
        "dependsOn": [
          "[resourceId('Microsoft.Sql/servers', concat(parameters('serverName')))]"
        ]
      }
    ]
  }
]

有關完整範本,請參閱適用于 Azure SQL Database的快速Azure SQL Database。

參照和清單函數

參照 函數 可讓運算式從其他 JSON 名稱與值組或執行時間資源衍生其值。 list* 函數 會從清單作業中返回資源的值。

參照和清單運算式隱含地宣告一個資源取決於另一個資源。 盡可能使用隱含參照,以避免新增不必要的相依性。

若要強制執行隱含相依性,請參閱資源名稱,而非資源識別碼。 如果您將資源識別碼傳遞至參照或清單函數,系統不會建立隱含參照。

函數的一般 reference 格式為:

reference('resourceName').propertyPath

函數的一般 listKeys 格式為:

listKeys('resourceName', 'yyyy-mm-dd')

在下列範例中,CDN端點明確取決於CDN設定檔,並隱含地取決於 Web App。

{
    "name": "[variables('endpointName')]",
    "apiVersion": "2016-04-02",
    "type": "endpoints",
    "location": "[resourceGroup().location]",
    "dependsOn": [
      "[variables('profileName')]"
    ],
    "properties": {
      "originHostHeader": "[reference(variables('webAppName')).hostNames[0]]",
      ...
    }

若要深入瞭解,請參閱 參照函數

依賴迴圈中的資源

若要部署在複製迴圈中取決於資源 的資源,有兩個選項。 您可以在迴圈或整個迴圈中設定個別資源的相依性。

注意

在大多數的情況下,您應該在複製迴圈中設定個別資源的相依性。 只有在您需要迴圈中所有資源存在之後,才能建立下一個資源,才需要整個迴圈。 設定整個迴圈的相依性會導致相依性圖形大幅展開,尤其是當那些迴圈的資源取決於其他資源時。 展開的相依性使得部署難以有效率地完成。

下列範例顯示如何部署多個虛擬機器。 範本會建立相同數量的網路介面。 每個虛擬機器都取決於一個網路介面,而不是整個迴圈。

{
  "type": "Microsoft.Network/networkInterfaces",
  "apiVersion": "2020-05-01",
  "name": "[concat(variables('nicPrefix'),'-',copyIndex())]",
  "location": "[parameters('location')]",
  "copy": {
    "name": "nicCopy",
    "count": "[parameters('vmCount')]"
  },
  ...
},
{
  "type": "Microsoft.Compute/virtualMachines",
  "apiVersion": "2020-06-01",
  "name": "[concat(variables('vmPrefix'),copyIndex())]",
  "location": "[parameters('location')]",
  "dependsOn": [
    "[resourceId('Microsoft.Network/networkInterfaces',concat(variables('nicPrefix'),'-',copyIndex()))]"
  ],
  "copy": {
    "name": "vmCopy",
    "count": "[parameters('vmCount')]"
  },
  "properties": {
    "networkProfile": {
      "networkInterfaces": [
        {
          "id": "[resourceId('Microsoft.Network/networkInterfaces',concat(variables('nicPrefix'),'-',copyIndex()))]",
          "properties": {
            "primary": "true"
          }
        }
      ]
    },
    ...
  }
}

下列範例顯示如何在部署虛擬機器之前部署三個儲存空間帳戶。 請注意, copy 元素已 name 設定為 且虛擬機器的元素 storagecopydependsOn 也設定為 storagecopy

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {},
  "resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2019-04-01",
      "name": "[concat(copyIndex(),'storage', uniqueString(resourceGroup().id))]",
      "location": "[resourceGroup().location]",
      "sku": {
        "name": "Standard_LRS"
      },
      "kind": "Storage",
      "copy": {
        "name": "storagecopy",
        "count": 3
      },
      "properties": {}
    },
    {
      "type": "Microsoft.Compute/virtualMachines",
      "apiVersion": "2015-06-15",
      "name": "[concat('VM', uniqueString(resourceGroup().id))]",
      "dependsOn": ["storagecopy"],
      ...
    }
  ],
  "outputs": {}
}

迴圈相依性

Resource Manager 在範本驗證期間識別迴圈相依性。 如果您收到迴圈相依性的錯誤,請評估範本,看看是否可移除任何相依性。 如果移除相依性無法運作,您可以將某些部署作業移動到子資源,以避免迴圈相依性。 在具有迴圈相依性的資源之後部署子資源。 例如,假設您要部署兩個虛擬機器,但您必須在每一個參照另一個虛擬機器上設定屬性。 您可以按照下列順序進行部署:

  1. vm1
  2. vm2
  3. vm1 上的擴充功能取決於 vm1 和 vm2。 擴充功能會設定從 vm2 獲得之 vm1 上的值。
  4. vm2 上的擴充功能取決於 vm1 和 vm2。 擴充功能會設定從 vm1 獲得之 vm2 的值。

有關評估部署順序及解決相依性錯誤的詳細資訊,請參閱使用 Azure Resource Manager 疑難排解常見的 Azure 部署錯誤

下一個步驟