首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在for_each嵌套资源中使用terraform循环

在for_each嵌套资源中使用terraform循环
EN

Stack Overflow用户
提问于 2021-07-31 08:19:08
回答 2查看 2.4K关注 0票数 2

我正在尝试提供具有多个订阅的多个Azure服务总线主题。我能够创建主题,但无法循环订阅变量来创建订阅。

################

代码语言:javascript
运行
复制
locals {
  servicebus = {
    "topic_1" = [{
      subscription = ["subscription1", "subscription2", "subscription3"]
    }],
    "topic_2" = [{
      subscription = ["subscription4", "subscription5", "subscription6"]
    }],
 "topic_3" = [{
      subscription = ["subscription7", "subscription8", "subscription9"]
    }]
  }

service_bus = flatten([
    for topicname, topic in local.servicebus : [
      for subname in topic : {
        name                = topicname
        subscription_name  = subname.subscription
      }
    ]
  ])
}

在servicebus_subscription资源块中,无法循环订阅名称,但当我提供索引(each.value.subscription_name)时,它只创建一个订阅。

代码语言:javascript
运行
复制
############  Creating Servicebus Topic ############################### 
module "servicebus_topic" {
  source                = "./servicebus/topic"
 for_each = {
    for sname in local.service_bus : sname.name => sname
  }  
  name                = each.key
  resource_group_name   = azurerm_resource_group.rg.name
  namespace_name        = module.servicebus_namespace.name
  max_size_in_megabytes = "1024"
  depends_on            = [module.servicebus_namespace.name]
}

##########  Creating Servicebus Subscription ############################### 
resource "azurerm_servicebus_subscription" "sbs" {  
  for_each = {
    for sname in local.service_bus : sname.name => sname
  }  
  name                = each.value.subscription_name
  topic_name          = module.servicebus_topic[each.value.name].name
  namespace_name      = module.servicebus_namespace.name
  resource_group_name = azurerm_resource_group.rg.name
  max_delivery_count  = "10"
}

错误:

代码语言:javascript
运行
复制
Error: Incorrect attribute value type
│
│   on servicebus.tf line 77, in resource "azurerm_servicebus_subscription" "sbs":
│   77:   name                = each.value.subscription_name
│     ├────────────────
│     │ each.value.subscription_name is tuple with 3 elements
│
│ Inappropriate value for attribute "name": string required.
╵
╷
│ Error: Incorrect attribute value type
│
│   on servicebus.tf line 77, in resource "azurerm_servicebus_subscription" "sbs":
│   77:   name                = each.value.subscription_name
│     ├────────────────
│     │ each.value.subscription_name is tuple with 3 elements
│
│ Inappropriate value for attribute "name": string required.

使用Terraform控制台的局部变量调试输出:

代码语言:javascript
运行
复制
> local.service_bus
[
  {
    "name" = "topic_1"
    "subscription_name" = [
      "subscription1",
      "subscription2",
      "subscription3",
    ]
  },
  {
    "name" = "topic_2"
    "subscription_name" = [
      "subscription4",
      "subscription5",
      "subscription16",
    ]
  },
]
EN

回答 2

Stack Overflow用户

发布于 2021-07-31 09:16:13

你们很亲密。它应该是:

代码语言:javascript
运行
复制
service_bus = merge([
    for topicname, topic in local.servicebus : {
      for subname in topic[0].subscription :
          "${topicname}-${subname}" => {
            name               = topicname
            subscription_name  =  subname
          }
    }
  ]...)

然后

代码语言:javascript
运行
复制
resource "azurerm_servicebus_subscription" "sbs" {  
  
  for_each = local.service_bus
  
  name                = each.value.subscription_name
  topic_name          = module.servicebus_topic[each.value.name].name
  namespace_name      = module.servicebus_namespace.name
  resource_group_name = azurerm_resource_group.rg.name
  max_delivery_count  = "10"
}
票数 2
EN

Stack Overflow用户

发布于 2021-08-19 17:42:57

我根据Marcin的代码创建了一个完整的工作示例:

代码语言:javascript
运行
复制
locals {
  servicebus = {
    "topic1" = [{
      subscription = ["sub1", "sub2"]
    }],
    "topic2" = [{
      subscription = ["sub1"]
    }]
  }

service_bus = merge([
    for topicname, topic in local.servicebus : {
      for subname in topic[0].subscription :
          "${topicname}-${subname}" => {
            name               = topicname
            subscription_name  =  subname
          }
    }
   ]...)
}

resource "azurerm_servicebus_topic" "topic" {
  depends_on = [
    module.servicebus
   ]

for_each = local.service_bus

  name                = each.value.name
  resource_group_name = azurerm_resource_group.shared.name
  namespace_name      = module.servicebus.namespace_name
  enable_partitioning = false
  max_size_in_megabytes = 1024
}

resource "azurerm_servicebus_subscription" "subscription" {  
  for_each = local.service_bus
   
  name                = each.value.subscription_name
  topic_name          = each.value.name
  namespace_name      = module.servicebus.namespace_name
  resource_group_name = azurerm_resource_group.shared.name
  max_delivery_count  = "10"
}

唯一的小问题是,如果没有订阅,它就不会创建主题。我有一些话题是这样的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68600382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档