如何在Bicep中通过循环配对公司与队列数组创建Service Bus队列
Bicep中实现公司与队列数组配对生成Service Bus队列的问题解决
问题场景
现有两个Bicep数组:
- 队列名称数组:
var queues = [ 'first-queue' 'second-queue' 'third-queue' ]
- 公司名称数组:
var companies = [ 'apple' 'intel' 'blizzard' ]
需要生成每个公司前缀+队列名称的组合数组,最终创建对应Service Bus队列,期望结果数组:
var res = [ 'apple-first-queue' 'apple-second-queue' 'apple-third-queue' 'intel-first-queue' 'intel-second-queue' 'intel-third-queue' 'blizzard-first-queue' 'blizzard-second-queue' 'blizzard-third-queue' ]
当前错误原因
报错“Directly referencing a resource or module collection is not currently supported. Apply an array indexer to the expression”的核心问题:
- 模块循环生成的
queuesToCreate是模块集合对象,并非普通数组,不能直接在[for queueName in queuesToCreate]中遍历 - 子模块
service-bus-loop.bicep生成的队列名称重复,未与原队列数组结合,无法得到预期的公司+队列组合
解决方向
方法1:无需模块,直接生成全组合数组
通过嵌套循环生成所有公司与队列的组合,再扁平化数组后遍历创建队列,代码更简洁:
// 定义基础数组 var queues = [ 'first-queue' 'second-queue' 'third-queue' ] var companies = [ 'apple' 'intel' 'blizzard' ] // 生成二维的公司+队列组合数组 var combinedQueueNames = [for company in companies: [for queue in queues: '${company}-${queue}']] // 扁平化二维数组为一维数组 var flattenedQueueNames = concat(...combinedQueueNames) // Service Bus命名空间 resource serviceBusNamespace 'Microsoft.ServiceBus/namespaces@2022-01-01-preview' = { name: serviceBusNamespaceName location: location sku: { name: skuName } } // 遍历创建所有队列 resource queues 'Microsoft.ServiceBus/namespaces/queues@2022-01-01-preview' = [for queueName in flattenedQueueNames: { parent: serviceBusNamespace name: queueName properties: { maxDeliveryCount: 1 lockDuration: 'PT5M' } }]
方法2:修正模块用法(如需保留模块)
如果必须通过模块生成每个公司的队列列表,需通过模块输出收集所有队列名称,再扁平化后创建资源:
- 修正子模块
service-bus-loop.bicep,接收外部队列数组并生成对应公司的队列名称:
param company string param queues array // 接收外部传入的队列数组 // 生成当前公司的队列名称数组 var companyQueues = [for queue in queues: '${company}-${queue}'] output res array = companyQueues
- 主文件中调用模块,收集所有模块输出的队列数组并扁平化:
var queues = [ 'first-queue' 'second-queue' 'third-queue' ] var companies = [ 'apple' 'intel' 'blizzard' ] // 循环调用模块,传入公司和队列数组 module companyQueues 'service-bus-loop.bicep' = [for company in companies: { name: 'multipleQueues-${company}' params: { company: company queues: queues } }] // 收集所有模块输出的队列数组并扁平化 var allQueueNames = concat(...[for qModule in companyQueues: qModule.outputs.res]) // Service Bus命名空间 resource serviceBusNamespace 'Microsoft.ServiceBus/namespaces@2022-01-01-preview' = { name: serviceBusNamespaceName location: location sku: { name: skuName } } // 遍历创建队列 resource queues 'Microsoft.ServiceBus/namespaces/queues@2022-01-01-preview' = [for queueName in allQueueNames: { parent: serviceBusNamespace name: queueName properties: { maxDeliveryCount: 1 lockDuration: 'PT5M' } }]
内容的提问来源于stack exchange,提问作者snowman-biceps
相关产品推荐
相关产品推荐

