地形 属性"路线"的值不合适



相对较新,目前正在尝试在AWS中构建云基础设施。当我对资源aws_route_table使用文档中的官方示例(略有更改)时,我会得到一个错误(https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/route_table)

resource "aws_route_table" "prod-route-table" {
vpc_id = aws_vpc.prod-vpc.id
route = [{
# Route all Traffic to the internet gateway
cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.gw.id
},{
ipv6_cidr_block = "::/0"
gateway_id = aws_internet_gateway.gw.id
}]

}

我得到以下错误信息

Error: Incorrect attribute value type
│ Inappropriate value for attribute "route": element 0: attributes "carrier_gateway_id",
│ "destination_prefix_list_id", "egress_only_gateway_id", "instance_id", "ipv6_cidr_block",
│ "local_gateway_id", "nat_gateway_id", "network_interface_id", "transit_gateway_id", "vpc_endpoint_id",
│ and "vpc_peering_connection_id" are required.

添加所有这些属性可以解决错误,但是这会使代码大量爆炸。以不同的方式编写它(请参阅下面)不会导致错误,terraform AWS文档是否不正确,因为它们清楚地说明了第一种编写方法?

resource "aws_route_table" "prod-route-table" {
vpc_id = aws_vpc.prod-vpc.id
route {
# Route all Traffic to the internet gateway
cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.gw.id
}
route{
ipv6_cidr_block = "::/0"
gateway_id = aws_internet_gateway.gw.id
}

}

我使用的是terraform v1.0.10和aws提供商版本="3.63.0">
提前感谢

该参数的文档提到它使用遗留属性作为块模式,这是Terraform v0.12在某些情况下的保留,在这些情况下,提供者依赖于能够在嵌套块语法(如在第二个示例中)和属性语法(如在第一个示例中)中编写某些参数。

当前在文档示例中显示的语法-以及您问题中的第一个示例-与关于如何编写固定值(而不是动态值)的建议相反,因此实际上您在这里展示的第二个示例将是通用Terraform文档所关注的首选方式。

resource "aws_route_table" "example" {
vpc_id = aws_vpc.example.id
route {
cidr_block = "10.0.1.0/24"
gateway_id = aws_internet_gateway.example.id
}
route {
ipv6_cidr_block        = "::/0"
egress_only_gateway_id = aws_egress_only_internet_gateway.example.id
}
tags = {
Name = "example"
}
}

可能AWS提供商文档作者在这里使用属性语法是为了显示特殊情况下的对称性,即设置route = []显式地声明不应该有任何路由,因为不幸的是(由于历史原因)完全省略这个参数意味着忽略远程API中任何现有的路由,而不是删除远程API中所有现有的路由。

关于后面一节中看到的行为有更多的说明:

由于像这样的参数声明完全覆盖任何默认值的规则,当直接创建对象列表表达式时,通常对可选参数的处理不适用,因此必须为所有参数赋值,即使它是显式null:

example = [
{
# Cannot omit foo in this case, even though it would be optional in the
# nested block syntax.
foo = null
},
]

随着时间的推移,提供商将逐渐淘汰这种遗留模式,但必须谨慎行事,因为它可能对某些现有配置造成破坏性更改。不幸的是,在此之前,对于某些特定的提供者属性来说,这是一个令人困惑的粗糙边缘,尽管它们至少应该链接到我上面链接的相关文档页面,以注意它们的行为与正常的Terraform参数处理行为不匹配。

最新更新