如何使用 bicep 在多个服务总线中创建多个 topics/queues?

How do I create multiple topics/queues in multiple servicebuses with bicep?

我不太了解在使用二头肌(更具体地说是数组)时父组件和子组件之间的关系。 我得到的错误是这样的:部署模板验证失败:“第 54 行和第 9 列的资源 'Microsoft.Resources/deployments/p6vklkczz4qlm' 在模板中定义了多次。

错误很明显我只是不明白我猜的解决方案。

main.bicep

param servicebuses array = [
  'servicebus_dev'
  'servicebus_acc'
  'servicebus_prod'
]

resource servicebusNamespace 'Microsoft.ServiceBus/namespaces@2021-11-01' = [for servicebus in servicebuses: {
  location: location
  name: servicebus
  sku:{
    name: 'Standard' 
    }  
}]

module topicModule 'topicsModule.bicep' = [for servicebus in servicebuses:{
  name: uniqueString('topic')
  params:{
    parentResource: servicebus
  }
}]

topicsModule.bicep

param topics array = [
  'topic1'
  'topic2'
  'topic3'
]

param parentResource string

resource topicResource 'Microsoft.ServiceBus/namespaces/topics@2021-11-01' = [for topic in topics : {
  name: topic
  }]

在模块中创建主题有点麻烦。您必须使用现有关键字获取命名空间,然后您可以向主题添加父关系以在给定命名空间内创建它。

resource servicebusNamespace 'Microsoft.ServiceBus/namespaces@2021-11-01' existing = {
  name: parentResource
}

resource topicResource 'Microsoft.ServiceBus/namespaces/topics@2021-11-01' = [for topic in topics : {
  parent: servicebusNamespace
  name: topic
      }]

然后您必须使您的 topicModules 名称依赖于所选的服务总线,并为服务总线命名空间添加一个 dependsOn,以便 bicep 知道首先部署命名空间。

module topicModule 'topicsModule.bicep' = [for servicebus in servicebuses:{
  name: uniqueString(servicebus)
  dependsOn:[
    servicebusNamespace
  ]
  params:{
    parentResource: servicebus
  }
}] 

我猜你用虚拟值替换了真实的服务总线命名空间名称,但为了以防万一,请确保使用更可能是全局唯一的名称并且不要使用 _ 字符,它在服务总线命名空间的名称。

除了已接受的答案。

主题是服务命名空间的子资源,因此资源名称如下所示:
servicebus-namespace-name/topic-name

topicsModule.bicep 文件:

param servicebusName string

param topics array = [
  'topic1'
  'topic2'
  'topic3'
]

resource topicResource 'Microsoft.ServiceBus/namespaces/topics@2021-11-01' = [for topic in topics: {
  name: '${servicebusName}/${topic}'
}]

在主文件中,您可以像这样调用模块:

module topicModule 'topicsModule.bicep' = [for (servicebus, i) in servicebuses: {
  name: uniqueString(servicebus)
  params: {
    servicebusName: servicebusNamespace[i].name
  }
}]

这里不需要指定dependsOn因为它是bicep在编译时自动生成的