使用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".
错误原因分析
local.svc_bus_subscr_filter引用错误:该变量是Map类型对象,不存在value属性,无法通过.value访问内部元素。- 订阅与过滤器关联逻辑缺失:原代码未建立订阅和对应过滤器的关联关系,无法正确匹配每个订阅的过滤规则。
subscription_name取值错误:lookup(local.svc_bus_subscr[each.value.name], "name", null)属于冗余且错误的写法,each.value本身就是订阅对象,直接取each.value.name即可。- 未过滤无需配置过滤器的订阅:原代码会为所有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" } } }
修正说明
- 关联订阅与过滤器:在
svc_bus_subscr的每个订阅对象中添加filter_key字段,直接关联到svc_bus_subscr_filter中的对应键名,避免匹配错误。 - 过滤无需规则的订阅:新增
filtered_subscriptions本地变量,通过判断过滤器的id是否为空,仅保留需要配置过滤器的订阅。 - 正确引用过滤器属性:通过
each.value.filter_key从svc_bus_subscr_filter中获取对应规则的属性,解决原代码中.value属性不存在的错误。 - 简化
subscription_name取值:直接使用each.value.name获取订阅名称,去掉冗余的lookup逻辑。
内容的提问来源于stack exchange,提问作者Pallab
相关产品推荐
相关产品推荐

