"aws_route_table"的 Terraform "import"希望之



我在将现有 AWS 路由表导入 Terraform 时遇到了一些问题。它们导入,并且它们的路由记录在状态文件中,但之后运行planapply始终希望删除这些路由,即使它们也在 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,它希望使用aws_route资源显式声明它们。

问题是:您无法导入aws_route资源,因此您永远无法使当前的基础结构状态与地形状态匹配。

我认为事后明确声明它们的原因是,如果状态文件从import aws_route_table ...命令获取它们,则状态文件记录导入的路由的方式不同,如果它从具有显式aws_route定义的apply生成它们。

现在我气喘吁吁。

也遇到了这个问题。 由于完全导入路由表看起来不可行,我将通过 terrform 创建新的路由表,然后更改关联以指向新表。这似乎是让Terraform管理所有资源的最简单方法。

您应该尝试在单独的资源aws_route上声明路由。资源中的嵌套route对象aws_route_table其工作原理与单独的aws_route相同,但后者可以导入。查看文档。

试试这样。

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 目前同时提供独立的路由资源和路由表资源,其中路由是内联定义的。目前,您无法将具有内联路由的路由表与任何路由资源结合使用。这样做会导致规则设置冲突,并覆盖规则。

相关内容

  • 没有找到相关文章

最新更新