Короткий ответ
Перед destroy нужно проверить, на каком именно окружении/workspace выполняется команда, посмотреть план удаления и убедиться в наличии актуального бэкапа данных для stateful-сервисов; для удаления одного ресурса лучше удалить его блок из кода и выполнить обычный apply, либо временно использовать terraform destroy -target=<адрес_ресурса>.
Как это работает подробнее
terraform destroy строит план, в котором каждый управляемый ресурс помечен на удаление, и выполняет его в порядке, обратном зависимостям; флаг -target ограничивает план конкретным адресом ресурса, но Terraform всё равно может затронуть зависимые от него ресурсы.
Пример кода
commands.sh
$ terraform plan -destroy -target=aws_instance.worker
$ terraform destroy -target=aws_instance.workerЧто использовать на практике
- Практика. перед запуском стоит явно проверить переменную окружения/workspace (
terraform workspace show) и backend-конфигурацию, чтобы не удалить прод вместо dev; для продовых БД нужен подтверждённый недавний снапшот; команду стоит запускать интерактивно с ручным подтверждением, а не в автоматическом non-interactive режиме.
Подводные камни
- Ошибка. использовать
-targetкак постоянный способ частичных изменений (HashiCorp рекомендует это только для экстренных ситуаций, так как это может рассинхронизировать state); запускать destroy в CI без ручного approve-шага для прод-окружения.