Terraform配置transit gateway路由表关联报Invalid index空元组错误
问题原因
报错的根本原因是你引用的aws_ec2_transit_gateway_route_table.this资源没有被创建,所以它是一个长度为0的空元组,直接用[0]取第一个元素就会触发索引无效错误。
而该资源没创建的原因是你给它配置了count = var.create_tgw ? 1 : 0的创建条件,当var.create_tgw取值为false时,count为0,资源不会创建。
排查步骤
- 首先检查当前部署环境下
var.create_tgw变量的取值,确认是否显式设置为了false - 如果
var.create_tgw取值为true,继续检查aws_ec2_transit_gateway.this资源是否配置了其他创建条件,导致TGW本身没有正常创建,进而连带路由表资源创建失败
解决方案
方案1:统一关联资源的创建条件
给aws_ec2_transit_gateway_route_table_association资源也加上和路由表一致的创建判断,路由表不存在时就不创建关联,修改后的关联资源代码如下:
resource "aws_ec2_transit_gateway_route_table_association" "this" { for_each = var.create_tgw ? local.vpc_attachments_without_default_route_table_association : {} transit_gateway_attachment_id = aws_ec2_transit_gateway_vpc_attachment.this[each.key].id transit_gateway_route_table_id = aws_ec2_transit_gateway_route_table.this[0].id }
当var.create_tgw为false时,for_each取值为空map,关联资源不会被创建,自然不会尝试访问不存在的路由表索引。
方案2:支持复用已有路由表
如果你需要在不创建新TGW的场景下使用该模块,增加变量传入已有TGW路由表ID即可:
- 先新增变量定义
variable "existing_tgw_route_table_id" { type = string description = "已有TGW路由表ID,create_tgw为false时需传入" default = "" }
- 修改关联资源的路由表ID引用逻辑
resource "aws_ec2_transit_gateway_route_table_association" "this" { for_each = local.vpc_attachments_without_default_route_table_association transit_gateway_attachment_id = aws_ec2_transit_gateway_vpc_attachment.this[each.key].id transit_gateway_route_table_id = var.create_tgw ? aws_ec2_transit_gateway_route_table.this[0].id : var.existing_tgw_route_table_id }
方案3:直接开启TGW创建
如果你的部署场景确实需要创建新的TGW和对应的路由表,直接将var.create_tgw变量取值设置为true即可解决报错。
内容的提问来源于stack exchange,提问作者Maya Ray
相关产品推荐
相关产品推荐

