У меня проблемы с импортом существующих таблиц маршрутизации AWS в Terraform. Они импортируются, и их маршруты записываются в файл состояния, но после запуска plan
или apply
всегда требуется удалить эти маршруты, даже если они также определены в Terraform.
Я определяю существующую таблицу маршрутизации AWS в Terraform следующим образом:
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
и прикрепить их к таблице маршрутизации по идентификатору, например:
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
ресурсами, будут конфликтовать.
EDIT:
Наиболее вероятное объяснение, насколько я вижу, заключается в том, что при импорте Terraform весьма успешно импортирует маршруты внутри таблицы маршрутов, но затем на plan
ожидает, что они будут объявлены явно с использованием ресурсов aws_route
.
Проблема с этим есть; вы не можете импортировать aws_route
ресурсов, поэтому ваше текущее состояние инфраструктуры никогда не будет соответствовать вашему состоянию terraform.
Я думаю, что причина их явного последующего объявления также не работает, потому что файл состояния записывает импортированные маршруты по-разному, если он получил их из команды import aws_route_table ...
, если он генерирует их из apply
с явным aws_route
определения.
А теперь у меня перехватило дыхание.