lesson ── terraform-beginner ── ~8 мин ── 3 шагов
Destroy, это apply со знаком минус. Terraform смотрит в state, видит все ресурсы, которые когда-то создал, и удаляет их через API облака. Используется для эфемерных окружений (поднял → проверил → снёс) и для закрытия проектов.
В реальной работе destroy опасен: данных не вернёшь, отката нет.
Поэтому есть prevent_destroy, защита от случайностей. См.
tf-destroy и tf-resource-lifecycle.
интерактивный sandbox
Поднимется пара контейнеров: terraform 1.9 и localstack 3.8 в одной сети. В браузере откроется терминал, можно сразу terraform init. Каждый шаг проверяется автоматически. TTL 45 минут, без регистрации.
stack ── terraform · localstack · 1 GB RAM · самоуничтожается через 45 мин простоя
resource "aws_s3_bucket" "demo" { bucket = "linuxlab-destroy-${random_id.suffix.hex}" tags = {Owner = "student"
}
}
resource "random_id" "suffix" {byte_length = 4
}
cd /home/student/tf-destroy
terraform init -input=false
terraform apply -auto-approve -input=false
В state будет один ресурс (плюс random_id).
Если apply падает: посмотри логи LocalStack: `docker logs localstack`.
✓ Бакет создан. Теперь попробуем destroy с защитой.
Добавь блок lifecycle в бакет:
resource "aws_s3_bucket" "demo" { bucket = "linuxlab-destroy-${random_id.suffix.hex}" tags = {Owner = "student"
}
lifecycle {prevent_destroy = true
}
}
Применить чтобы lifecycle был в state:
terraform apply -auto-approve
Теперь попробуй снести:
terraform destroy -auto-approve
Должно упасть с ошибкой:
Error: Instance cannot be destroyed
Resource aws_s3_bucket.demo has lifecycle.prevent_destroy set,
but the plan calls for this resource to be destroyed.
Это защита, а не баг. В проде это спасает от опечаток в git rm.
Если destroy прошёл: значит, prevent_destroy не применился. Сделай `apply` ещё раз и проверь что HCL сохранился.
✓ Защита работает: destroy заблокирован. Чтобы снести, придётся сначала убрать prevent_destroy.
OpenTofu держит CLI и state совместимыми с Terraform по командам
этого шага: миграция обычно проходит через mv .terraform .terraform.bak; tofu init -upgrade. Но при первом переходе
сделай backup state и прогон на feature-branch - расхождения
концентрируются в новых фичах (variables в backend,
state-encryption, OCI registry-backed модули). См.
tf-opentofu-parity для полной матрицы.
Чтобы реально снести бакет. Нужно сначала убрать prevent_destroy.
Удали блок lifecycle из main.tf (или поменяй на prevent_destroy = false). Файл должен снова выглядеть как:
resource "aws_s3_bucket" "demo" { bucket = "linuxlab-destroy-${random_id.suffix.hex}" tags = {Owner = "student"
}
}
resource "random_id" "suffix" {byte_length = 4
}
Применить (lifecycle уберётся из state):
terraform apply -auto-approve
Теперь destroy сработает:
terraform destroy -auto-approve
В конце увидишь:
Destroy complete! Resources: 2 destroyed.
Если destroy всё ещё падает: значит, prevent_destroy остался в HCL. Удали блок lifecycle полностью или замени на false.
✓ Все ресурсы снесены. State пуст. Это правильный путь: двухшаговая защита.
Если файл terraform.tfstate потерян (удалили, не закоммитили,
винт умер): для Terraform созданные ресурсы перестают
существовать. Снести их через destroy уже не получится (нечего
сносить). Можно: (а) импортнуть их обратно через terraform import
(долго, ресурс за ресурсом); (б) удалить через AWS Console или CLI
вручную. Поэтому remote state с шифрованием и резервированием,
не roскошь, а необходимость для прода.
Ты увидел destroy в действии, потом попробовал защититься через
prevent_destroy = true и убедился что Terraform реально блокирует
попытку удаления. Это твоя страховка в проде.
команды
terraform destroy -auto-approveснести все ресурсы из stateterraform plan -destroyпоказать что снесётся без подтвержденияterraform apply -auto-approve -replace=<address>пересоздать конкретный ресурсконцепции