使用 terraform 在 for_each 嵌套资源中循环 [英] Looping in for_each nested resources with terraform

查看:119
本文介绍了使用 terraform 在 for_each 嵌套资源中循环的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试为多个订阅配置多个 Azure 服务总线主题.我可以创建主题,但无法遍历订阅变量来创建订阅.

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

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

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 资源块中,无法循环订阅名称,但是当我提供 index(each.value.subscription_name[0]) 时,它只创建一个订阅

############  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"
}

错误:

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 控制台的局部变量调试输出:

local variable debug output with Terraform console:

> local.service_bus
[
  {
    "name" = "topic_1"
    "subscription_name" = [
      "subscription1",
      "subscription2",
      "subscription3",
    ]
  },
  {
    "name" = "topic_2"
    "subscription_name" = [
      "subscription4",
      "subscription5",
      "subscription16",
    ]
  },
]

推荐答案

你们非常接近.应该是:

You were very close. It should be:

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_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"
}

这篇关于使用 terraform 在 for_each 嵌套资源中循环的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆