Terraform中如何用for_each引用其他资源?创建NAT网关遇报错
问题原因
报错提示aws_subnet.subnets_public is object with 3 attributes,说明你引用的aws_subnet.subnets_public是单个资源对象,而非集合(列表/映射),但你用[each.key]试图按索引/键访问它,导致类型不匹配——单个对象不存在名为"5"的属性。
你的核心逻辑是为var.subnets里的所有public类型子网创建NAT网关,但子网和EIP资源未对应以集合形式创建,无法通过each.key完成匹配。
解决方案
1. 修正公网子网的创建方式
确保aws_subnet.subnets_public是映射类型的集合,与var.subnets的过滤逻辑对齐:
resource "aws_subnet" "subnets_public" { # 基于var.subnets的public类型条目创建子网,保留原key for_each = { for k, v in var.subnets : k => v if v.type == "public" } vpc_id = aws_vpc.main.id # 替换为你的VPC资源引用 cidr_block = each.value.cidr availability_zone = each.value.az map_public_ip_on_launch = true # 公网子网需开启该配置 }
2. 为每个公网子网创建对应EIP
绑定到公网子网集合,确保每个子网对应一个EIP:
resource "aws_eip" "nat_eip" { for_each = aws_subnet.subnets_public # 直接复用子网的for_each集合 vpc = true }
3. 调整NAT网关代码
现在子网和EIP都是同key的映射集合,直接用each.key匹配即可:
resource "aws_nat_gateway" "natgw" { for_each = aws_subnet.subnets_public # 复用子网集合,无需重复过滤 allocation_id = aws_eip.nat_eip[each.key].id subnet_id = aws_subnet.subnets_public[each.key].id depends_on = [aws_internet_gateway.igw] }
关键注意点
- 关联资源(子网、EIP、NAT网关)的
for_each需保持key一致,才能通过each.key正确匹配对应关系 - 避免混用
count和for_each,否则易出现字符串key与数字索引的类型不匹配问题
内容的提问来源于stack exchange,提问作者deagleshot
相关产品推荐
相关产品推荐

