地形如何修复属性"route":需要对象集



我有这个terraform模块route_table.tf需要使用。它看起来如下:

resource "aws_route_table" "aws_route_table" {
# route {
#   cidr_block = "0.0.0.0/0"
#   gateway_id = var.GATEWAY_ID
# }
route = var.ROUTE
tags = var.ROUTE_TABLE_TAGS
vpc_id = var.VPC_ID
}

并且我已经在inputs.tf:中如下定义了变量CCD_

variable "ROUTE" {
type = object({ cidr_block=string, gateway_id=string })
}

我在main.tf中传递这些值,如下所示:

module "route_tables_public" {
source = "./modules/route_tables"
ROUTE =    {
cidr_block = "0.0.0.0/0"
gateway_id = var.GATEWAY_ID
}
ROUTE_TABLE_TAGS = { "Name" : "mlb-rt-public" , "Project" : "mlb"}
VPC_ID           = module.ecs_vpc.vpc_id
}

但我得到了这个错误:

属性"的值不合适;路线":需要一组对象。

有人能帮我吗?

您的var.ROUTE是单个对象,但它应该是对象列表。所以你可以试试:

variable "ROUTE" {
type = list(object({ cidr_block=string, gateway_id=string }))
}

然后

module "route_tables_public" {
source = "./modules/route_tables"
ROUTE =    [{
cidr_block = "0.0.0.0/0"
gateway_id = var.GATEWAY_ID
}]
ROUTE_TABLE_TAGS = { "Name" : "mlb-rt-public" , "Project" : "mlb"}
VPC_ID           = module.ecs_vpc.vpc_id
}

更新

你的aws_route_table应该是:

resource "aws_route_table" "aws_route_table" {
dynamic "route" {

for_each = var.ROUTE

content {
cidr_block = route.value.cidr_block
gateway_id = route.value.gateway_id
}
}
tags = var.ROUTE_TABLE_TAGS
vpc_id = var.VPC_ID
}

我建议不要像这样直接将变量值分配给复杂的资源类型参数,因为如果route参数的架构在未来增长到包括其他属性,那么您的模块将无法通过验证。

相反,最好让变量的类型独立于route块模式,并在它们之间显式转换,这样只要新版本的提供程序没有为该块引入新的必需的参数,就可以实现这一点。

variable "route" {
type = object({
cidr_block = string
gateway_id = string
})
}
resource "aws_route_table" "aws_route_table" {
# ...
route {
cidr_block = var.route.cidr_block
gateway_id = var.route.gateway_id
}
}

这是可行的,因为它使用对象的两个属性构建了一个符合route块模式的新对象,而您的示例失败了,因为您试图将输入对象直接分配给该参数,这需要您与目标类型完全匹配。

请注意,以大写字母命名变量不是惯用的Terraform风格,因此在上面的示例中,我将变量重命名为routeROUTE也可以,但命名Terraform变量的方式并不常见。

最新更新