我在将现有AWS路由表导入Terraform时遇到了一些麻烦。它们导入,它们的路由记录在状态文件中,但之后运行plan
或apply
总是要删除这些路由,即使它们也是在Terraform中定义的。
我在Terraform中定义现有的AWS路由表,如下所示:
resource "aws_route_table" "public_staging" {
vpc_id = "${aws_vpc.staging.id}"
route {
cidr_block = "${aws_vpc.management.cidr_block}"
vpc_peering_connection_id = "${aws_vpc_peering_connection.management_to_staging.id}"
}
route {
cidr_block = "0.0.0.0/0"
gateway_id = "${aws_internet_gateway.staging.id}"
}
tags {
Name = "public staging (igw)"
environment = "staging"
}
}
然后像这样导入它; terraform import aws_route_table.public_management rtb-abc123
。
哪个输出:
aws_route_table.public_staging: Importing from ID "rtb-abc123"...
aws_route_table.public_staging: Import complete!
Imported aws_route_table (ID: rtb-abc123)
Imported aws_route (ID: r-rtb-abc123123456)
Imported aws_route (ID: r-rtb-abc123654321)
Imported aws_route_table_association (ID: rtbassoc-qwert765)
Imported aws_main_route_table_association (ID: rtbassoc-asdf9876)
aws_route.public_staging: Refreshing state... (ID: r-rtb-abc123123456)
aws_route_table.public_staging: Refreshing state... (ID: rtb-abc123)
aws_route.public_staging-1: Refreshing state... (ID: r-rtb-abc123654321)
aws_route_table_association.public_staging: Refreshing state... (ID: rtbassoc-qwert765)
aws_main_route_table_association.public_staging: Refreshing state... (ID: rtbassoc-asdf9876)
当运行terraform plan
时,Terraform想要删除它在状态文件中生成的所有aws_route
资源状态,并创建我们刚刚导入的路由表:
Terraform will perform the following actions:
- aws_route.public_staging
- aws_route.public_staging-1
+ aws_route_table.public_management
...
我还尝试在aws_route_table
资源之外单独定义路由,并通过ID将它们附加到路由表,如下所示:
resource "aws_route" "management_to_staging" {
route_table_id = "${aws_route_table.public_management.id}"
cidr_block = "${aws_vpc.staging.cidr_block}"
vpc_peering_connection_id = "${aws_vpc_peering_connection.management_to_staging.id}"
}
唯一会导致无变化状态的是,如果我在路由表上运行导入,也定义路由表之外的路由(作为aws_route
资源),然后进入并手动将状态文件中生成的名称更改为我已定义的tf文件。但是,我认为这实际上并不适用于新的运行,因为aws_route_table
中定义的路由和单独的aws_route
资源中的路由会发生冲突。
据我所知,最有可能的解释是,在导入时,Terraform非常乐意导入路由表中的路由,但随后在plan
上,它希望使用{{1}明确声明它们资源。
问题是;您无法导入aws_route
资源,因此您的当前基础架构状态永远不会与您的terraform状态相匹配。
我认为之后明确声明它们的原因之一是,如果从aws_route
命令获取导入路由到从{{1}生成它们,则状态文件会以不同方式记录导入路由使用明确的import aws_route_table ...
定义。
现在我已经喘不过气来了。
答案 0 :(得分:0)
也遇到了这个问题。由于完全导入路由表似乎不可行,因此我将通过terrform创建新的路由表,然后将关联更改为指向新表。这似乎是让Terraform管理所有资源的最简单方法。
答案 1 :(得分:0)
您应该尝试在单独的资源 aws_route
上声明您的路由。 route
资源内的嵌套 aws_route_table
对象与单独的 aws_route
的工作方式相同,但后者可以被导入。 Check the documentation。
试试这个。
resource "aws_route_table" "public_staging" {
vpc_id = "${aws_vpc.staging.id}"
tags {
Name = "public staging (igw)"
environment = "staging"
}
}
resource "aws_route" "public_staging_r0" {
route_table_id = aws_route_table.public_staging.id
cidr_block = "${aws_vpc.management.cidr_block}"
vpc_peering_connection_id = "${aws_vpc_peering_connection.management_to_staging.id}"
}
resource "aws_route" "public_staging_r1" {
route_table_id = aws_route_table.public_staging.id
cidr_block = "0.0.0.0/0"
gateway_id = "${aws_internet_gateway.staging.id}"
}
然后,正常导入aws_route_table
,每个aws_route
如下
terraform import aws_route.<route_id> <route_table_id>_<cidr_block>
terraform import aws_route.public_staging_r0 rtb-abc123_0.0.0.0/0
重要提示:根据文档,不要将单独的 aws_route
资源一起与嵌套路由一起使用
关于路由表和路由的注意事项: Terraform 目前提供独立的 Route 资源和具有内嵌定义的路由的 Route Table 资源。目前,您不能将带有内嵌路由的路由表与任何路由资源结合使用。这样做会导致规则设置冲突并覆盖规则。