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 storagecopy
dikkat 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:
- vm1
- vm2
- vm1 üzerindeki uzantı, vm1 ve vm2'ye bağlıdır. Uzantı, vm1 üzerinde vm2'den aldığı değerleri ayarlar.
- 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
- Öğreticiyi gözden geçirebilmek için bkz . Öğretici: Bağımlı kaynaklarla ARM şablonları oluşturma.
- Kaynak bağımlılıklarını kapsayan bir Learn modülü için bkz . Gelişmiş ARM şablonu özelliklerini kullanarak karmaşık bulut dağıtımlarını yönetme.
- Bağımlılıkları ayarlarken öneriler için bkz . ARM şablonu en iyi yöntemleri.
- Dağıtım sırasında bağımlılık sorunlarını giderme hakkında bilgi edinmek için bkz . Azure Resource Manager ile ilgili yaygın Azure dağıtım hatalarını giderme.
- Azure Resource Manager şablonları oluşturma hakkında bilgi edinmek için bkz . ARM şablonlarının yapısını ve söz dizimini anlama.
- Şablondaki kullanılabilir işlevlerin listesi için bkz . ARM şablonu işlevleri.