因此,我正在尝试编写一些内容,允许我循环创建主题和订阅,虽然我认为由于此处创建的代码我已经实现了这一点,但我面临着一些问题,我不知道如何解决它们。 看起来有时二头肌会失败,因为它在主题创建尚未完成时尝试创建订阅。当我重新运行管道时,它工作得很好。我想这就是原因:
https://learn.microsoft.com/en-us/azure/azure-resource-manager/bicep/linter-rule-use-parent-property
我得到的错误是:
The incoming request is not recognized as a namespace policy put request. ttps://aka.ms/sbResourceMgrExceptions. TrackingId:e1d2c50d-fe92-43d8-abfe-8eb2c1917a70_G5, SystemTracker:ihdev-nonprod-servicebus.servicebus.windows.net:dev-sb-topic-test/subscriptions/dev-sb-sub-test, Timestamp:2024-04-08T13:33:29 (Code: MessagingGatewayNotFoundStatusCode
我不知道如何避免这个错误。 有没有办法仅在创建相应主题时才创建特定订阅?我想我不能简单地添加
dependsOn[i]
,因为我必须从 for topic in topicsAndSubscriptions
更改为类似 for (topic, i) in topicsAndSubscriptions
但也许我错了?
Main.bicepparam:
using './main.bicep'
param serviceBusNamespaceName = '#{SBUS_NAMESPACE_NAME}#'
param topicsAndSubscriptions = [
{
name: 'dev-sb-top-failure'
subscriptions: [
'dev-sb-sub-failure'
]
}
{
name: 'xrm-dev-sb-report-completion'
subscriptions: [
'dev-sb-sub-report-completion'
]
}
{
name: 'dev-sb-top-completion'
subscriptions: [
'dev-sb-sub-completion'
]
}
{
name: 'dev-sb-top-discharge'
subscriptions: [
'dev-sb-sub-discharge'
]
}
]
这是代码
main.bicep
@description('Name of the Service Bus namespace')
param serviceBusNamespaceName string
@description('Location for all resources.')
param location string = resourceGroup().location
param topicsAndSubscriptions array
resource serviceBusNamespace 'Microsoft.ServiceBus/namespaces@2022-01-01-preview' = {
name: serviceBusNamespaceName
location: location
sku: {
name: 'Premium'
}
properties: {}
}
resource serviceBusTopic 'Microsoft.ServiceBus/namespaces/topics@2022-10-01-preview' = [
for topic in topicsAndSubscriptions: {
parent: serviceBusNamespace
name: topic.name
properties: {}
}
]
module subs 'modules/subscription.bicep' = [
for topic in topicsAndSubscriptions: {
name: '${topic.name}-subs'
params: {
servicebusNamespaceName: serviceBusNamespaceName
topicName: topic.name
subscriptions: topic.subscriptions
}
}
]
模块文件:
param servicebusNamespaceName string
param topicName string
param subscriptions array = ['asubscription', 'anotherone']
resource sub 'Microsoft.ServiceBus/namespaces/topics/subscriptions@2022-10-01-preview' = [
for i in subscriptions: {
name: '${servicebusNamespaceName}/${topicName}/${i}'
properties: {}
}
]
在 Bicep 中,
dependsOn
属性用于显式声明一个资源只能在成功配置另一个资源后才创建。
要解决您的问题,您应该调整您的 Bicep 模板,以确保仅在成功创建各自的主题后才创建订阅,如下所示:
resource serviceBusTopics 'Microsoft.ServiceBus/namespaces/topics@2022-10-01-preview' = [
for (topic, i) in topicsAndSubscriptions: {
name: topic.name
parent: serviceBusNamespace
properties: {}
}
]
module subs 'modules/subscription.bicep' = [
for (topic, i) in topicsAndSubscriptions: {
name: '${topic.name}-subs'
params: {
servicebusNamespaceName: serviceBusNamespaceName
topicName: topic.name
subscriptions: topic.subscriptions
}
dependsOn: [
serviceBusTopics[i] // This ensures each subscription module waits for its corresponding topic to be created
]
}
]