Terraform调用GCP子网模块获取ID报错:Unsupported attribute
解决Terraform引用subnets-beta模块子网ID的报错问题
问题原因
你使用的terraform-google-modules/network/google//modules/subnets-beta(v5.0.0)模块,其输出结构中没有直接的id属性,每个模块实例的输出只有subnets属性——这是一个包含子网详细信息的列表,每个列表元素才包含id、name等子网属性。你直接尝试访问模块实例的id属性,自然会触发"Unsupported attribute"错误。
解决方案
1. 单个子网ID的引用
如果你的for_each遍历的每个元素对应一个子网配置(即每个模块实例只创建一个子网),可以通过模块实例的subnets列表的第一个元素获取ID:
# 假设要引用key为"subnet-1"的子网ID module.subnets["subnet-1"].subnets[0].id
2. 获取所有子网ID的列表
如果需要收集所有创建的子网ID形成列表,使用Terraform的flatten函数配合嵌套for表达式提取:
locals { subnet_ids = flatten([ for subnet_module in module.subnets : [ for subnet in subnet_module.subnets : subnet.id ] ]) }
之后在package_mirror模块中直接引用local.subnet_ids即可。
示例代码参考
子网模块调用示例
module "subnets" { source = "terraform-google-modules/network/google//modules/subnets-beta" version = "5.0.0" for_each = local.subnets network_name = "your-vpc-name" project_id = "your-project-id" region = each.value.region subnets = [ { name = each.value.name ip_cidr_range = each.value.cidr private_ip_google_access = true } ] }
引用子网ID列表到package_mirror模块
module "package_mirror" { source = "./path/to/package_mirror" # 传入子网ID列表 subnet_ids = local.subnet_ids # 其他模块参数... }
内容的提问来源于stack exchange,提问作者Fran Luz
相关产品推荐
相关产品推荐

