Terraform `import` для` aws_route_table` Хочет удалить маршруты из файла состояния впоследствии - PullRequest
0 голосов
/ 01 мая 2018

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

А теперь у меня перехватило дыхание.

1 Ответ

0 голосов
/ 24 августа 2018

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

...