Bicep 在使用循环时如何在模块中引用父级

问题描述 投票:0回答:1

因此,我正在尝试编写一些内容,允许我循环创建主题和订阅,虽然我认为由于此处创建的代码我已经实现了这一点,但我面临着一些问题,我不知道如何解决它们。 看起来有时二头肌会失败,因为它在主题创建尚未完成时尝试创建订阅。当我重新运行管道时,它工作得很好。我想这就是原因:

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: {}
  }
]
azure azure-devops devops azureservicebus azure-bicep
1个回答
0
投票

在 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
    ]
  }
]
© www.soinside.com 2019 - 2024. All rights reserved.