如何使用 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在编译时自动生成的
我不太了解在使用二头肌(更具体地说是数组)时父组件和子组件之间的关系。 我得到的错误是这样的:部署模板验证失败:“第 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在编译时自动生成的