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

使用Terraform创建Azure Service Bus订阅过滤器时报错求助

Azure Service Bus订阅与过滤器Terraform配置错误修复

我需要创建3个Azure Service Bus订阅,其中2个需配置过滤器,我的Terraform代码如下:

主题与订阅代码

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
  default_message_ttl = "P35D"
  topic_name          = azurerm_servicebus_topic.default.name
  max_delivery_count  = 5
  name                = each.value["name"]
  requires_session    = each.value["requires_session"]
}


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", "b214")
      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", "ef14")
      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", "ck89")
      requires_session = true
    }
  }
}

过滤器配置代码

locals {
  svc_bus_subscr_filter = {
    filter-b214 = {
      name  = ""
      id    = ""
      label = ""
    }
    filter-ef14 = {
      name  = "MinestarQbEvents"
      id    = "minestarqb"
      label = "red"
    }
    filter-ck89 = {
      name  = "WencoHvcEvents"
      id    = "wencohvc"
      label = "red"
    }
  }
}


resource "azurerm_servicebus_subscription_rule" "filter" {
  for_each            = { for n in local.svc_bus_subscr : n.name => n }
  subscription_name   = lookup(local.svc_bus_subscr[each.value.name], "name", null)
  name                = local.svc_bus_subscr_filter.value.filter_name
  resource_group_name = azurerm_servicebus_namespace.default.resource_group_name
  topic_name          = azurerm_servicebus_topic.default.name
  namespace_name      = azurerm_servicebus_namespace.default.name
  filter_type         = "CorrelationFilter"

  correlation_filter {
    correlation_id = local.svc_bus_subscr_filter.value.id
    label          = local.svc_bus_subscr_filter.value.label
    properties = {
      customProperty = "value"
    }
  }
}

错误信息

Error: Unsupported attribute
│ 
│   on resources.sb.tf line 149, in resource "azurerm_servicebus_subscription_rule" "filter":
│  149:   name                = local.svc_bus_subscr_filter.value.filter_name
│     ├────────────────
│     │ local.svc_bus_subscr_filter is object with 3 attributes
│ 
│ This object does not have an attribute named "value".
╵
╷
│ Error: Unsupported attribute
│ 
│   on resources.sb.tf line 156, in resource "azurerm_servicebus_subscription_rule" "filter":
│  156:     correlation_id = local.svc_bus_subscr_filter.value.id
│     ├────────────────
│     │ local.svc_bus_subscr_filter is object with 3 attributes
│ 
│ This object does not have an attribute named "value".
╵
╷
│ Error: Unsupported attribute
│ 
│   on resources.sb.tf line 157, in resource "azurerm_servicebus_subscription_rule" "filter":
│  157:     label          = local.svc_bus_subscr_filter.value.label
│     ├────────────────
│     │ local.svc_bus_subscr_filter is object with 3 attributes
│ 
│ This object does not have an attribute named "value".

错误原因分析

  1. local.svc_bus_subscr_filter引用错误:该变量是Map类型对象,不存在value属性,无法通过.value访问内部元素。
  2. 订阅与过滤器关联逻辑缺失:原代码未建立订阅和对应过滤器的关联关系,无法正确匹配每个订阅的过滤规则。
  3. subscription_name取值错误:lookup(local.svc_bus_subscr[each.value.name], "name", null)属于冗余且错误的写法,each.value本身就是订阅对象,直接取each.value.name即可。
  4. 未过滤无需配置过滤器的订阅:原代码会为所有3个订阅创建规则,不符合仅给2个订阅配置过滤器的需求。

修正后的完整代码

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
  default_message_ttl = "P35D"
  topic_name          = azurerm_servicebus_topic.default.name
  max_delivery_count  = 5
  name                = each.value.name
  requires_session    = each.value.requires_session
}

locals {
  # 订阅配置:新增filter_key字段,关联对应的过滤器键名
  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", "b214")
      requires_session = false
      filter_key       = "filter-b214" # 无实际过滤规则,后续会跳过
    }
    sub-2 = {
      name             = format("sbs-%s-%s-%s", var.resource_group_name, (var.resource_group_environment != "main") ? var.resource_group_environment : "dev", "ef14")
      requires_session = true
      filter_key       = "filter-ef14"
    }
    sub-3 = {
      name             = format("sbs-%s-%s-%s", var.resource_group_name, (var.resource_group_environment != "main") ? var.resource_group_environment : "dev", "ck89")
      requires_session = true
      filter_key       = "filter-ck89"
    }
  }

  svc_bus_subscr_filter = {
    filter-b214 = {
      name  = ""
      id    = ""
      label = ""
    }
    filter-ef14 = {
      name  = "MinestarQbEvents"
      id    = "minestarqb"
      label = "red"
    }
    filter-ck89 = {
      name  = "WencoHvcEvents"
      id    = "wencohvc"
      label = "red"
    }
  }

  # 过滤出需要配置过滤器的订阅(排除filter_key对应的规则为空的订阅)
  filtered_subscriptions = {
    for k, v in local.svc_bus_subscr : k => v
    if local.svc_bus_subscr_filter[v.filter_key].id != ""
  }
}

resource "azurerm_servicebus_subscription_rule" "filter" {
  # 仅为需要过滤的订阅创建规则
  for_each            = local.filtered_subscriptions
  subscription_name   = each.value.name
  name                = local.svc_bus_subscr_filter[each.value.filter_key].name
  resource_group_name = azurerm_servicebus_namespace.default.resource_group_name
  topic_name          = azurerm_servicebus_topic.default.name
  namespace_name      = azurerm_servicebus_namespace.default.name
  filter_type         = "CorrelationFilter"

  correlation_filter {
    correlation_id = local.svc_bus_subscr_filter[each.value.filter_key].id
    label          = local.svc_bus_subscr_filter[each.value.filter_key].label
    properties = {
      customProperty = "value"
    }
  }
}

修正说明

  1. 关联订阅与过滤器:在svc_bus_subscr的每个订阅对象中添加filter_key字段,直接关联到svc_bus_subscr_filter中的对应键名,避免匹配错误。
  2. 过滤无需规则的订阅:新增filtered_subscriptions本地变量,通过判断过滤器的id是否为空,仅保留需要配置过滤器的订阅。
  3. 正确引用过滤器属性:通过each.value.filter_key从svc_bus_subscr_filter中获取对应规则的属性,解决原代码中.value属性不存在的错误。
  4. 简化subscription_name取值:直接使用each.value.name获取订阅名称,去掉冗余的lookup逻辑。

内容的提问来源于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 00:20:39