DEV Community

Sergey Shinder
Sergey Shinder

Posted on

История о том, как один terraform apply снёс базу

Самый страшный terraform apply в моей жизни выглядел абсолютно рутинно. Я менял тег на паре ресурсов, посмотрел на план, увидел ~ 2 to change и нажал yes. А в плане, чуть выше, тихо стояло - 1 to destroy, и этим ресурсом была управляемая база данных стейджинга.

Формально виноват был я — не дочитал план до конца. Но настоящая причина глубже. Кто-то поменял имя ресурса в модуле, а имя в Terraform — это идентичность. Для него старая база и новая — два разных объекта: одну удалить, другую создать. И он честно собирался это сделать, а я честно это пропустил, потому что привык скроллить план по диагонали.

После этого инцидента мы навели порядок в подходе к инфраструктуре как коду. Первое: prevent_destroy на всех stateful-ресурсах — базы, диски, бакеты. Пусть лучше apply упадёт с ошибкой, чем молча снесёт данные. Хочешь удалить по-настоящему — сделай это осознанно, отдельным шагом.

Второе: план перестал быть личным делом инженера. Теперь terraform plan гоняется в CI на пул-реквесте, вывод постится комментарием в PR, и любое destroy подсвечивается так, что не пропустишь. Ревьюер обязан увидеть, что именно изменится, до того как что-то применится.

Третье, и самое важное для дисциплины: никаких ручных apply с ноутбука. Только через пайплайн, с заблокированным стейтом в удалённом бэкенде и с чётким разделением окружений. Локально можно смотреть план сколько угодно, но кнопку жмёт робот, и жмёт он только то, что прошло ревью.

Ещё я перестал верить в «безобидные» изменения. В IaC не бывает мелких правок — переименование переменной может каскадом пересоздать половину окружения, если модуль написан неаккуратно. Поэтому мы разбили большие монолитные стейты на модули по зонам ответственности: сеть отдельно, данные отдельно, приложения отдельно. Взрыв в одном стейте больше не задевает соседей.

База стейджинга тогда восстановилась из бэкапа за сорок минут, и это был лучший исход из возможных. Но осадок остался навсегда, и он полезный: инфраструктура как код даёт вам огромную силу одной командой сломать всё. Уважайте эту силу и читайте план до последней строчки.

– Sergey Shinder

Top comments (0)