You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

创建Azure ServiceBus主题订阅时遇Terraform索引无效错误求助

Azure ServiceBus主题订阅Terraform配置错误排查

问题场景

配置Azure ServiceBus主题订阅时触发以下错误:

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.

涉及代码及输入如下:

原模块代码

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
}

原variable.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

错误原因

  1. 变量类型定义不完整:variable "topic_list"的object类型未声明subscriptions字段,但输入值中包含该字段,导致Terraform无法识别该属性。
  2. for_each遍历逻辑错误:当前代码试图直接从var.topic_list的每个元素中取subscription字段,但该字段实际存在于每个topic的subscriptions列表中,而非topic本身,因此触发"Invalid index"错误。

修复方案

1. 修正变量类型定义

更新variable.tf,补充subscriptions字段的类型声明:

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

2. 修正订阅资源的遍历逻辑

使用flatten函数将所有topic下的订阅展平为一维列表,并生成唯一的键(避免订阅名称重复时冲突):

resource "azurerm_servicebus_subscription" "subscription" {
  for_each = {
    for sub in flatten([
      for topic in var.topic_list : [
        for s in topic.subscriptions : merge(s, { topic_name = topic.name })
      ]
    ]) : "${sub.topic_name}-${sub.subscription}" => sub
  }

  name                = each.value.subscription
  topic_id            = azurerm_servicebus_topic.topics[each.value.topic_name].id
  max_delivery_count  = var.max_delivery_count
}

说明

  • flatten函数将嵌套的subscriptions列表转换为一维列表,每个元素包含订阅名称和所属topic名称。
  • 使用${sub.topic_name}-${sub.subscription}作为for_each的键,确保每个订阅实例的唯一性,即使不同topic下有同名订阅也不会冲突。

内容的提问来源于stack exchange,提问作者pks

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 20:34:58