Деплой и инфра
Infrastructure as Code: собери drift-безопасный стек
Читать про залоченное состояние и тихие откаты — не то же самое, что прожить их. Подними небольшой, но реальный стек IaC с правильным удалённым состоянием, затем намеренно проведи его через два инцидента из урока — столкновение конкурентного apply и drift вне инструмента — и восстановись из каждого по-сеньорски, с доказательством на каждом шаге.
Преврати ментальную модель модуля в мышечную память: настрой версионируемый залоченный удалённый бэкенд, докажи, что лок реально блокирует конкурентный apply, вызови настоящий drift и разреши его осознанно вместо того, чтобы дать apply тихо его откатить, и держи секреты вне state.
Собери небольшой стек Terraform/OpenTofu (или Pulumi) с правильным удалённым, версионируемым, залоченным состоянием, затем намеренно воспроизведи и восстановись из столкновения конкурентности и события drift — доказывая каждый исход выводом команд, а не утверждением.
- Вывод команд (не проза), показывающий: чистый apply, холостой второй apply, падение 'Error acquiring the state lock' при конкурентности и plan -refresh-only, сообщающий вызванный drift.
- Короткий разбор разрешения drift: какое ручное изменение ты закодифицировал в конфиг, какое дал apply откатить, и обоснование каждого — явно назвав риск тихого отката, которого ты избежал.
- Доказательство, что бэкенд версионируемый и залоченный (конфиг бэкенда плюс листинг версий объекта или запись лока) и что файл состояния не содержит секрета в открытом виде.
- Рефлексия в один абзац, связывающая упражнение обратно с модулем: как файл состояния выступал и источником истины, и опасностью в твоих прогонах.
- Добавь джоб обнаружения drift по расписанию (CI-cron с plan -refresh-only), который открывает алерт или PR, когда реальность расходится с декларацией, чтобы drift ревьюили до того, как любой apply тихо его разрешит.
- Вынеси стек в переиспользуемый module с входными переменными и инстанцируй его дважды (например staging и prod) из одного источника, доказав воспроизводимость между окружениями.
- Собери CI-пайплайн с concurrency group и -lock-timeout, чтобы пересекающиеся прогоны ждали, а не падали, затем симулируй упавший прогон, оставивший несвежий лок, и задокументируй безопасное восстановление force-unlock + повторный plan.
- Переведи один изменяемый ресурс на паттерн иммутабельной замены (новый образ / create_before_destroy) и покажи, как это сужает поверхность drift по сравнению с мутацией на месте.
Это цикл, который ты будешь прогонять на каждом реальном стеке IaC: положи состояние в версионируемый залоченный удалённый бэкенд раньше всего остального, докажи лок, попытавшись его сломать, относись к drift как к вопросу, на который отвечаешь через plan -refresh-only и осознанное решение оставить-или-откатить, а не слепой apply, и держи секреты полностью вне state. Сделав это раз на игрушечном стеке — включая намеренную поломку и восстановление с доказательствами — ты превращаешь продовую версию в мышечную память вместо сюрприза в 2 ночи.