Terraform `import` для` aws_route_table` хочет впоследствии удалить маршруты из файла состояния

У меня возникли проблемы при импорте существующих таблиц маршрутизации 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 определениями.

А теперь я запыхался.


person Afraz    schedule 01.05.2018    source источник
comment
Вы уверены, что правила в правильном порядке?   -  person Jakub Kania    schedule 01.05.2018
comment
Что ж, я провожу их в разумном порядке. т.е. создать vpc, прежде чем пытаться импортировать что-либо, что от него зависит и т. д.   -  person Afraz    schedule 02.05.2018
comment
Но разве TF не пытается просто поместить маршрут 1 на место маршрута 0 и наоборот? Вопросы заказа с TF   -  person Jakub Kania    schedule 02.05.2018


Ответы (2)


Прибегаю к этой проблеме тоже. Поскольку не представляется возможным полностью импортировать таблицы маршрутизации, я собираюсь создать новые с помощью terrform, а затем изменить ассоциации, чтобы они указывали на новые таблицы. Это кажется самым простым путем к тому, чтобы Terraform управлял всеми ресурсами.

person Todd Wells    schedule 24.08.2018

Вам следует попробовать объявить свои маршруты на отдельном ресурсе 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 в настоящее время предоставляет как автономный ресурс Route, так и ресурс таблицы маршрутов с маршрутами, определяемыми в режиме реального времени. В настоящее время вы не можете использовать таблицу маршрутов со встроенными маршрутами в сочетании с любыми ресурсами маршрутов. Это вызовет конфликт настроек правила и перезапишет правила.

person Heits    schedule 24.03.2021