Terraform 的 aws_route_table 没做任何操作却出现了故障

Terraform中的aws_route_table在未执行任何操作的情况下出现了故障。

这会成为一个每月一次的连载吗?”什么都没做就坏了”系列。

我們在2019年12月進行了使用Terraform在AWS上建立開發環境的任務,現在需要將其作為子集再建立一次。

    1. 复制 tf 代码

 

    1. 删除不必要的部分

 

    1. 替换环境特定部分,如 tags.Name 和 subnet.cidr_block

 

    1. 开始 terraform 初始化

 

    1. 执行 terraform 计划

 

    1. 应用 terraform

 

    利用 serverspec 进行连通性测试

虽然不是每天或每周都要做的频率,但这本应该是按照常规安排来完成的任务。

遇见未知错误

检查代码差异,确保没有拼写错误或环境特定值的设置遗漏。当执行 terraform plan 后,突然出现了一个以前未见过的错误。

$ terraform plan
...
Error: expected "route.0.ipv6_cidr_block" to be a valid IPv4 Value, got : invalid CIDR address:

  on route.tf line 17, in resource "aws_route_table" "private-rt":
  17: resource "aws_route_table" "private-rt" {

为什么?为什么在IPv6的位置上使用IPv4数值?嗯,我会按照你说的去做。

            ipv6_cidr_block           = "0.0.0.0/0"

确实,terraform plan 会通过,但一旦执行 terraform apply,

  Enter a value: yes

aws_route_table.private-rt: Modifying... [id=rtb-xxxxxxxxxxxxxxxx]

Error: Error creating route: InvalidParameterCombination: The parameter destinationCidrBlock cannot be used with the parameter destinationIpv6CidrBlock
        status code: 400, request id: xxxx

  on route.tf line 17, in resource "aws_route_table" "private-rt":
  17: resource "aws_route_table" "private-rt" {

当然会这么想。也许您不喜欢空字符串吧。

            ipv6_cidr_block           = "::/0"
  Enter a value: yes

aws_route_table.private-rt: Modifying... [id=rtb-xxxxxxxxxxxxxxxx]

Error: Error creating route: InvalidParameterCombination: The parameter destinationCidrBlock cannot be used with the parameter destinationIpv6CidrBlock

尽管 terraform plan 可以通过,但无法执行 terraform apply。

terraform导入

原始的 aws_route_table 资源文的来源。

resource "aws_route_table" "private-rt" {
    route            = [
        {
            cidr_block                = "0.0.0.0/0"
            egress_only_gateway_id    = ""
            gateway_id                = ""
            instance_id               = ""
            ipv6_cidr_block           = ""
            nat_gateway_id            = aws_nat_gateway.ngw.id
            network_interface_id      = ""
            transit_gateway_id        = ""
            vpc_peering_connection_id = ""
        },
    ]
    tags             = {
        "Name" = "private-rt"
    }
    vpc_id           = data.aws_vpc.vpc.id
}

这个资源文件的来源应该是通过导入现有的 route_table 并查看 terraform state show 的结果获得的。

目前状态显示正是现有路由表的格式。

$ terraform state show aws_route_table."private-rt"
# aws_route_table.private-rt:
resource "aws_route_table" "private-rt" {
    id               = "rtb-xxxxxxxxxxxxxxxx"
    owner_id         = "xxxxxxxx"
    propagating_vgws = []
    route            = [
        {
            cidr_block                = "0.0.0.0/0"
            egress_only_gateway_id    = ""
            gateway_id                = ""
            instance_id               = ""
            ipv6_cidr_block           = ""
            nat_gateway_id            = "nat-xxxxxxxxxxxxxxxxf"
            network_interface_id      = ""
            transit_gateway_id        = ""
            vpc_peering_connection_id = ""
        },
    ]
    tags             = {
        "Name" = "private-rt"
    }
    vpc_id           = "vpc-xxxxxxxx"
}

“什么都没做就坏了” zuò jiù le)

代码修改 (Code modification)

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

aws_route_table 的官方语法和状态显示的结果有很大不同。
为了适应此处情况,我使用了以下内容。

resource "aws_route_table" "private-rt" {
    route {
            cidr_block                = "0.0.0.0/0"
            nat_gateway_id            = aws_nat_gateway.ngw.id
    }
    tags             = {
        "Name" = "private-rt"
    }
    vpc_id           = data.aws_vpc.vpc.id
}

执行环境 (shí

    • Amazon Linux 2

 

    • Terraform v0.12.26

 

    aws-cli/1.16.102 Python/2.7.16 Linux/4.14.138-114.102.amzn2.x86_64 botocore/1.12.92
广告
将在 10 秒后关闭
bannerAds