指定相依性來控制部署順序

已完成

假設您想要將一組資源部署到 Azure,但只有在已經部署另一個資源時。 此時,您需要在範本中傳達其中一個資源相依於另一個資源。

以下是數個要考慮的層面:

  • 某個項目必須先存在,才能部署其他項目。

    例如,您的 Azure Key Vault 中必須有金鑰保存庫,您才能擷取需要在虛擬機器 (VM) 中載入的祕密。 部署金鑰保存庫時,您可以同時在相同範本中部署其祕密。 不過,金鑰保存庫必須在其祕密之前部署。 因此,我們可以說祕密相依於金鑰保存庫。 金鑰保存庫與祕密會因為相依性而循序逐一部署 (從金鑰保存庫開始)。

  • 我可以依賴項目在 Azure Resource Manager 上的運作方式嗎?

    檢查另一個資源是否存在時,您的第一個考量可能是使用 Azure PowerShell 或 Azure CLI 來檢查資源是否存在。 更自動化的解決方案會使用 Resource Manager 內建的冪等性。 如果 Resource Manager 發現範本中定義的資源已存在於雲端中,就不會重新部署該資源。 若要讓此概念成為有效的方法,您必須了解 Resource Manager 進行檢查的方式。

    注意

    當現有的資源識別與範本中定義的內容相符時,Azure Resource Manager 就會比較屬性。 如果屬性完全相符,就會留下資源。 如果不符,引擎就會進行變更,可能會重新部署資源。

  • 您可以將資源巢狀化於另一個資源內。

    在 Azure Resource Manager 範本中,您可以將資源巢狀化於另一個資源內。 透過將資源巢狀化,您可以定義巢狀資源與父資源之間的關聯性。

如何定義 Azure 資源之間的相依性?

假設您想要確保某個資源 (例如儲存體帳戶) 已在需要該資源的資源之前部署。 該如何檢查相依的儲存體帳戶是否存在?

若要開始,您可以透過執行 Azure PowerShell 或 Azure CLI 命令來檢查儲存體帳戶是否存在,以檢查部署的目前狀態。 您可能也會查看是否有 Resource Manager 建構可讓您執行相同檢查。

Resource Manager 範本中提供一個稱為 dependsOn 的這類建構。 使用此建構可讓資源等待,直到指出的資源完成部署為止。

什麼是 dependsOn 建構?

這是一個機碼/值組,可讓您定義資源之間的部署順序。 有時,您需要確保某個項目在其他項目之前就已存在。 例如,您可能需要先有資料庫存在,才能安裝應用程式,或需要先有祕密資源存在,才能有金鑰保存庫。

dependsOn 建構放在相依於要先部署之其他資源的資源上。 一個資源可以依賴多個資源,這就是為什麼建構預期會將相依資源清單作為其值的原因。

下列範例說明如何在 ARM 範本中,以 JSON 表達這類相依性:

"resources": [
  {
    "name": "<name of resource that needs to exist first>"
  },
  {
    "name": "someResource",
    "dependsOn": [
      "<name of resource that needs to exist first>"
    ]
  }
]

在此範例中,您是使用資源的名稱來指定相依的資源。 不過,許多資源可能具有相同名稱。 若要確保這個比較能夠滿足您的需求,可以改為使用 resourceId() 建構來取得唯一資源識別碼:

"dependsOn": [
  "resourceId('Microsoft.Network/loadBalancers', variables('nameOfLoadBalancer')))"
]

上述 JSON 程式碼透過合併命名空間、類型與變數名稱來建構唯一識別碼。 如此一來,您就能確保會指定正確的相依資源。

什麼是子資源?

子資源是只存在於另一個資源內容中的資源。 虛擬機器延伸模組即為一例,其無法在沒有虛擬機器的情況下存在。

在範本中,適用於父子式關聯性的典型程式碼看起來像這樣:

"resources": [
  {
    "name": "parent-resource",
    "resources": [{
      "name": "child-resource"
    }]
  }
]

此父子式相依性不會自動建立父代要在其子系之前部署的相依性。 您必須明確表達相依性。

因此,當您表達這類關聯性時,務必新增 dependsOn 建構,如下所示:

"resources": [
  {
    "name": "parent-resource",
    "resources": [{
      "dependsOn": ["parent-resource"],
      "name": "child resource"
    }]
  }
]