Бицепс, как ссылаться на родителя в модуле при использовании цикла

Итак, я пытаюсь написать что-то, что позволит мне создавать темы и подписки в цикле, и хотя я думаю, что достиг этого благодаря коду, основанному здесь, я столкнулся с некоторыми проблемами и не знаю, как их решить. их. Похоже, что иногда бицепс дает сбой, потому что пытается создать подписку, когда создание тем еще не завершено. Когда я повторно запускаю свой конвейер, он работает нормально. Думаю, причина в этом:

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: {}
  }
]
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
0
0
100
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

В 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'
]

Хм, есть ли способ заменить массив подписок param = ['asubscription', 'anotherone'] и как-то полагаться только на topicsAndSubscriptions? Мне это не нравится, но это правда, это работает :)

h00jraq 09.04.2024 09:53

Я также подумываю об изменении serviceBusTopic на модуль, но я не совсем уверен, возможно ли это при текущем подходе...

h00jraq 09.04.2024 10:11

Я разделил topic на модули, вы этого хотите?

wenbo 10.04.2024 08:39

Другие вопросы по теме