true和false结果表达式必须具有一致的类型.给定的表达式分别是字符串和数字的列表



我正在尝试使用地形代码创建传输网关VPC附件,但在执行地形计划时出现以下错误;地形版本是0.12

错误:-

│ Error: Inconsistent conditional result types
│
│   on vpn-dynamicmain.tf line 67, in resource "aws_ec2_transit_gateway_vpc_attachment" "tgw_vpc_attachment":
│   67:   subnet_ids         = lower(var.transit_gateway) == "enabled" ? var.tgw_subnet_ids : 0
│     ├────────────────
│     │ var.tgw_subnet_ids is a list of string, known only after apply
│     │ var.transit_gateway is a string, known only after apply
│
│ The true and false result expressions must have consistent types. The given expressions are list of      
│ string and number, respectively.

main.tf:-

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 : 0
transit_gateway_id = lower(var.transit_gateway) == "enabled" ? var.tgw_id : 0
vpc_id             = lower(var.transit_gateway) == "enabled" ? var.vpc_id : 0
}

变量.tf:-

variable "transit_gateway" {
type        = string
description = "Whether to create Transit gateway or not"
default     = "ENABLED"
}
variable "tgw_subnet_ids" {
type        = list(string)
description = "Transit gateway subnet Ids"
default     = ["subnet-12345", "subnet-54321"]
}
variable "vpc_id" {
type        = string
description = "VPC Id"
default     = "vpc-abc123"
}
variable "tgw_id" {
type        = string
description = "TGW id"
default     = "tgw-12345"
}

这里我尝试使用变量";tgw_subnet_ids";作为具有资源"中的条件的列表(字符串(;tgw_vpc_attachment";但它不起作用。

我相信,terraform想要的是True和False评估两边的一致类型。

因此,在您的代码中,true求值返回列表类型var.tgw_subnet_ids,false求值仅返回整数0。正如你所看到的,两者不匹配,地形正在出错。

如果你想传递列表的null值,你可以使用null类型https://www.terraform.io/docs/language/expressions/types.html#null

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 : null
transit_gateway_id = lower(var.transit_gateway) == "enabled" ? var.tgw_id : 0
vpc_id             = lower(var.transit_gateway) == "enabled" ? var.vpc_id : 0
}

首先,不是对初始问题的直接回答,但您甚至不需要在每个参数中对此进行比较

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
}

只有当第一个条件为true时,才会创建资源。。。所以在里面再次检查是多余的。

您看到的错误是基于这样一个事实,即terraform有一种非常严格的处理类型的方式。当有条件地设置参数值时,最好在条件的else情况下使用null,以便提供程序使用其他内部默认值或完全忽略参数。

最新更新