how/state
Декларативные блоки для переименования, выпиливания и затаскивания ресурсов. Что они дают сверх CLI, в каких версиях Terraform появились, и почему живут в git.
Императивные команды state mv, state rm и import решают
конкретные задачи (см. tf-state-mv-rm-import), но у них одна общая
проблема: они не воспроизводимы.
Поэтому в Terraform постепенно появились декларативные аналоги:
moved блок - с Terraform 1.1 (декабрь 2021).import блок - с Terraform 1.5 (июнь 2023).removed блок - с Terraform 1.7 (январь 2024).Все три пишутся прямо в HCL, попадают в git, отрабатывают через
terraform apply как часть обычного плана. Жми ▶.
Один ресурс в HCL, одна запись в state, один бакет в облаке.
resource "aws_s3_bucket" "old" {bucket = "linuxlab-3f4a"
}
Тот же стартовый расклад, что в tf-state-mv-rm-import. Сейчас будем менять его декларативно - через блоки в HCL, а не через CLI.
итого
Когда блоки лучше CLI:
dev/staging/prod). Один блок отрабатывает во всех.Когда CLI всё ещё уместен:
terraform state list, terraform state show <addr>.state replace-provider).Жизненный цикл moved/removed/import-блоков:
Все три - transient. После того как блок отработал в apply, его можно удалять из HCL: state уже изменён, повторно блок ничего не делает. На практике их часто держат пару спринтов на случай отката, потом убирают.
Если ты забыл удалить moved блок и удалил target-ресурс
(aws_s3_bucket.primary), Terraform начнёт ругаться: «moved блок
ссылается на адрес, которого нет». Это сигнал, что блок устарел и
пора чистить.
Дальше: tf-state-anatomy про устройство state, tf-drift про то, что бывает между applies.