Terraform中如何在子资源块访问父资源值?Azure服务总线订阅报错
问题分析
你的错误根源在于azurerm_servicebus_subscription的for_each基于var.servicebus_subscription(值为["tf-sub"]),此时each.key是"tf-sub";而azurerm_servicebus_topic的for_each基于var.topics(值为["test001"]),它的键是"test001"。直接用azurerm_servicebus_topic.default[each.key]会找不到匹配的topic实例,因为两者的键完全不对应,同时你还漏写了.id属性(需要引用的是topic的ID,而非整个topic对象)。
解决方案
根据实际需求,有两种常见处理方式:
方式1:所有订阅绑定同一个topic(当前场景)
如果你的所有订阅都对应同一个topic(比如当前只有test001这一个topic),可以直接通过topic名称或者取值函数获取其ID:
修改azurerm_servicebus_subscription块:
resource "azurerm_servicebus_subscription" "default" { for_each = toset(var.servicebus_subscription) name = each.value // 直接通过topic名称索引,获取其ID topic_id = azurerm_servicebus_topic.default["test001"].id max_delivery_count = var.max_delivery_count }
或者用values函数动态取第一个topic的ID(适合topic数量不确定但默认绑定第一个的场景):
topic_id = values(azurerm_servicebus_topic.default)[0].id
方式2:订阅与topic一一对应(更灵活的场景)
如果后续需要多个topic,每个topic对应不同的订阅,建议修改变量结构,让订阅信息包含对应的topic名称,比如用对象列表:
修改variable.tf:
variable "servicebus_subscriptions" { type = list(object({ name = string topic_name = string })) default = [ { name = "tf-sub" topic_name = "test001" } ] }
修改订阅资源块:
resource "azurerm_servicebus_subscription" "default" { // 用每个订阅的唯一标识作为for_each的键,这里用name+topic_name组合避免重复 for_each = { for sub in var.servicebus_subscriptions : "${sub.topic_name}-${sub.name}" => sub } name = each.value.name // 通过订阅配置中的topic_name索引对应的topic实例,获取ID topic_id = azurerm_servicebus_topic.default[each.value.topic_name].id max_delivery_count = var.max_delivery_count }
关键注意点
- 引用topic的ID时必须加上
.id属性,不能直接引用整个topic对象 for_each的键要和被引用资源的键匹配,或者通过明确的关联字段(比如topic名称)来索引目标资源
内容的提问来源于stack exchange,提问作者hari989
相关产品推荐
相关产品推荐

