我想同时为多个区域、环境、应用程序等创建一个资源。 我想做这样的事情:
param apps array = [
'app1'
'app2'
'app3'
]
param environments array = [
'alpha'
'beta'
]
param regions array = [
'ne'
'we'
'uks'
]
resource origin_group 'Microsoft.Cdn/profiles/origingroups@2021-06-01' = [ for region in regions: {
[ for env in environments: {
[ for app in apps: {
parent: profiles_global_fd_name_resource
name: '${env}-${region}-${app}-origin-group'
properties: {
loadBalancingSettings: {
sampleSize: 4
successfulSamplesRequired: 3
additionalLatencyInMilliseconds: 50
}
healthProbeSettings: {
probePath: '/'
probeRequestType: 'HEAD'
probeProtocol: 'Http'
probeIntervalInSeconds: 100
}
sessionAffinityState: 'Disabled'
}
}]
}]
}]
所有提到嵌套循环的文档都讨论了在资源内部循环以创建许多子资源。不是我想要的。也许另一种方法是以某种方式将所有这些数组合并为每个可能迭代的单个对象数组。也不知道从哪里开始。
非常感谢任何帮助。
目前不支持,但会支持(请参阅是否有计划支持资源上的嵌套循环?)。
编辑 2023 年 4 月
Bicep 现在支持 lambda 函数。
reduce
和 map
函数可用于生成所有可能的组合:
param environments array = [ 'alpha', 'beta' ]
param regions array = [ 'ne', 'we', 'uks' ]
param apps array = [ 'app1', 'app2', 'app3' ]
// Create an array of env-region
var envRegions = reduce(environments, [], (cur, next) => concat(cur, map(regions, region => '${next}-${region}')))
// Add the app to the previously created array env-region-app
output envRegionApps array = reduce(envRegions, [], (cur, next) => concat(cur, map(apps, app => '${next}-${app}')))
原始答案
使用一点数学,你可以实现你想要的(不确定你是否应该):
param environments array = [ 'alpha', 'beta' ]
param regions array = [ 'ne', 'we', 'uks' ]
param apps array = [ 'app1', 'app2', 'app3' ]
// Setting some variables for clarity
var envCount = length(environments)
var regionCount = length(regions)
var appCount = length(apps)
// Setting the total number of combination
var originGroupCount = envCount * regionCount * appCount
// Iterate all possible combinations
output originGroupNames array = [for i in range(0, originGroupCount): {
name: '${environments[i / (regionCount * appCount) % envCount]}-${regions[i / appCount % regionCount]}-${apps[i % appCount]}-origin-group'
}]
这将输出原始组名称的所有可能组合(我认为)。