Terraform关联创建的子网到指定路由表问题求助
问题:Terraform将单个路由表关联到动态子网失败
我在执行terraform apply时,尝试把单个指定路由表关联到动态创建的子网,但一直报错。aws_subnet资源已经能正常创建子网,新增aws_route_table_association资源后,希望所有子网都使用指定路由表而非默认路由表,多次调整配置都没解决问题,求帮忙。
现有配置代码
main.tf
resource "aws_subnet" "main" { for_each = var.az_subnets vpc_id = var.vpc_id availability_zone = "${data.aws_region.current.name}${each.key}" cidr_block = each.value map_public_ip_on_launch = var.map_public_ip_on_launch tags = merge( var.tags, { Name = "${var.name}-${var.classification}-${data.aws_region.current.name}${each.key}" }, ) } resource "aws_route_table_association" "main" { for_each = aws_subnet.main["*"].id subnet_id = aws_subnet.main[each.value] route_table_id = var.route_table_id }
variables.tf
variable "az_subnets" { description = "可用区名称到子网CIDR块的映射" type = any } variable "route_table_id" { description = "路由表ID" type = string }
outputs.tf
output "aws_subnets" { value = { main = { ids = values(aws_subnet.main)[*]["id"] arns = values(aws_subnet.main)[*]["arn"] availability_zones = values(aws_subnet.main)[*]["availability_zone"] cidr_blocks = values(aws_subnet.main)[*]["cidr_block"] } } }
错误原因及修复方案
你的aws_route_table_association配置存在两个核心问题:
for_each使用了错误的引用方式:aws_subnet.main["*"].id是无效写法,aws_subnet.main是通过for_each创建的资源对象映射,不能用通配符*批量引用。subnet_id赋值错误:直接引用aws_subnet.main[each.value]会返回整个子网资源对象,而subnet_id需要的是子网ID字符串。
修正后的aws_route_table_association配置
resource "aws_route_table_association" "main" { # 遍历所有动态创建的子网资源对象 for_each = aws_subnet.main # 从子网对象中提取ID字符串 subnet_id = each.value.id route_table_id = var.route_table_id }
补充说明
for_each = aws_subnet.main会让Terraform为每个子网创建对应的路由表关联资源,键值与aws_subnet.main保持一致,方便后续追踪和管理。each.value代表当前遍历到的子网资源对象,通过.id可直接获取符合要求的子网ID字符串。
内容的提问来源于stack exchange,提问作者BigRed247
相关产品推荐
相关产品推荐

