Azure ARM模板中创建负载均衡器的位置指定异常问题
解决ARM模板中关联跨资源组VNet的负载均衡器位置问题
错误原因
ARM模板验证阶段会提前评估资源的location属性,而reference属于运行时函数,直接在资源的location字段中使用会触发模板验证错误。如果你的模板是嵌套部署结构(错误信息中的path": "properties.template.resources[0]"也说明这一点),这个限制会更严格。
解决方案
方案一:嵌套模板场景 - 父模板传递位置参数
在父模板中先获取目标VNet的位置,再将该值作为参数传递给嵌套模板,嵌套模板直接使用该参数设置负载均衡器的位置:
- 父模板中定义变量获取VNet位置(需指定VNet所在资源组):
"variables": { "vNetLocation": "[reference(resourceId(parameters('vNetResourceGroupName'), 'Microsoft.Network/VirtualNetworks', parameters('vNetName')), '2022-01-01').location]" }
- 父模板的嵌套部署资源中传递位置参数:
"resources": [ { "type": "Microsoft.Resources/deployments", "apiVersion": "2021-04-01", "name": "deployLoadBalancer", "location": "[variables('vNetLocation')]", "properties": { "mode": "Incremental", "template": { "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": { "location": { "type": "string" }, "loadBalancerName": { "type": "string" }, "vNetName": { "type": "string" }, "vNetResourceGroupName": { "type": "string" } }, "resources": [ { "type": "Microsoft.Network/loadBalancers", "apiVersion": "2020-06-01", "name": "[parameters('loadBalancerName')]", "location": "[parameters('location')]", "sku": { "name": "Standard" }, "properties": { // 填入你的负载均衡器配置内容 } } ] }, "parameters": { "location": "[variables('vNetLocation')]", "loadBalancerName": "[parameters('loadBalancerName')]", "vNetName": "[parameters('vNetName')]", "vNetResourceGroupName": "[parameters('vNetResourceGroupName')]" } } } ]
方案二:独立模板场景 - 正确指定VNet资源组
如果是独立部署的模板,确保在resourceId中明确指定VNet所在的资源组(若跨订阅还需指定订阅ID),即可正确通过reference获取位置:
"resources": [ { "type": "Microsoft.Network/loadBalancers", "apiVersion": "2020-06-01", "name": "[parameters('loadBalancerName')]", // 跨资源组VNet需指定资源组名称,跨订阅需额外传入订阅ID "location": "[reference(resourceId(parameters('vNetResourceGroupName'), 'Microsoft.Network/VirtualNetworks', parameters('vNetName')), '2022-01-01').location]", "sku": { "name": "Standard" }, "properties": { // 填入你的负载均衡器配置内容 } } ]
注:若VNet与当前部署不在同一订阅,
resourceId需补充订阅ID参数:resourceId(parameters('vNetSubscriptionId'), parameters('vNetResourceGroupName'), 'Microsoft.Network/VirtualNetworks', parameters('vNetName'))
内容的提问来源于stack exchange,提问作者Jean-Pascal J.
相关产品推荐
相关产品推荐

