Azure ARM模板中dependsOn用资源名失效,如何无需resourceId解决?
ARM模板中dependsOn使用资源名称的正确方式
问题原因
当通过copy循环批量创建资源时,直接使用拼接的资源名称字符串(如SBNamespace/topic/subscription)作为dependsOn值,ARM模板无法正确匹配到动态生成的资源实例——因为循环创建的资源会被赋予copyName[copyIndex]格式的逻辑标识,单纯的名称字符串无法关联到对应的资源定义。
解决方法
无需使用resourceId函数,只需通过引用copy循环的实例标识即可让dependsOn生效,具体修改如下:
将规则资源的dependsOn字段替换为:
"dependsOn": [ "[concat('subscriptions[', copyIndex(), ']')]" ]
这里的subscriptions是第一个资源(订阅)的copy名称,copyIndex()会匹配当前规则实例对应的订阅实例索引,确保每个规则都依赖对应的订阅资源。
修改后的完整代码示例
{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": { "resourceName": { "type": "string" }, "subscriptions": { "type": "array" } }, "variables": { "apiVersion": "2018-01-01-preview", "copy": [ { "name": "subscriptionNames", "count": "[length(parameters('subscriptions'))]", "input": "[concat(parameters('resourceName'), '/', parameters('subscriptions')[copyIndex('subscriptionNames')].topicName, '/', parameters('subscriptions')[copyIndex('subscriptionNames')].subscriptionName)]" } ] }, "resources": [ { "type": "Microsoft.ServiceBus/namespaces/topics/subscriptions", "apiVersion": "[variables('apiVersion')]", "copy": { "name": "subscriptions", "count": "[length(parameters('subscriptions'))]" }, "name": "[variables('subscriptionNames')[copyIndex()]]", "properties": { "requiresSession": true, "lockDuration": "PT5M" } }, { "type": "Microsoft.ServiceBus/namespaces/topics/subscriptions/rules", "apiVersion": "[variables('apiVersion')]", "copy": { "name": "subscriptions", "count": "[length(parameters('subscriptions'))]" }, "name": "[concat(variables('subscriptionNames')[copyIndex()], '/$Default')]", "dependsOn": [ "[concat('subscriptions[', copyIndex(), ']')]" ], "properties": { "filterType": "SqlFilter", "sqlFilter": { "sqlExpression": "1=1", "requiresPreprocessing": false } } } ] }
补充说明
如果不想使用copy实例标识,也可以直接引用订阅资源的name表达式,确保dependsOn的值与订阅资源的name完全一致:
"dependsOn": [ "[variables('subscriptionNames')[copyIndex()]]" ]
但这种方式仅在模板中没有同名不同类型的资源时生效,而使用copy实例标识的方式更可靠,尤其在复杂模板中。
内容的提问来源于stack exchange,提问作者Rachel
相关产品推荐
相关产品推荐

