Terraform向Event Hub命名空间网络ACL传递多VNET子网ID报错
问题分析
报错“无法访问原始类型值(字符串)的属性”,核心原因是你传递的子网ID是纯字符串类型,但Terraform Event Hub模块的变量定义,期望接收的是包含可访问属性的对象类型。比如模块内部可能在引用subnet.id这类属性,但你传的纯字符串根本没有.id属性,自然触发错误。
解决方案
1. 先确认模块变量的类型要求
先看你的Event Hub模块里,network_acls的子网变量定义。如果是类似下面这种,说明它需要的是包含id和name的对象,不是纯字符串ID:
variable "network_acls" { type = list(object({ subnet = object({ id = string name = string }) action = string ignore_missing_vnet_service_endpoint = bool })) }
2. 调整main.tf的传参逻辑
场景一:子网是当前Terraform栈内创建的
直接传递子网资源对象就行,模块会自动读取它的id和name属性:
module "eventhub" { source = "./modules/eventhub" network_acls = [ { subnet = azurerm_subnet.subnet1 action = "Allow" ignore_missing_vnet_service_endpoint = false }, { subnet = azurerm_subnet.subnet2 action = "Allow" ignore_missing_vnet_service_endpoint = false } ] }
场景二:子网是外部已存在的(只有ID)
有两种处理方式:
- 方式一:修改模块变量,让子网支持纯字符串ID
把模块里的子网类型从object改成string:
variable "network_acls" { type = list(object({ subnet = string # 替换原有的object定义 action = string ignore_missing_vnet_service_endpoint = bool })) }
同时模块内部引用子网时,直接用subnet而不是subnet.id。
- 方式二:保持模块变量不变,手动构造符合要求的对象
module "eventhub" { source = "./modules/eventhub" network_acls = [ { subnet = { id = "/subscriptions/xxx/resourceGroups/xxx/providers/Microsoft.Network/virtualNetworks/xxx/subnets/subnet1" name = "subnet1" } action = "Allow" ignore_missing_vnet_service_endpoint = false }, { subnet = { id = "/subscriptions/xxx/resourceGroups/xxx/providers/Microsoft.Network/virtualNetworks/xxx/subnets/subnet2" name = "subnet2" } action = "Allow" ignore_missing_vnet_service_endpoint = false } ] }
3. 验证配置
修改完执行terraform plan,检查是否还有属性访问类的错误,确保每个子网条目都匹配模块变量的类型要求。
内容的提问来源于stack exchange,提问作者NickP
相关产品推荐
相关产品推荐

