创建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
错误原因
- 变量类型定义不完整:
variable "topic_list"的object类型未声明subscriptions字段,但输入值中包含该字段,导致Terraform无法识别该属性。 - 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
相关产品推荐
相关产品推荐

