从 VPC 对等添加路由时,Terraform 不断更新 aws_route_table

Terraform keeps updating aws_route_table when adding routes from VPC Peering

我创建了一个 aws_vpc_peering_connection 来连接到我帐户中的 VPC。我正在使用 aws_route_table 将路由应用于每个 VPC 的路由 table,使用路由 table 部分中的变量来设置路由。

路由 table 应用正确,但 terraform 想要在我之后每次应用它时再次应用它。其中一个 VPC 的 vpc 对等路由的 gateway_id 来自一个变量,因为数据是从另一个模块中提取的。

resource "aws_route_table" "route-table" {
  vpc_id = "${aws_vpc.us-west-2-3.id}"

  route {
    cidr_block = "0.0.0.0/0"
    gateway_id = "${aws_internet_gateway.internet-gateway.id}"
  }

  route {
    cidr_block  = "10.12.0.0/16"
    gateway_id  = "${aws_vpc_peering_connection.usw2-1-usw2-3.id}"
  }

}

每次我 planapply terraform 想要更改 aws_route_table

  ~ module.us-west-2-3.aws_route_table.route-table
      route.2485290482.cidr_block:                "10.12.0.0/16" => ""
      route.2485290482.egress_only_gateway_id:    "" => ""
      route.2485290482.gateway_id:                "" => ""
      route.2485290482.instance_id:               "" => ""
      route.2485290482.ipv6_cidr_block:           "" => ""
      route.2485290482.nat_gateway_id:            "" => ""
      route.2485290482.network_interface_id:      "" => ""
      route.2485290482.vpc_peering_connection_id: "pcx-0f3853c43363d28bb" => ""
      route.383599590.cidr_block:                 "" => "10.12.0.0/16"
      route.383599590.egress_only_gateway_id:     "" => ""
      route.383599590.gateway_id:                 "" => "pcx-0f3853c43363d28bb"
      route.383599590.instance_id:                "" => ""
      route.383599590.ipv6_cidr_block:            "" => ""
      route.383599590.nat_gateway_id:             "" => ""
      route.383599590.network_interface_id:       "" => ""
      route.383599590.vpc_peering_connection_id:  "" => ""
      route.4190671864.cidr_block:                "0.0.0.0/0" => "0.0.0.0/0"
      route.4190671864.egress_only_gateway_id:    "" => ""
      route.4190671864.gateway_id:                "igw-84caffe3" => "igw-84caffe3"
      route.4190671864.instance_id:               "" => ""
      route.4190671864.ipv6_cidr_block:           "" => ""
      route.4190671864.nat_gateway_id:            "" => ""
      route.4190671864.network_interface_id:      "" => ""
      route.4190671864.vpc_peering_connection_id: "" => ""

这是我应该报告的错误还是我做错了什么?

在您的第二个内联路由定义中,您指定了 gateway_id

Gateway_id 用于 internet 访问。您想要使用的是 vpc_peering_connection_id

vpc_peering_connection_id  = "${aws_vpc_peering_connection.usw2-1-usw2-3.id}"

官方 terraform 文档提到混合使用 gateway_id 和 nat_gateway_id 时您可能会陷入无限更新,我不会感到惊讶,当您混合使用 gateway_id 时也是如此和 vpc_peering_connection:

NOTE on gateway_id and nat_gateway_id: The AWS API is very forgiving with these two attributes and the aws_route_table resource can be created with a NAT ID specified as a Gateway ID attribute. This will lead to a permanent diff between your configuration and statefile, as the API returns the correct parameters in the returned route table. If you're experiencing constant diffs in your aws_route_table resources, the first thing to check is whether or not you're specifying a NAT ID instead of a Gateway ID, or vice-versa.

来源:https://www.terraform.io/docs/providers/aws/r/route_table.html