使用Terraform创建AWS NAT Gateway时subnet_id赋值报错问题求助
问题原因
你通过for_each批量创建的aws_subnet.public-subnet是一个以var.prefix的key为索引的资源集合,不能直接引用单个ID值,这是你subnet_id字段赋值报错的核心原因。
解决方案
根据你的使用场景选以下任意一种即可:
- 场景1:只需要创建1个NAT网关,指定其中一个公网子网即可
直接用key索引获取对应子网的ID,把aws_nat_gateway的subnet_id字段改成:
如果你想选另一个可用区的子网,把索引换成subnet_id = aws_subnet.public-subnet["sub-1"].id"sub-2"即可。 - 场景2:需要多可用区部署高可用NAT网关,每个公网子网对应一个NAT网关
你需要给aws_nat_gateway也加上for_each,和公网子网一一对应,同时注意EIP也要批量创建多个(单个EIP无法绑定多个NAT网关),完整修改后的代码如下:# 先修改EIP资源,加for_each批量创建 resource "aws_eip" "sample_eip" { for_each = var.prefix vpc = true tags = { Name = "${var.name}-eip-${each.value.az}" } } resource "aws_nat_gateway" "sample_nat_gateway" { for_each = var.prefix allocation_id = aws_eip.sample_eip[each.key].id subnet_id = aws_subnet.public-subnet[each.key].id tags = { Name = "${var.name}-sample-nat-gateway-${each.value.az}" Environment = var.environment } depends_on = [aws_internet_gateway.sample_igw] }
额外注意事项
你当前variables.tf里的sub-1 CIDR配置为10.0.1.0/16,和sub-2的10.0.2.0/24网段重叠,部署时会触发CIDR冲突报错,建议把sub-1的CIDR修改为10.0.1.0/24。
内容的提问来源于stack exchange,提问作者Abdulrehman
相关产品推荐
相关产品推荐

