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".
错误原因
- 使用
for_each = local.svc_bus_subscr后,资源块内需要通过each.value访问当前迭代的单个订阅配置对象,而非直接访问local.svc_bus_subscr(它是包含所有订阅的集合对象,本身没有name或requires_session属性)。 - 原代码中多余的
.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
相关产品推荐
相关产品推荐

