Terraform 的 aws_route_table 没做任何操作却出现了故障
Terraform中的aws_route_table在未执行任何操作的情况下出现了故障。
这会成为一个每月一次的连载吗?”什么都没做就坏了”系列。
我們在2019年12月進行了使用Terraform在AWS上建立開發環境的任務,現在需要將其作為子集再建立一次。
-
- 复制 tf 代码
-
- 删除不必要的部分
-
- 替换环境特定部分,如 tags.Name 和 subnet.cidr_block
-
- 开始 terraform 初始化
-
- 执行 terraform 计划
-
- 应用 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