【问题标题】:Terraform Inappropriate value for attribute "route"Terraform 属性“路线”的值不合适
【发布时间】:2021-12-14 01:22:17
【问题描述】:

对于 terraform 来说相对较新,目前正尝试在 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 provider version = "3.63.0"
提前致谢

【问题讨论】:

    标签: amazon-web-services terraform terraform-provider-aws


    【解决方案1】:

    该参数的文档提到它使用的是旧版 attributes as blocks mode,这是 Terraform v0.12 的保留,在某些情况下,提供者依赖于能够在嵌套块语法中编写某些参数(例如在你的第二个例子)和属性语法(就像你的第一个例子一样)。

    文档示例中当前显示的语法 - 以及您问题中的第一个示例 - 与 the advice about how to write a fixed value (与动态值相反)相反,因此您在此处显示的第二个示例确实是首选方式就一般 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 中的所有现有路由。

    关于您在后续部分arbitrary expressions with argument syntax 中看到的行为的更多信息:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-03
      • 2021-12-09
      • 2021-06-23
      • 2021-11-27
      • 1970-01-01
      • 2020-04-09
      • 2020-08-09
      • 2021-07-17
      相关资源
      最近更新 更多