Terraform输出块无法获取子网ID,触发多类错误求助
问题排查与解决
错误根源
你遇到的错误是因为子模块内的aws_subnet.aws_subnets是单个资源对象,而非可迭代的集合。当你在子模块输出中用for subnet in aws_subnet.aws_subnets遍历它时,Terraform会错误地迭代该资源的属性值(比如字符串、布尔值等原始类型),导致无法访问tags这类对象属性。
同时,父模块用for_each调用子模块,每个子模块实例仅对应一个子网,子模块无需做筛选逻辑,筛选应在父模块汇总所有子模块实例结果时完成。
修复步骤
1. 修改子模块输出(仅返回当前子网的ID和类型)
更新子模块的output.tf,让每个子模块实例仅输出自身的子网ID和类型:
output "subnet_id" { value = aws_subnet.aws_subnets.id } output "subnet_type" { value = var.subnet_type }
2. 修改父模块输出(汇总并筛选Public子网)
更新父模块的output.tf,遍历所有子模块实例,筛选出类型为public的子网ID:
output "public_subnet_ids" { value = [ for _, subnet_instance in module.subnets : subnet_instance.subnet_id if subnet_instance.subnet_type == "public" ] }
可选简化方案(子模块仅输出ID)
如果不想在子模块输出类型,也可以直接利用父模块var.list_of_subnets的信息做筛选:
子模块输出简化:
output "subnet_id" { value = aws_subnet.aws_subnets.id }
父模块输出调整:
output "public_subnet_ids" { value = [ for idx, subnet_instance in module.subnets : subnet_instance.subnet_id if var.list_of_subnets[idx].subnet_type == "public" ] }
内容的提问来源于stack exchange,提问作者Muhammed Adil
相关产品推荐
相关产品推荐

