Azure Bicep问题:无法以数组形式引用父资源下的子资源
资源类型
Microsoft.Cdn/profiles/originGroups/origins
API版本
2021-06-01
我正在为多个带自定义域名的Azure App Services部署Azure Front Door,已成功部署多个自定义域名并关联到各自的路由及WAF策略,但创建多个Origin Groups并添加对应Origin时遇到问题。
错误信息
'The template resource '[format('{0}/{1}/{2}', parameters('frontDoorName'), format('{0}-origins', replace(parameters('origins')[range(0, length(parameters('origins')))[parameters('origins')[copyIndex()]]], '.', '-')), replace(parameters('origins')[copyIndex()], '.', ''))]' at line '1' and column '5424' is not valid: Unable to evaluate named property or non-integer index 'web-app-name.azurewebsites.net' on an array value...
我的Bicep代码
resource frontDoorOriginGroup 'Microsoft.Cdn/profiles/originGroups@2021-06-01' = [for i in range(0, length(origins)): { name: replace(origins[i], '.', '-') parent: frontDoorProfile properties: { loadBalancingSettings: { sampleSize: 4 successfulSamplesRequired: 2 } healthProbeSettings: { probePath: healthCheckPath probeRequestType: 'GET' probeProtocol: 'Https' probeIntervalInSeconds: 120 } } }] resource frontDoorOrigin 'Microsoft.Cdn/profiles/originGroups/origins@2021-06-01' = [for origin in origins: { name: frontDoorOriginGroup[origin].name parent: frontDoorOriginGroup[origin] properties: { hostName: '${origin}' httpPort: 80 httpsPort: 443 originHostHeader: '${origin}' priority: 1 weight: 50 enabledState: 'Enabled' } }]
疑问
是否可以以数组形式引用父资源下的子资源?已查阅微软官方文档《Set name and type for child resources in Bicep》但未解决问题,可能操作有误,恳请协助。
问题核心是:你尝试用字符串(origin域名)作为索引访问frontDoorOriginGroup数组,但Bicep数组仅支持整数索引,不能直接用字符串定位元素。以下两种方式可修复:
方式一:索引对齐循环
将Origin的循环改为和Origin Group一致的索引遍历,确保每个Origin对应到同索引的Origin Group:
resource frontDoorOrigin 'Microsoft.Cdn/profiles/originGroups/origins@2021-06-01' = [for i in range(0, length(origins)): { name: replace(origins[i], '.', '') parent: frontDoorOriginGroup[i] properties: { hostName: origins[i] httpPort: 80 httpsPort: 443 originHostHeader: origins[i] priority: 1 weight: 50 enabledState: 'Enabled' } }]
方式二:字典映射Origin Group
先把Origin Group数组转为字典,用origin域名作为键,后续可通过字符串索引访问:
// 构建origin与对应Origin Group的映射字典 var originGroupMap = { for i in range(0, length(origins)): { key: origins[i] value: frontDoorOriginGroup[i] } } // 基于字典创建Origin resource frontDoorOrigin 'Microsoft.Cdn/profiles/originGroups/origins@2021-06-01' = [for origin in origins: { name: replace(origin, '.', '') parent: originGroupMap[origin] properties: { hostName: origin httpPort: 80 httpsPort: 443 originHostHeader: origin priority: 1 weight: 50 enabledState: 'Enabled' } }]
关键说明
- Bicep数组仅支持整数索引,不能直接用字符串作为索引定位元素。
- 推荐使用方式一,逻辑更直接,无需额外的字典映射步骤,代码可读性更高。
内容的提问来源于stack exchange,提问作者iMAN

