Terraform 0.12创建transit gateway VPC attachment报条件结果类型不一致错误
Terraform Transit Gateway VPC Attachment报错修复方案
错误根因
报错的核心原因是Terraform三元运算符要求两个分支返回值类型必须完全一致,你原有配置中的错误点如下:
subnet_ids字段的三元判断:符合条件时返回list(string)类型的子网ID列表,不符合条件时返回数字0,两种类型不匹配transit_gateway_id、vpc_id字段同理:符合条件时返回字符串类型的ID,不符合条件时返回数字0,类型不匹配- 冗余逻辑:你已经通过
count参数控制了资源的创建逻辑,当lower(var.transit_gateway) != "enabled"时,count=0资源不会被实例化,其余属性的条件判断完全多余,反而容易引入类型错误。
最优修复方案
直接删除多余的属性级条件判断,仅保留count的创建控制逻辑即可,修改后的main.tf代码如下:
resource "aws_ec2_transit_gateway_vpc_attachment" "tgw_vpc_attachment" { count = lower(var.transit_gateway) == "enabled" ? 1 : 0 subnet_ids = var.tgw_subnet_ids transit_gateway_id = var.tgw_id vpc_id = var.vpc_id }
方案说明
当count=0时,该资源不会被创建,因此属性值不管怎么配置都不会实际生效,直接赋值对应变量即可避免类型冲突问题,代码也更简洁易读。
可选兼容方案(若需保留属性级条件判断)
如果必须保留属性的条件判断逻辑,需要将三元运算符的两个分支返回值类型对齐:
- 列表类型的
subnet_ids不符合条件时返回空列表[] - 字符串类型的ID字段不符合条件时返回空字符串
""
修改后代码如下:
resource "aws_ec2_transit_gateway_vpc_attachment" "tgw_vpc_attachment" { count = lower(var.transit_gateway) == "enabled" ? 1 : 0 subnet_ids = lower(var.transit_gateway) == "enabled" ? var.tgw_subnet_ids : [] transit_gateway_id = lower(var.transit_gateway) == "enabled" ? var.tgw_id : "" vpc_id = lower(var.transit_gateway) == "enabled" ? var.vpc_id : "" }
内容的提问来源于stack exchange,提问作者Sagar Jadhav
相关产品推荐
相关产品推荐

