key 无法识别 terraform 中此集合值中的元素

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

我在配置服务总线主题订阅时遇到以下错误。有人可以帮我解决这个问题吗?

模块代码:

resource "azurerm_servicebus_subscription" "subscription" {
  for_each            = { for sb in var.topic_list : "${sb["subscription"]}" => sb }
  name                = each.value["subscription"]
  topic_id            = azurerm_servicebus_topic.topics["${each.value.name}"].id
  max_delivery_count  = var.max_delivery_count
}

变量.tf:

variable "topic_list" {
  type = list(object({
    name                    = string
    max_size_in_megabytes   = string
  }))
  default     = []
}

输入值:

topic_list: 
  - name: "topicair"
    max_size_in_megabytes: "5120"
    subscriptions: 
      - subscription: subscription1
      - subscription: subscription2
      - subscription: subscription3
  - name: "topicwint"
    max_size_in_megabytes: "81920"
    subscriptions: 
      - subscription: subscriptiontop1
      - subscription: subscriptiontop2
      - subscription: subscriptiontop3

错误:

Error: Invalid index
│
│   on .terraform\modules\servicebus\modules\servicebus\main.tf line 103, in resource "azurerm_servicebus_subscription" "subscription":
│  103:   for_each            = { for sb in var.topic_list : "${sb["subscription"]}" => sb }
│
│ The given key does not identify an element in this collection value.
╵
╷
│ Error: Invalid index
│
│   on .terraform\modules\servicebus\modules\servicebus\main.tf line 103, in resource "azurerm_servicebus_subscription" "subscription":
│  103:   for_each            = { for sb in var.topic_list : "${sb["subscription"]}" => sb }
│
│ The given key does not identify an element in this collection value.
terraform terraform-provider-azure
1个回答
0
投票

发生错误的原因是您的 Terraform 代码尝试访问

subscription
的每个项目中的
topic_list
键,而该键并不直接存在。相反,每个主题项都包含一个
subscriptions
列表。

因此,您需要调整

for_each
以正确迭代每个主题的嵌套
subscriptions
列表中的每个订阅。

我将通过以下方式更新您的 Terraform 代码来解决此问题:


resource "azurerm_servicebus_subscription" "subscription" {
  for_each = {
    for topic in var.topic_list : 
      for sub in topic.subscriptions : 
        "${topic.name}-${sub.subscription}" => {
          topic_name      = topic.name
          subscription    = sub.subscription
        }
  }
  name                = each.value.subscription
  topic_id            = azurerm_servicebus_topic.topics[each.value.topic_name].id
  max_delivery_count  = var.max_delivery_count
}

这些更改将为您的

topic_list
中相应主题下的每个订阅正确生成订阅资源。更新后运行
terraform plan
以确保配置看起来不错。

确保

azurerm_servicebus_topic.topics
确实设置为按预期将主题名称映射到主题 ID。

希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.