linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
Intro
Lessons
Footer
linuxlab-УчебникиЦеныО платформеКонфиденциальность и куки
Copyright © 2026 LinuxLab. Все права защищены.
linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
  • Введение
  • Уроки
  • How it works
  • База знаний
  • Шпаргалка
  • Capstone
  • Собеседование
home/terraform/lessons/tf-garden-03-import-mismatch

lesson ── terraform-garden ── ~16 мин ── 4 шагов

Troubleshooting Garden: import показывает на пустоту

Кто-то добавил два import-блока чтобы захватить существующие ресурсы и не плодить дубли. Но в облаке ресурсы лежат под одними именами, а import.id написан с опечатками: «logs» ↔ «loggs», «ci-role» ↔ «ci-role-old». Plan падает с «Cannot import non-existent remote object».

Найди оба несоответствия, поправь и докажи что план идёт без destroy.

▶ интерактивный sandbox

Поднимется пара контейнеров: terraform 1.9 и localstack 3.8 в одной сети. В браузере откроется терминал, можно сразу terraform init. Каждый шаг проверяется автоматически. TTL 45 минут, без регистрации.

запустить sandbox →

stack ── terraform · localstack · 1 GB RAM · самоуничтожается через 45 мин простоя

Шаги

  1. 01

    Запусти plan, поймай import error

    bash
    cd /home/student/tf-garden
    terraform init
    terraform plan 2>&1 | tee /tmp/import.log

    Должны вылезти две строки с ошибками вроде:

    Error: Cannot import non-existent remote object
      with aws_s3_bucket.logs,
      on main.tf line ...

    И аналогичная, для aws_iam_role.ci. Это значит: imported ID garden-import-loggs / garden-ci-role-old в облаке отсутствуют.

    ✓ Обе ошибки видны. Теперь, что в облаке на самом деле.

  2. 02

    Сверь с реальностью: что есть в LocalStack

    bash
    aws --endpoint-url=http://localstack:4566 s3 ls | tee /tmp/s3.log
    aws --endpoint-url=http://localstack:4566 iam list-roles \
      --query 'Roles[].RoleName' --output text | tee /tmp/iam.log

    Покажет:

    • S3: garden-import-logs (без второго g).
    • IAM: garden-ci-role (без -old).

    Это и есть твои настоящие id. Опечатка, в HCL, в облаке всё корректно.

    ✓ Реальные id найдены. Теперь поправь HCL.

  3. 03

    Исправь id в import-блоках

    Открой main.tf и замени строки:

    hcl
    import {
      to = aws_s3_bucket.logs
      id = "garden-import-logs"     # было: garden-import-loggs
    }

    и

    hcl
    import {
      to = aws_iam_role.ci
      id = "garden-ci-role"         # было: garden-ci-role-old
    }

    Один симметричный способ через sed:

    bash
    sed -i 's/garden-import-loggs/garden-import-logs/' main.tf
    sed -i 's/garden-ci-role-old/garden-ci-role/' main.tf
    подсказка

    Опечатка в S3, лишняя g. В IAM, лишний суффикс -old.

    ✓ Опечатки убраны. Проверим plan.

  4. 04

    Plan должен показать import без destroy

    bash
    terraform plan -out=plan.tfplan
    terraform show plan.tfplan | head -40

    В плане должны появиться строки:

    # aws_s3_bucket.logs will be imported
    # aws_iam_role.ci will be imported

    Никаких # ... will be destroyed быть не должно. Если есть destroy это значит HCL описывает ресурс по-другому, и провайдер хочет пересоздать. В нашем случае HCL совпадает с облаком, должен быть чистый import.

    Apply (опционально):

    bash
    terraform apply plan.tfplan

    ✓ Bucket и role в state, без destroy. Import-блок отработал.

    То же самое на OpenTofu

    OpenTofu умеет import-блоки начиная с 1.6. Поведение и сообщения идентичны. Единственное расхождение, -generate-config-out стабильнее в OT, потому что они быстрее залатали несколько ранних багов с unicode-именами. См. tf-opentofu-parity.

    • → terraform import
    • → OpenTofu parity

Что ты узнал

Import захватывает то, что указано в id. Если id не существует провайдер возвращает 404, terraform ругается «non-existent remote object». Лекарство, проверить id руками через провайдер CLI (aws s3 ls, aws iam list-roles), а лучше, закодить guard через data-source.

команды

  • aws --endpoint-url=http://localstack:4566 s3 lsпроверь имена S3-bucket перед import
  • aws --endpoint-url=http://localstack:4566 iam list-roles --query 'Roles[].RoleName'проверь имена IAM-ролей
  • terraform plan -generate-config-out=imported.tfсгенерировать HCL для импортируемого ресурса (TF 1.5+)

концепции

  • · import.id, это адрес в провайдере (S3-bucket name, IAM-role name, EC2-instance id)
  • · Plan-on-import выполняется до apply, ошибка ловится без последствий
  • · data-source guard перед import-блоком, паттерн для legacy-миграций

← предыдущий

Outputs: возвращаем значения наружу

следующий →

for_each над модулем. N экземпляров одним блоком

Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки