You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 15:20:55