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

Terraform创建Azure Service Bus订阅报错,请求代码修复

Azure Service Bus订阅Terraform代码错误修复

计划为单个Azure Service Bus Topic创建3个属性唯一的订阅,采用Terraform的for_each循环实现,但执行terraform plan时出现属性访问错误。

原代码

resource "azurerm_servicebus_namespace" "default" {
  resource_group_name = data.azurerm_resource_group.default.name
  location            = data.azurerm_resource_group.default.location
  name                = module.names-servicebus-namespace.results
  sku                 = "Standard"
}

resource "azurerm_servicebus_topic" "default" {
  resource_group_name = azurerm_servicebus_namespace.default.resource_group_name
  namespace_name      = azurerm_servicebus_namespace.default.name
  name                = module.names-default.environment.servicebus_topic.name_unique
  enable_partitioning = false
}

resource "azurerm_servicebus_subscription" "new-subscr" {
  for_each            = local.svc_bus_subscr
  resource_group_name = azurerm_servicebus_topic.default.resource_group_name
  namespace_name      = azurerm_servicebus_topic.default.namespace_name
  topic_name          = azurerm_servicebus_topic.default.name
  name                = local.svc_bus_subscr.name.value
  requires_session    = local.svc_bus_subscr.requires_session.value
  max_delivery_count  = 5
}

locals {
  svc_bus_subscr = {
    sub-1 = {
      name             = format("sbs-%s-%s-%s", var.resource_group_name, (var.resource_group_environment != "main") ? var.resource_group_environment : "dev", "6e05")
      requires_session = false
    }
    sub-2 = {
      name             = format("sbs-%s-%s-%s", var.resource_group_name, (var.resource_group_environment != "main") ? var.resource_group_environment : "dev", "cea0")
      requires_session = true
    }
    sub-3 = {
      name             = format("sbs-%s-%s-%s", var.resource_group_name, (var.resource_group_environment != "main") ? var.resource_group_environment : "dev", "8ea5")
      requires_session = true
    }
  }
}

报错信息

Error: Unsupported attribute
│ 
│   on resources.sb.tf line 83, in resource "azurerm_servicebus_subscription" "new-subscr":
│   83:   name                = local.svc_bus_subscr.name.value
│     ├────────────────
│     │ local.svc_bus_subscr is object with 3 attributes
│ 
│ This object does not have an attribute named "name".
╵
╷
│ Error: Unsupported attribute
│ 
│   on resources.sb.tf line 84, in resource "azurerm_servicebus_subscription" "new-subscr":
│   84:   requires_session    = local.svc_bus_subscr.requires_session.value
│     ├────────────────
│     │ local.svc_bus_subscr is object with 3 attributes
│ 
│ This object does not have an attribute named "requires_session".

错误原因

  1. 使用for_each = local.svc_bus_subscr后,资源块内需要通过each.value访问当前迭代的单个订阅配置对象,而非直接访问local.svc_bus_subscr(它是包含所有订阅的集合对象,本身没有name或requires_session属性)。
  2. 原代码中多余的.value后缀:name和requires_session本身就是字符串/布尔值,不是嵌套对象,不需要.value访问。

修复后的代码

resource "azurerm_servicebus_namespace" "default" {
  resource_group_name = data.azurerm_resource_group.default.name
  location            = data.azurerm_resource_group.default.location
  name                = module.names-servicebus-namespace.results
  sku                 = "Standard"
}

resource "azurerm_servicebus_topic" "default" {
  resource_group_name = azurerm_servicebus_namespace.default.resource_group_name
  namespace_name      = azurerm_servicebus_namespace.default.name
  name                = module.names-default.environment.servicebus_topic.name_unique
  enable_partitioning = false
}

resource "azurerm_servicebus_subscription" "new-subscr" {
  for_each            = local.svc_bus_subscr
  resource_group_name = azurerm_servicebus_topic.default.resource_group_name
  namespace_name      = azurerm_servicebus_topic.default.namespace_name
  topic_name          = azurerm_servicebus_topic.default.name
  # 使用each.value访问当前订阅的配置属性
  name                = each.value.name
  requires_session    = each.value.requires_session
  max_delivery_count  = 5
}

locals {
  svc_bus_subscr = {
    sub-1 = {
      name             = format("sbs-%s-%s-%s", var.resource_group_name, (var.resource_group_environment != "main") ? var.resource_group_environment : "dev", "6e05")
      requires_session = false
    }
    sub-2 = {
      name             = format("sbs-%s-%s-%s", var.resource_group_name, (var.resource_group_environment != "main") ? var.resource_group_environment : "dev", "cea0")
      requires_session = true
    }
    sub-3 = {
      name             = format("sbs-%s-%s-%s", var.resource_group_name, (var.resource_group_environment != "main") ? var.resource_group_environment : "dev", "8ea5")
      requires_session = true
    }
  }
}

说明

修复后,Terraform会遍历local.svc_bus_subscr中的每个键值对,为每个订阅配置创建独立的azurerm_servicebus_subscription资源,每个订阅的名称和会话要求会对应到本地变量中定义的属性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 23:45:40