Короткий ответ
state — это JSON-файл (terraform.tfstate), в котором Terraform хранит соответствие между ресурсами в коде и реальными объектами в инфраструктуре (их ID и атрибуты); без него Terraform не может понять, что уже создано, и будет пытаться создать всё заново или потеряет контроль над существующими ресурсами.
Как это работает подробнее
после каждого apply Terraform записывает в state реальные атрибуты ресурсов (ID, ARN и т.д.), и при следующем plan сравнивает три источника: конфигурацию кода, данные state и реальное состояние API, вычисляя разницу.
Пример кода
commands.sh
$ cat terraform.tfstate | jq '.resources[0].type'
"aws_s3_bucket"Что использовать на практике
- Практика. на локальной машине state по умолчанию лежит в файле terraform.tfstate рядом с кодом; в команде такой подход опасен (конфликты, потеря файла), поэтому используют удалённый backend. Состояние может содержать чувствительные данные (пароли, ключи) в открытом виде — это нужно учитывать при настройке доступа.
Подводные камни
- Ошибка. удалять или редактировать state файл вручную текстовым редактором; неправильно настраивать .gitignore — либо случайно коммитить terraform.tfstate в репозиторий (раскрывая секреты и создавая конфликты при параллельной работе), либо терять его без резервной копии.