Состояние Terraform: что такое tfstate и чем опасен локальный файл

Рейтинг: 61% · 6 голосов
Подробный курс по Terraform и OpenTofu на примерах Yandex Cloud: ресурсы и провайдеры, состояние и бэкенды, модули, циклы и условия HCL, секреты и Lockbox, тестирование, CI/CD и командная работа. С актуализацией на 2026 (Terraform 1.3-1.10, OpenTofu).
Ответить
Аватара пользователя
Vlad_DevOps
Сообщения: 47
Зарегистрирован: 11 май 2026, 05:31

Состояние Terraform: что такое tfstate и чем опасен локальный файл

Сообщение Vlad_DevOps »

Оглавление курса (47)
  1. Что такое инфраструктура как код и зачем она нужна
  2. Категории инструментов IaC: чем отличаются Ansible, Packer, Kubernetes и Terraform
  3. Чем Terraform отличается от Ansible, Pulumi и CloudFormation
  4. Как работает Terraform под капотом и кто такой OpenTofu
  5. Установка Terraform и OpenTofu, подготовка Yandex Cloud
  6. Первый ресурс: разворачиваем виртуальную машину в Yandex Cloud
  7. Веб-сервер на ВМ: метаданные, user-data и группы безопасности
  8. Переменные ввода и выходные значения в Terraform
  9. Кластер ВМ: группа экземпляров Yandex Compute Instance Group
  10. Балансировщик нагрузки: Application Load Balancer в Yandex Cloud
  11. Состояние Terraform: что такое tfstate и чем опасен локальный файл (вы здесь)
  12. Удалённое хранилище состояния: бэкенд на Yandex Object Storage
  13. Изоляция состояния: рабочие области против раскладки по папкам
  14. Источники данных и terraform_remote_state: связываем компоненты
  15. Модули Terraform: переиспользуем инфраструктуру
  16. Входные, локальные и выходные переменные модуля
  17. Версионирование модулей и подводные камни
  18. Циклы в Terraform: параметр count
  19. Циклы в Terraform: for_each по множествам и картам
  20. Выражения for и строковые директивы
  21. Условная логика: count-трюк, for_each и директива if
  22. Встроенные функции, типы и выражения HCL
  23. Развёртывание без простоя: create_before_destroy
  24. Подводные камни Terraform и рефакторинг с блоком moved
  25. Управление секретами: основы и типы
  26. Инструменты управления секретами: Yandex Lockbox, Vault, SOPS
  27. Аутентификация провайдера и секреты: сервисные аккаунты и OIDC
  28. Секреты в ресурсах и состоянии, ephemeral-значения
  29. Провайдеры Terraform: установка, версии, required_providers
  30. Несколько копий одного провайдера: alias и мультизона
  31. Несколько провайдеров и аккаунтов: configuration_aliases
  32. Terraform, Docker и Kubernetes: Managed Kubernetes в Yandex Cloud
  33. Код Terraform промышленного уровня: почему это долго
  34. Мелкие компонуемые модули вместо монолита
  35. Тестируемые модули и проверки: validation, precondition, postcondition
  36. Версионирование, публикация модулей и Terragrunt
  37. Ручное тестирование Terraform и очистка ресурсов
  38. Автоматические тесты на Terratest: модульные тесты
  39. Интеграционные и сквозные тесты, пирамида тестирования
  40. Нативный terraform test и статический анализ
  41. Внедрение Terraform в команде: процессы и культура
  42. Конвейер развёртывания прикладного кода
  43. Конвейер инфраструктурного кода и золотое правило Terraform
  44. Стиль, ревью и CI/CD-инструменты: Atlantis, TACOS, policy as code
  45. Что нового в Terraform 1.3-1.10: моды, импорт, провайдер-функции, Stacks
  46. OpenTofu в 2026: чем живёт форк и как мигрировать
  47. Сертификация HashiCorp Terraform Associate и карьера
Зачем Terraform вообще что-то помнит

Представь ситуацию. Ты написал конфиг, сделал terraform apply, поднял виртуалку в Yandex Cloud. Через неделю ты поменял у этой виртуалки объём памяти и снова запустил apply. И тут возникает вопрос на миллион: откуда Terraform знает, что виртуалку нужно ИЗМЕНИТЬ, а не создать ещё одну рядом? В твоём облаке уже крутится десяток ресурсов, в коде описано то же самое - как инструмент сопоставляет одно с другим?

Ответ - файл состояния, он же state, он же terraform.tfstate. Это память Terraform. Без него инструмент - амнезиак, который каждый раз видит мир впервые. И именно поэтому state - одна из тех тем, которую новички проскакивают, а потом неделями огребают на проде. Давай разберёмся раз и навсегда, что это за зверь и почему держать его локально в команде - билет в один конец.

Изображение

Что такое state и что у него внутри

Terraform работает по принципу инфраструктура как код (IaC, она же infrastructure as code). Ты декларативно описываешь желаемое состояние, а инструмент приводит реальность к нему. Но чтобы понять, что делать, ему нужно знать три вещи: что ты хочешь (это твой .tf код), что есть на самом деле (это реальные ресурсы в облаке) и что было создано в прошлый раз (а вот это и есть state).

State выполняет несколько работ сразу:
  • Маппинг код - реальность. Связывает твой ресурс yandex_compute_instance.web с конкретным id виртуалки в облаке, например fhm9abc.... Без этой связки Terraform не знает, какой реальный объект соответствует какому блоку кода.
  • Метаданные. Хранит все атрибуты ресурсов, которые вернуло облако после создания - ip-адреса, autogenerated id, статусы. Это позволяет на следующем плане сравнить желаемое с фактическим.
  • Граф зависимостей. Terraform помнит, в каком порядке ресурсы связаны, чтобы корректно их удалять и пересоздавать. При destroy он идёт в обратном порядке - сначала виртуалку, потом сеть.
  • Производительность. На больших инфраструктурах Terraform кеширует атрибуты в state, чтобы не дёргать API облака по каждому ресурсу на каждый terraform plan.
Физически terraform.tfstate - это обычный JSON-файл. Открой его и увидишь примерно такое (сильно урезанный фрагмент):

Код: Выделить всё

{
  "version": 4,
  "terraform_version": "1.7.0",
  "serial": 8,
  "lineage": "a1b2c3d4-...",
  "resources": [
    {
      "mode": "managed",
      "type": "yandex_compute_instance",
      "name": "web",
      "provider": "provider[\"registry.terraform.io/yandex-cloud/yandex\"]",
      "instances": [
        {
          "attributes": {
            "id": "fhm9abcde12345",
            "name": "web-1",
            "zone": "ru-central1-a",
            "fqdn": "web-1.ru-central1.internal"
          }
        }
      ]
    }
  ]
}
Поле serial - это счётчик версий, он растёт при каждом изменении. lineage - уникальный id конкретной "линии жизни" этого state, по нему Terraform ловит ситуацию, когда ты случайно подсунул state от совсем другого проекта. Запомни эти два поля, они ещё всплывут, когда речь зайдёт о бэкендах и блокировках.

Почему локальный файл - это бомба замедленного действия

Пока ты один и проект учебный, terraform.tfstate спокойно лежит рядом с кодом, и всё работает. Проблемы начинаются, как только появляется второй человек или второй компьютер. Разберём по пунктам, чем опасен локальный terraform state.

1. Нет шеринга. State лежит у тебя на ноуте. Коллега клонирует репозиторий - а state там нет (и быть не должно, об этом ниже). Он делает apply со своей машины, Terraform не видит твоих ресурсов в своём пустом state и пытается создать всё заново. Получаем дубли инфраструктуры и счёт от облака в подарок.

2. Конфликты и гонки. Допустим, вы решили класть state в git, чтобы шерить. Звучит логично, но это ловушка. Двое одновременно делают apply, каждый коммитит свой обновлённый state - и вы получаете merge-конфликт в гигантском JSON, который руками не разрулить. А если apply идут параллельно, два процесса пишут в один файл без блокировки и затирают изменения друг друга. Это и есть гонка состояний (race condition), после которой state перестаёт отражать реальность.

3. Секреты в открытом виде. Вот это больно. State хранит ВСЕ атрибуты ресурсов, включая чувствительные. Пароль от управляемой базы данных, приватный ключ, токен - всё это ложится в tfstate открытым текстом. Положил такой файл в публичный (да и в приватный) git - считай, слил секреты. Никакой sensitive = true в коде это не лечит, в state значение всё равно настоящее.

4. Легко потерять. Снёс папку, переустановил систему, не закоммитил, ноут утонул в кофе - и всё, маппинг потерян. Ресурсы в облаке живут, но Terraform о них больше не знает. Теперь либо мучительный terraform import каждого ресурса вручную, либо удаление и пересоздание всего с нуля.

Вывод простой: в любой командной работе state должен жить в удалённом бэкенде - например, в Yandex Object Storage с блокировкой через YDB или в Terraform Cloud. Удалённый бэкенд решает сразу все четыре боли: один общий источник правды, блокировка от гонок, шифрование секретов at rest, бэкапы. Настройку бэкенда мы детально разберём в следующем уроке, а пока главное - усвоить, ПОЧЕМУ локальный файл не вариант. Кстати, если ты используешь OpenTofu (открытый форк Terraform после смены лицензии), всё сказанное про state работает абсолютно так же - формат файла и логика идентичны.

Команды для работы с state

Лезть в JSON руками - табу, но Terraform даёт безопасный CLI-инструментарий, чтобы с состоянием работать цивилизованно. Вот рабочий минимум.

terraform state list - показывает список всех ресурсов в state. Первое, что стоит запустить, когда непонятно, что вообще под управлением Terraform.

Код: Выделить всё

terraform state list
# yandex_compute_instance.web
# yandex_vpc_network.main
# yandex_vpc_subnet.main
terraform state show - выводит все атрибуты конкретного ресурса так, как они записаны в state. Удобно, чтобы посмотреть фактический ip или id без захода в консоль облака.

Код: Выделить всё

terraform state show yandex_compute_instance.web
terraform state rm - убирает ресурс ИЗ state, но НЕ удаляет его в облаке. Звучит странно, но это спасение, когда ты хочешь, чтобы Terraform "забыл" про ресурс и перестал им управлять, оставив сам объект живым.

Код: Выделить всё

terraform state rm yandex_compute_instance.web
terraform state mv - переименовывает ресурс внутри state или переносит его в модуль. Нужно, когда ты в коде переименовал блок (например web стал app) и не хочешь, чтобы Terraform увидел это как "удалить старое, создать новое". Просто говоришь state: это тот же ресурс, у него новый адрес.

Код: Выделить всё

terraform state mv yandex_compute_instance.web yandex_compute_instance.app
Все эти команды меняют state аккуратно и консистентно, в отличие от ручной правки JSON. И запомни железное правило: никогда не редактируй terraform.tfstate в текстовом редакторе. Один лишний запятой или сбитый serial - и state ломается так, что проще удалить инфраструктуру, чем чинить. Если очень надо вмешаться - только через state-команды.

Мини-лаба

Руки помнят лучше глаз. Сделай это сам:
  • Подними любой простой ресурс через apply (хватит yandex_vpc_network).
  • Открой terraform.tfstate в редакторе и найди поля version, serial, lineage и блок resources. Не меняй ничего, просто посмотри.
  • Запусти terraform state list, потом terraform state show на свою сеть. Сравни вывод с тем, что в JSON.
  • Сделай state rm своей сети, затем terraform plan. Обрати внимание: Terraform теперь хочет создать её заново, потому что забыл про неё. Сеть в облаке при этом цела.
  • Верни управление через terraform import (синтаксис: terraform import адрес id_ресурса) и убедись, что plan снова чистый.
Контрольные вопросы
  • Зачем Terraform нужен state, если он и так может опросить API облака?
  • Назови минимум две причины, почему хранить tfstate локально в команде опасно.
  • Чем terraform state rm отличается от terraform destroy с точки зрения реальных ресурсов?
  • Почему нельзя редактировать файл состояния руками и что использовать вместо этого?
Что запомнить

State - это память Terraform, JSON-файл с маппингом кода на реальные ресурсы, метаданными и зависимостями. Локальный terraform.tfstate годится только для соло-эксперимента: в команде он не шерится, ловит гонки и конфликты, светит секретами и легко теряется. Лечение - удалённый бэкенд (Yandex Object Storage и подобные). Для разбора и переноса ресурсов есть безопасные команды state list/show/rm/mv, а лезть в JSON руками - запрещено. Усвоишь это сейчас - сэкономишь себе пару бессонных ночей на проде потом.
👍 ❤️4 🔥1 😄 🤔
Аватара пользователя
ZfsEnjoyer
Сообщения: 1
Зарегистрирован: 19 май 2026, 11:42

Re: Состояние Terraform: что такое tfstate и чем опасен локальный файл

Сообщение ZfsEnjoyer »

Спасибо, наконец дошло зачем вообще нужен этот файл. Я думал terraform каждый раз облако опрашивает и не понимал почему нельзя без state.
👍 ❤️1 🔥 😄 🤔
Аватара пользователя
pb23396
Сообщения: 1
Зарегистрирован: 21 май 2026, 10:32

Re: Состояние Terraform: что такое tfstate и чем опасен локальный файл

Сообщение pb23396 »

А можно поподробнее про import? Сделал state rm как в лабе, plan хочет пересоздать сеть, а формат команды import не до конца понял - id ресурса это который в консоли облака показывается?
👍1 ❤️ 🔥 😄 🤔
Ответить
← Предыдущая глава
Балансировщик нагрузки: Application Load Balancer в Yandex Cloud
Следующая глава →
Удалённое хранилище состояния: бэкенд на Yandex Object Storage

Все главы курса «Terraform: инфраструктура как код на Yandex Cloud»

Поделиться темой: ✈ Telegram VK
Похожие запросы: terraform yandex cloud с чего начать новичкукак установить terraform и opentofu на linuxчто такое terraform state и tfstate простыми словамиудаленный backend terraform на object storage yandex cloudчто такое инфраструктура как код iac простыми словамиterraform plan и apply что делают и чем отличаются

Вернуться в «Terraform: инфраструктура как код на Yandex Cloud»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость