Aracılığıyla paylaş


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

Kaynakları dağıtırken, bazı kaynakların diğer kaynaklara karşı mevcut 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) içinde dependsOn öğesi, bir kaynağı bir veya daha fazla kaynağa bağımlı olarak tanımlamanızı sağlar. Değeri, her biri bir 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 sanal makinesi 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. Örneğin:

{
  "$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 kaynak ile ü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 bir mantıksal 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, bir liste işleminden bir kaynağın değerlerini döndürür.

Başvuru ve liste ifadeleri, bir kaynağın başka bir kaynağa 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ı

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

Not

Çoğu senaryoda, kopyalama döngüsü içindeki tek tek kaynaklara bağımlılığı ayarlamanız gerekir. Yalnızca bir sonraki kaynağı oluşturmadan önce döngüdeki tüm kaynakların mevcut olması gerektiğinde döngünün tamamına bağlıdır. Döngünün tamamına bağımlılığın ayarlanması, özellikle bu döngüye alınan kaynakların diğer kaynaklara bağımlı olması durumunda bağımlılık 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 name storagecopy ve dependsOn sanal makine için öğ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ğrulaması sırasında döngüsel bağımlılıkları tanımlar. Döngüsel bağımlılık hatası 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ıkları önleyebilirsiniz. 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 üzerindeki 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