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 name
storagecopy
ve dependsOn
sanal makinenin öğ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ğ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:
- vm1
- vm2
- vm1'de 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.