我有这个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风格,因此在上面的示例中,我将变量重命名为route
。ROUTE
也可以,但命名Terraform变量的方式并不常见。