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