Итак, я пытаюсь написать что-то, что позволит мне создавать темы и подписки в цикле, и хотя я думаю, что достиг этого благодаря коду, основанному здесь, я столкнулся с некоторыми проблемами и не знаю, как их решить. их. Похоже, что иногда бицепс дает сбой, потому что пытается создать подписку, когда создание тем еще не завершено. Когда я повторно запускаю свой конвейер, он работает нормально. Думаю, причина в этом:
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
, но, может быть, я ошибаюсь?
Основные бицеппарамы:
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
]
}
]
Неявная зависимость рекомендуется в ваших обстоятельствах
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, i) in topicsAndSubscriptions: {
name: '${topic.name}-subs'
params: {
servicebusNamespaceName: serviceBusNamespaceName
topicName: serviceBusTopic[i].name
subscriptions: topic.subscriptions
}
}
]
subscription.bicep
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: {}
}
]
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'
]
}
]
themeName: здесь serviceBusTopic[i].name разрешит развертывание темы раньше соответствующая подписка. Я проверил, работает хорошо.
обновление модулей
main.bicep
@description('Name of the Service Bus namespace')
param serviceBusNamespaceName string
@description('Location for all resources.')
param location string = resourceGroup().location
param topicNames array
param subscriptionNames array
resource serviceBusNamespace 'Microsoft.ServiceBus/namespaces@2022-01-01-preview' = {
name: serviceBusNamespaceName
location: location
sku: {
name: 'Premium'
}
properties: {}
}
module topics 'modules/topic.bicep' = {
name: 'topicDeployment'
params: {
serviceBusNamespaceName: serviceBusNamespaceName
topicNames: topicNames
}
dependsOn:[
serviceBusNamespace
]
}
module subscriptions 'modules/subscription.bicep' = {
name: 'subsDeployment'
params: {
servicebusNamespaceName: serviceBusNamespaceName
subscriptionNames: subscriptionNames
topicNames: topicNames
}
dependsOn:[
serviceBusNamespace
topics
]
}
topic.bicep
param serviceBusNamespaceName string
param topicNames array
resource topicModule 'Microsoft.ServiceBus/namespaces/topics@2022-10-01-preview' = [for (item, i) in topicNames: {
name: '${serviceBusNamespaceName}/${item}'
}]
subscription.bicep
param servicebusNamespaceName string
param topicNames array
param subscriptionNames array
resource sub 'Microsoft.ServiceBus/namespaces/topics/subscriptions@2022-10-01-preview' = [ for (item, i) in subscriptionNames: {
name: '${servicebusNamespaceName}/${topicNames[i]}/${item}'
properties: {}
}
]
main.bicepparam
using './main.bicep'
param serviceBusNamespaceName = 'wbevent'
param topicNames = [
'dev-sb-top-failure'
'xrm-dev-sb-report-completion'
'dev-sb-top-completion'
'dev-sb-top-discharge'
]
param subscriptionNames = [
'dev-sb-sub-failure'
'dev-sb-sub-report-completion'
'dev-sb-sub-completion'
'dev-sb-sub-discharge'
]
Я также подумываю об изменении serviceBusTopic на модуль, но я не совсем уверен, возможно ли это при текущем подходе...
Я разделил topic
на модули, вы этого хотите?
Хм, есть ли способ заменить массив подписок param = ['asubscription', 'anotherone'] и как-то полагаться только на
topicsAndSubscriptions
? Мне это не нравится, но это правда, это работает :)