Menentukan urutan untuk menyebarkan sumber daya dalam templat ARM

Saat menyebarkan sumber daya, Anda mungkin perlu memastikan beberapa sumber daya sudah ada sebelum sumber daya lain. Misalnya, Anda memerlukan server SQL logis sebelum menyebarkan database. Anda membangun hubungan ini dengan menandai satu sumber daya sebagai bergantung pada sumber daya lainnya. Gunakan elemen dependsOn untuk menentukan dependensi eksplisit. Gunakan fungsi referensi atau cantumkan fungsi untuk menentukan dependensi implisit.

Azure Resource Manager mengevaluasi dependensi antar sumber daya, dan menyebarkannya dalam urutan dependennya. Jika sumber daya tidak bergantung satu sama lain, Resource Manager akan menyebarkannya secara paralel. Anda hanya perlu menentukan dependensi untuk sumber daya yang disebarkan dalam templat yang sama.

Tip

Kami merekomendasikan Bicep karena menawarkan kemampuan yang sama dengan templat ARM dan sintaksnya lebih mudah digunakan. Untuk mempelajari selengkapnya, lihat dependensi sumber daya.

dependsOn

Dalam templat Azure Resource Manager (templat ARM), elemen dependsOn memungkinkan Anda menentukan satu sumber daya sebagai bergantung pada satu atau beberapa sumber daya. Nilainya adalah array string JavaScript Object Notation (JSON), yang masing-masing adalah nama atau ID sumber daya. Array dapat mencakup sumber daya yang disebarkan secara kondisional. Saat sumber daya kondisional tidak disebarkan, Azure Resource Manager secara otomatis menghapusnya dari dependensi yang diperlukan.

Contoh berikut menunjukkan antarmuka jaringan yang bergantung pada jaringan virtual, grup keamanan jaringan, dan alamat IP publik. Untuk templat lengkap, lihat templat mulai cepat untuk komputer virtual Linux.

{
  "type": "Microsoft.Network/networkInterfaces",
  "apiVersion": "2022-07-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'))]"
  ],
  ...
}

Dengan languageVersion 2.0, gunakan nama simbolis sumber daya dalam dependsOn array. Contohnya:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "languageVersion": "2.0",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]"
    }
  },
  "resources": {
    "myStorage": {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2023-01-01",
      "name": "[format('storage{0}', uniqueString(resourceGroup().id))]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "Standard_LRS"
      },
      "kind": "StorageV2"
    },
    "myVm": {
      "type": "Microsoft.Compute/virtualMachines",
      "apiVersion": "2023-03-01",
      "name": "[format('vm{0}', uniqueString(resourceGroup().id))]",
      "location": "[parameters('location')]",
      "dependsOn": [
        "myStorage"
      ],
      ...
    }
  }
}

Meskipun Anda mungkin cenderung menggunakan dependsOn untuk memetakan hubungan antara sumber daya, penting untuk memahami mengapa Anda melakukannya. Misalnya, untuk mendokumentasikan bagaimana sumber daya saling terhubung, dependsOn bukan pendekatan yang tepat. Setelah penyebaran, sumber daya tidak mempertahankan dependensi penyebaran di propertinya, sehingga tidak ada perintah atau operasi yang memungkinkan Anda melihat dependensi. Mengatur dependensi yang tidak perlu memperlambat waktu penyebaran karena Resource Manager tidak dapat menyebarkan sumber daya tersebut secara paralel.

Sumber daya turunan

Dependensi penyebaran implisit tidak dibuat secara otomatis antara sumber turunan dan sumber daya induk. Jika Anda perlu menggunakan sumber daya turunan setelah sumber daya induk, atur properti dependsOn.

Contoh berikut memperlihatkan server dan database SQL logis. Perhatikan bahwa dependensi eksplisit didefinisikan antara database dan server, meskipun database adalah turunan dari server.

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

Untuk templat lengkap, lihat templat mulai cepat untuk Azure SQL Database.

fungsi referensi dan daftar

Fungsi referensi memungkinkan ekspresi untuk memperoleh nilainya dari nama JSON lain dan pasangan nilai atau sumber daya runtime. Fungsi daftar* mengembalikan nilai untuk sumber daya dari operasi daftar.

Ekspresi referensi dan daftar secara implisit menyatakan bahwa satu sumber daya bergantung pada sumber daya lain. Jika memungkinkan, gunakan referensi implisit untuk menghindari penambahan dependensi yang tidak perlu.

Untuk menerapkan dependensi implisit, lihat sumber daya menurut nama, bukan ID sumber daya. Jika Anda meneruskan ID sumber daya ke dalam fungsi referensi atau daftar, referensi implisit tidak dibuat.

Format umum fungsi reference adalah:

reference('resourceName').propertyPath

Format umum fungsi listKeys adalah:

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

Dalam contoh berikut, titik akhir CDN secara eksplisit bergantung pada profil CDN, dan secara implisit bergantung pada aplikasi web.

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

Untuk mempelajari lebih lanjut, lihat fungsi referensi.

Bergantung pada sumber daya dalam perulangan

Untuk menyebarkan sumber daya yang bergantung pada sumber daya dalam perulangan salinan, Anda memiliki dua opsi. Anda dapat mengatur dependensi pada masing-masing sumber daya dalam perulangan atau pada seluruh perulangan.

Catatan

Dalam kebanyakan skenario, Anda harus mengatur dependensi pada masing-masing sumber daya dalam perulangan salinan. Hanya bergantung pada seluruh perulangan ketika Anda membutuhkan semua sumber daya dalam perulangan untuk ada sebelum membuat sumber daya berikutnya. Mengatur dependensi pada seluruh perulangan menyebabkan grafik dependensi berkembang secara signifikan, terutama jika sumber daya yang diulang bergantung pada sumber daya lain. Dependensi yang diperluas menyulitkan penyebaran untuk diselesaikan secara efisien.

Contoh berikut menunjukkan cara menyebarkan beberapa komputer virtual. Templat membuat jumlah antarmuka jaringan yang sama. Setiap komputer virtual bergantung pada satu antarmuka jaringan, bukan seluruh perulangan.

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

Contoh berikut menunjukkan cara menggunakan tiga akun penyimpanan sebelum menggunakan komputer virtual. Perhatikan bahwa elemen copy memiliki name diatur ke storagecopy dan elemen dependsOn untuk komputer virtual juga diatur ke storagecopy.

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

Nama simbolis dapat digunakan dalam dependsOn array. Jika nama simbolis adalah untuk perulangan salinan, semua sumber daya dalam perulangan ditambahkan sebagai dependensi. Sampel sebelumnya dapat ditulis sebagai JSON berikut. Dalam sampel, myVM bergantung pada semua akun penyimpanan di perulangan myStorages .

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "languageVersion": "2.0",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]"
    }
  },
  "resources": {
    "myStorages": {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2022-09-01",
      "name": "[format('{0}storage{1}, copyIndex(), uniqueString(resourceGroup().id))]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "Standard_LRS"
      },
      "kind": "Storage",
      "copy": {
        "name": "storagecopy",
        "count": 3
      },
      "properties": {}
    },
    "myVM": {
      "type": "Microsoft.Compute/virtualMachines",
      "apiVersion": "2022-11-01",
      "name": "[format('VM{0}', uniqueString(resourceGroup().id))]",
      "dependsOn": ["myStorages"],
      ...
    }
  }
}

Dependensi melingkar

Resource Manager mengidentifikasi dependensi melingkar selama validasi templat. Jika Anda menerima kesalahan untuk dependensi melingkar, evaluasi templat Anda untuk melihat apakah dependensi apa pun dapat dihapus. Jika menghapus dependensi tidak berfungsi, Anda dapat menghindari dependensi melingkar dengan memindahkan beberapa operasi penyebaran ke sumber daya turunan. Sebarkan sumber daya turunan setelah sumber daya yang memiliki dependensi melingkar. Misalnya, Anda menyebarkan dua komputer virtual tetapi Anda harus mengatur properti pada masing-masing komputer virtual yang merujuk ke komputer virtual lain. Anda dapat menyebarkannya dalam urutan berikut:

  1. vm1
  2. vm2
  3. Ekstensi pada vm1 bergantung pada vm1 dan vm2. Ekstensi menetapkan nilai pada vm1 yang didapatnya dari vm2.
  4. Ekstensi pada vm2 bergantung pada vm1 dan vm2. Ekstensi menetapkan nilai pada vm2 yang didapatnya dari vm1.

Untuk informasi tentang menilai urutan penyebaran dan mengatasi kesalahan dependensi, lihat Memecahkan masalah kesalahan penyebaran Azure umum dengan Azure Resource Manager.

Langkah berikutnya