ARM şablonlarında kaynak dağıtım sırasını belirleme

Kaynakları dağıtırken, bazı kaynakların diğer kaynaklarda olduğundan emin olmanız gerekebilir. Örneğin, veritabanını dağıtmadan önce mantıksal bir SQL sunucusuna ihtiyacınız vardır. Bir kaynağı diğer kaynağa bağımlı olarak işaretleyerek bu ilişkiyi kurarsınız. dependsOn Açık bir bağımlılık tanımlamak için öğesini kullanın. Örtük bir bağımlılık tanımlamak için başvuru veya liste işlevlerini kullanın.

Azure Resource Manager kaynaklar arasındaki bağımlılıkları değerlendirir ve bağımlı sıralarında dağıtır. Resource Manager, birbirine bağımlı olmayan kaynakları paralel olarak dağıtır. Yalnızca aynı şablonda dağıtılan kaynaklar için bağımlılıkları tanımlamanız gerekir.

İpucu

ARM şablonlarıyla aynı özellikleri sunduğundan ve söz diziminin kullanımı daha kolay olduğundan Bicep'i öneririz. Daha fazla bilgi edinmek için bkz. kaynak bağımlılıkları.

dependsOn

Azure Resource Manager şablonunuz (ARM şablonu) dependsOn içinde öğesi, bir veya daha fazla kaynağa bağımlı olarak bir kaynak tanımlamanızı sağlar. Değeri, her biri kaynak adı veya kimliği olan bir JavaScript Nesne Gösterimi (JSON) dize dizisidir. Dizi , koşullu olarak dağıtılan kaynakları içerebilir. Koşullu kaynak dağıtılmadığında Azure Resource Manager bunu gerekli bağımlılıklardan otomatik olarak kaldırır.

Aşağıdaki örnekte sanal ağa, ağ güvenlik grubuna ve genel IP adresine bağlı olan bir ağ arabirimi gösterilmektedir. Şablonun tamamı için bkz. Linux VM için hızlı başlangıç şablonu.

{
  "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'))]"
  ],
  ...
}

languageVersion 2.0 ile dizilerde dependsOn kaynak sembolik adını kullanın. Örnek:

{
  "$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"
      ],
      ...
    }
  }
}

Kaynaklarınız arasındaki ilişkileri eşlemek için kullanmaya dependsOn eğilimli olabilirsiniz ancak bunu neden yaptığınızı anlamanız önemlidir. Örneğin, kaynakların nasıl birbirine bağlı dependsOn olduğunu belge etmek doğru yaklaşım değildir. Dağıtımdan sonra, kaynak özelliklerinde dağıtım bağımlılıklarını korumaz, bu nedenle bağımlılıkları görmenize olanak sağlayan komut veya işlem yoktur. Resource Manager bu kaynakları paralel olarak dağıtamadığından, gereksiz bağımlılıkların ayarlanması dağıtım süresini yavaşlatıyor.

Alt kaynaklar

Alt kaynakla üst kaynak arasında örtük dağıtım bağımlılığı otomatik olarak oluşturulmaz. Üst kaynak sonrasında alt kaynağı dağıtmanız gerekiyorsa özelliğini ayarlayın dependsOn .

Aşağıdaki örnekte mantıksal bir SQL sunucusu ve veritabanı gösterilmektedir. Veritabanı sunucunun alt öğesi olsa bile veritabanı ile sunucu arasında açık bir bağımlılık tanımlandığına dikkat edin.

"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'))]"
        ]
      }
    ]
  }
]

Şablonun tamamı için bkz. Azure SQL Veritabanı için hızlı başlangıç şablonu.

başvuru ve liste işlevleri

Başvuru işlevi, bir ifadenin değerini diğer JSON adı ve değer çiftlerinden veya çalışma zamanı kaynaklarından türetmeye olanak tanır. list* işlevleri, liste işleminden bir kaynağın değerlerini döndürür.

Başvuru ve liste ifadeleri, bir kaynağın diğerine bağımlı olduğunu örtük olarak bildirir. Mümkün olduğunda, gereksiz bir bağımlılık eklemekten kaçınmak için örtük bir başvuru kullanın.

Örtük bir bağımlılığı zorlamak için kaynağa kaynak kimliğine değil ada göre başvurun. Kaynak kimliğini başvuru veya liste işlevlerine geçirirseniz örtük başvuru oluşturulmaz.

İşlevin reference genel biçimi:

reference('resourceName').propertyPath

İşlevin listKeys genel biçimi:

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

Aşağıdaki örnekte, CDN uç noktası açıkça CDN profiline ve örtük olarak bir web uygulamasına bağlıdır.

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

Daha fazla bilgi edinmek için bkz. başvuru işlevi.

Döngüdeki kaynaklara bağımlıdır

Kopyalama döngüsündeki kaynaklara bağımlı kaynakları dağıtmak için iki seçeneğiniz vardır. Döngüdeki veya döngünün tamamında tek tek kaynaklara bağımlılık ayarlayabilirsiniz.

Not

Çoğu senaryoda, kopyalama döngüsü içindeki tek tek kaynaklara bağımlılığı ayarlamanız gerekir. Bir sonraki kaynağı oluşturmadan önce döngüdeki tüm kaynakların mevcut olması gerektiğinde yalnızca döngünün tamamına bağlıdır. Döngünün tamamına bağımlılığın ayarlanması, özellikle de döngüye alınan kaynakların diğer kaynaklara bağımlı olması durumunda bağımlılıklar grafiğinin önemli ölçüde genişlemesine neden olur. Genişletilmiş bağımlılıklar, dağıtımın verimli bir şekilde tamamlanmasını zor hale getirir.

Aşağıdaki örnekte birden çok sanal makinenin nasıl dağıtılacağı gösterilmektedir. Şablon aynı sayıda ağ arabirimi oluşturur. Her sanal makine, döngünün tamamı yerine tek bir ağ arabirimine bağımlıdır.

{
  "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"
          }
        }
      ]
    },
    ...
  }
}

Aşağıdaki örnekte, sanal makineyi dağıtmadan önce üç depolama hesabının nasıl dağıtılacağı gösterilmektedir. öğesinin copy olarak ayarlandığına namestoragecopy ve dependsOn sanal makinenin öğesinin de olarak ayarlandığına storagecopydikkat edin.

{
  "$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"],
      ...
    }
  ]
}

Sembolik adlar dizilerde dependsOn kullanılabilir. Sembolik ad bir kopyalama döngüsü içinse, döngüdeki tüm kaynaklar bağımlılık olarak eklenir. Yukarıdaki örnek aşağıdaki JSON olarak yazılabilir. Örnekte myVM , myStorages döngüsündeki tüm depolama hesaplarına bağlıdır.

{
  "$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"],
      ...
    }
  }
}

Döngüsel bağımlılıklar

Resource Manager, şablon doğrulama sırasında döngüsel bağımlılıkları tanımlar. Döngüsel bağımlılıkla ilgili bir hata alırsanız, herhangi bir bağımlılığın kaldırılıp kaldırılamayacağına bakmak için şablonunuzu değerlendirin. Bağımlılıkları kaldırma işe yaramazsa, bazı dağıtım işlemlerini alt kaynaklara taşıyarak döngüsel bağımlılıklardan kaçınabilirsiniz. Döngüsel bağımlılığı olan kaynaklarda alt kaynakları dağıtın. Örneğin, iki sanal makine dağıttığınızı ancak her birinde diğerine başvuran özellikleri ayarlamanız gerektiğini varsayalım. Bunları aşağıdaki sırayla dağıtabilirsiniz:

  1. vm1
  2. vm2
  3. vm1'de uzantı, vm1 ve vm2'ye bağlıdır. Uzantı, vm1 üzerinde vm2'den aldığı değerleri ayarlar.
  4. vm2'de uzantı, vm1 ve vm2'ye bağlıdır. Uzantı, vm1'den aldığı vm2 değerlerini ayarlar.

Dağıtım sırasını değerlendirme ve bağımlılık hatalarını çözme hakkında bilgi için bkz. Azure Resource Manager ile ilgili yaygın Azure dağıtım hatalarını giderme.

Sonraki adımlar