Terraform для команд, которые всё ещё действуют вручную — с чего начать
Terraform лучше вводить по частям: начните с тех областей, которые часто меняются. Узнайте простой план развёртывания, распространённые ошибки и быстрый чеклист.

Почему подход «всё сразу» даёт сбой
Полный перепис в Terraform хорошо смотрится в плане, но в реальной команде это обычно тормозит всё движение.
Инфраструктура меняется быстрее, чем большинство команд это документируют. Кто‑то чинит проблему в проде через облачную консоль. Другой правит скрипт на ноутбуке. Третий меняет настройку во время ночного релиза и забывает предупредить. Через несколько дней живая система уже другая, а проект Terraform всё ещё описывает прошлый вторник.
Этот разрыв быстро становится дорогим. Terraform работает лучше, когда он может доверять текущему состоянию. Если ручные правки накапливаются в консолях, скриптах и экстренных фикcах, первый большой импорт превращается в хаос. Люди тратят часы на вопросы «почему Terraform хочет это заменить?» вместо того, чтобы выпускать фичи.
Главная ошибка — пытаться перевести всё в код одновременно. Команды тянут сети, базы, очереди, секреты, DNS, мониторинг и развёртывания приложений одним махом. Звучит эффективно, но надолго замораживает обычную работу. Продуктовые команды всё ещё должны выпускать релизы. Саппорт нуждается в быстрых фикcах. Инженеры начинают воспринимать Terraform как бюрократию, а не как помощь.
Доверие падает в тот момент, когда инструмент мешает ежедневной работе. Если простое изменение теперь требует долгого обзора плана, ремонта стейта или трёх человек на созвоне, команда возвращается к ручным правкам. Могут не говорить об этом прямо, но посыл ясен: Terraform мешает.
Это часто видно в стартапах и небольших продуктовых командах. Они живут скоростью, памятью и привычками. Это может быть грязно, но держит бизнес в движении. Принудительный развёртывание «всё сразу» убирает эту гибкость до того, как новый процесс доказал свою полезность.
Лучше начинать меньше и менее драматично. Выберите те части, которые часто меняются, часто ломаются или отнимают много времени при ручных операциях. Команды быстрее принимают Terraform, когда он убирает ту боль, которую они уже ощущают.
Что переводить в код в первую очередь
Начните с того, что команда меняет всё время. Если кто‑то каждую неделю правит одну и ту же security group, DNS‑запись, очередь, настройку БД или сервис приложения, это лучшее место для первой области, чем большая сеть, к которой никто не прикасался год.
Повторяемость — явный маркер. Когда люди делают одно и то же вручную снова и снова, они перестают внимательно смотреть на каждый экран. Одна пропущенная галочка может сломать деплой, заблокировать трафик или оставить staging отличным от production на несколько дней. Тут Terraform работает лучше всего, потому что убирает рутинную работу, которую людям не нравится делать.
Держите первую область достаточно маленькой, чтобы закончить за дни, а не месяцы. Выберите одно приложение, одну среду или один облачный аккаунт. Это даёт чёткую границу и упрощает ревью. Если что‑то пойдёт не так, влияние остаётся малым.
Хорошая первая партия обычно проста: настройки приложения, которые меняются при релизах; DNS‑записи для одного продукта; очереди или бакеты, связанные с одним приложением; правила доступа, которые команда постоянно воссоздаёт; или алерты для одной среды.
Пропустите старые системы, к которым обращаются только при сбое. У них часто годы скрытых допущений и нет явного владельца. Если начать с них, развёртывание превратится в проект по уборке, а такие проекты тянутся.
Ищите места, где ошибка быстро бьёт по пользователю. Staging часто разумный старт, потому что команды часто им пользуются и дрейф там заметен быстро. Production тоже подходит, если изменения узкие и понятные — фиксированный набор DNS‑записей или небольшая группа периодических задач.
Простой тест: спросите «если оставить это ручным ещё три месяца, что будет регулярно идти не так?» Начните с ответов. Если ответ «ничего, если только не сломается раз в год», — пока не трогайте.
Одна SaaS‑команда начала с перевода только инфраструктуры для одного пользовательского сервиса в одной среде. Общие сети и наследованные серверы оставили в покое. Через две недели подготовка к деплою стала быстрее, ревью — проще, и никто не гадал, какие настройки поменяли в прошлую пятницу.
Это достаточная первая победа. Когда одна чистая область под Terraform, следующая даётся легче: у команды уже есть шаблоны, правила именования и лучшее понимание того, что пока стоит оставить ручным.
Установите чёткую границу до начала работы
Команды застревают, когда изменения Terraform и ручные правки пересекаются без правил. Один человек меняет load balancer в облачной консоли, другой запускает apply, и теперь никто не доверяет результату.
Начните с одной «дольки» инфраструктуры и сделайте границу очевидной. Хорошие первые дольки — маленькие, часто изменяющиеся и с ограниченным риском. Staging, новый сервис или один DNS‑зон обычно лучше, чем весь production‑аккаунт.
Напишите границу простым языком до того, как писать код. Держите её короткой: новый инженер должен за минуту понять, где что меняется.
Простая заметка о границе
Ваша заметка может быть такой:
- Terraform создаёт и обновляет серверы staging‑приложения, security groups и DNS‑записи.
- Инженеры могут по‑прежнему вручную менять production‑секреты и экстренные правила фаервола.
- Один человек утверждает изменения для этой области и решает, что переводить в код следующим.
Этот владелец важнее, чем многие думают. Это не значит, что один человек делает всю работу. Это значит, что один человек быстро отвечает на раздражающие вопросы: «должно ли это жить в Terraform?», «можно ли сейчас запатчить вручную?», «кто чинит дрейф, если кто‑то изменил вручную?»
С первого дня используйте простые правила именования. Выберите один паттерн для папок, workspaces и файлов стейта и держитесь его. Окружаение плюс сервис обычно достаточно, например staging-api или prod-billing. Если имена требуют долгого объяснения, упростите их.
То же и для стейта. Одна граница — один state‑файл, если нет веской причины иначе. Смешение несвязанных ресурсов в одном стейте делает даже маленькие изменения рискованными и тормозит каждое ревью.
Terraform проще, когда первая граница достаточно мала, чтобы её быстро закрыть. Если первое развёртывание требует импортов из десяти старых систем, нескольких исключений и встречи перед каждым apply — сократите область вдвое. Закончив одну чистую область, команда узнает гораздо больше, чем при полупереводе всей компании.
Хорошая первая победа кажется почти скучной. Чаще всего это признак правильно выбранной границы.
Как перевести одну область в Terraform
Выберите зону, к которой люди часто прикасаются и у которой есть чёткий край. Маленькая сеть, одна среда приложения, DNS‑зона или группа облачных бакетов подойдёт. Если начать с половины стека компании, вы будете неделями спорить о краевых случаях вместо того, чтобы взять под контроль что‑то одно.
Сначала перечислите все ресурсы в этой области. Используйте облачную консоль, просмотры биллинга, теги и заметки команды. Цель проста: знать, что существует, что делает каждый ресурс, кто его использует и нужен ли он вообще.
Почистите очевидный беспорядок до написания большого объёма Terraform‑кода. Старые имена, тестовые копии и дубликаты превращают маленький перенос в сложный. Если два бакета делают одно и то же, выберите один и выведите другой из использования. Если имена случайные — переименуйте сейчас или задокументируйте соответствие, чтобы код оставался читаемым.
Импортировать или пересоздать
Для каждого ресурса нужно простое решение: импортировать его в стейт или восстановить из кода. Импорт лучше подходит для того, что должно оставаться живым — production база, load balancer или давняя DNS‑запись. Пересоздание имеет смысл для дешёвых, низкорискованных объектов, где чистый сброс экономит время.
Простое правило: импортируйте ресурсы, которые несут живой трафик или данные, которые трудно заменить. Пересоздавайте ресурсы, которые одноразовые и легко тестируются. Отложите сложные краевые случаи, если они блокируют остальной перенос.
До первого применения запускайте plan в ревью и давайте другому человеку посмотреть его. План должен показывать только ожидаемое. Если Terraform хочет заменить половину области — остановитесь и исправьте код, стейт или настройки ресурсов, прежде чем трогать прод.
Проводите первый живой apply в спокойное окно, не во время релиза, миграции или крупной продажи. Сразу следите за логами, health‑чеками и алертами. Небольшой дрейф проявляется быстро, когда имена, теги или зависимости не соответствуют ожиданиям Terraform.
Запишите шаги отката до первого apply. Держите их простыми и конкретными: какие настройки восстановите вручную, какие бэкапы проверены, кто утверждает откат и как вы подтвердите работоспособность сервиса. Этот документ часто экономит больше времени, чем сам Terraform‑код.
Как обращаться с ручными изменениями в ходе перехода
У большинства команд остаются единичные прямые правки во время миграции. Происходят инциденты, клиенту нужен быстрый фикс, или кто‑то обнаружил открытую security group в конце дня. Если притворяться, что никто не будет лезть в консоль, вы получите скрытый дрейф и споры позже.
Terraform остаётся управляемым только когда все знают, когда ручные правки допустимы. Устанавливайте это правило по каждой области, а не для всей компании сразу. Можно разрешить временные DNS‑правки на один спринт, а compute, networking и IAM требовать кода с первого дня.
Общий журнал важнее красивого workflow. Фиксируйте каждую ручную правку в одном месте, которое команда действительно проверяет: тикет‑борд или заметка в репозитории. Записывайте, кто сделал правку, что поменял, зачем и когда планируете вернуть это в Terraform.
Не позволяйте экстренным фикcам лежать вне кода днями. Если кто‑то увеличил хранилище БД, чтобы остановить аварию в полдень, он должен открыть Terraform‑изменение до конца дня или до следующего apply. Маленькие разрывы быстро превращаются в запутанные планы.
Простое операционное правило
- Разрешайте ручные изменения только в заранее названных областях.
- Записывайте каждую правку в общий журнал.
- Превращайте экстренные фиксы в Terraform‑код сразу.
- Проводите ревью дрейфа по расписанию, даже если кажется, что всё в порядке.
- Как только Terraform владеет областью, прекращайте правки в консоли для этого объёма.
Недельный короткий обзор дрейфа часто достаточен для многих небольших команд. Запускайте plan, сравнивайте с журналом изменений и исправляйте несоответствия, пока люди ещё помнят, что сделали.
Когда папка, модуль или сервис полностью под Terraform — закройте доступ к ручным правкам для этой области. Как правило, именно тогда ручные изменения перестают помогать и начинают тратить время.
Реалистичное первое развёртывание
Небольшому стартапу с одним продуктом, одной staging‑настройкой и одним production не нужен грандиозный Terraform‑проект. Ему нужна одна чистая первая победа.
Разумное развёртывание начинается в staging, где ошибка стоит дешевле. Команда выбирает части, к которым часто прикасаются: DNS‑записи, секреты приложений и очереди, которые поддерживают фоновые задачи. Эти элементы достаточно часто меняются, чтобы оправдать перевод в код, и достаточно просты, чтобы перенести их без недель подготовки.
Не стремитесь захватить каждое старое решение в Terraform. Существующие сетевые правила оставьте ручными, особенно если они нарастали годами и никто не хочет рисковать сюрпризным простоем. Это может казаться неряшливо, но лучше, чем тянуть хрупкую конфигурацию в код прежде, чем команда её поймёт.
Первый проход намеренно скучен. Команда пишет Terraform для staging‑DNS, хранит секреты в выбранной системе и определяет очереди с понятными именами и лимитами. Затем применяют, проверяют приложение и вносят пару мелких правок.
В следующие две недели они продолжают тот же паттерн. Если кто‑то нуждается в новой staging‑очереди или DNS‑изменении, он делает это через Terraform, а не кликая в консоли. Это короткое испытание важно: показывает, работает ли workflow при обычной нагрузке, а не только в тихой демо‑среде.
Когда staging стабилен пару недель, повторяют тот же шаг в production. Не переделывают всё заново: копируют структуру, меняют значения, внимательно ревьюят и держат объём узким. Именно тогда поэтапное внедрение Terraform начинает приносить пользу, а не оставаться теорией.
Некоторые вещи могут подождать. Редкие настройки биллинга, глобальные предпочтения аккаунта и странные админ‑страницы часто месяцами остаются нетронутыми. Переводить их в код с первого дня — лишняя работа без реальной пользы.
Такой подход прост, но работает. Команды, которые быстро действуют вручную, обычно нуждаются не в большой амбиции, а в повторении: переводите части, которые люди меняют каждую неделю, подтвердите процесс, затем расширяйте границы только когда команда доверит ему работу. Oleg Sotnikov часто использует такой же подход в инфраструктурной работе для небольших компаний: двигайте те части, которые люди меняют еженедельно, подтвердите процесс и затем расширяйте границы.
Ошибки, которые замедляют команды
Команды обычно не терпят неудачу потому, что Terraform сложен. Они терпят неудачу, потому что превращают маленькую миграцию в переписывание всей компании.
Самая частая ошибка — объём. Команда начинает с одной боли, например повторной настройки серверов, а затем решает смоделировать каждую сеть, базу, секрет и политику до первого полезного apply. Работа накапливается, ревью замедляется, и никто больше не доверяет выводу плана.
Ещё одна ошибка — смешивать уборку и миграцию. Если в облачном аккаунте есть старые имена, неиспользуемые security groups, странные теги и забытые тестовые ресурсы — исправляйте это отдельно. Не переписывайте историю и не переводите живые системы в Terraform одновременно. Это превращает каждое изменение в спор.
Пара простых правил предотвращает большую часть хаоса. Держите первое развёртывание узким и выбирайте место, которое часто меняется и больно при ручной работе. Решите, где будет храниться стейт, до того как люди начнут писать код — общий удалённый стейт лучше пяти локальных копий на ноутбуках. Установите правила именования рано. Если одна команда использует «prod-api», а другая «api-production», хаос проявится в каждом плане. Дайте каждой Terraform‑области явного владельца. И как только Terraform владеет ресурсом — перестаньте чинить его в консоли.
Правила про стейт и владение скучны, но экономят настоящее время. Если два инженера запускают изменения для одних и тех же ресурсов с разными файлами стейта, рано или поздно кто‑то случайно заменит что‑то. Это не проблема Terraform, это проблема правил команды.
Небольшой пример делает это очевидным. Представьте, команда переводит одно staging‑приложение в Terraform. Во вторник кто‑то изменил переменную окружения в облачной консоли, чтобы протестировать фикc. В четверг другой инженер запустил apply из кода, где старое значение. Приложение откатилось, баг вернулся, и начали винить инструмент.
Вот почему развёртывания тормозят. Terraform управляет только тем, что команда согласилась управлять в одном месте и с одним источником правды.
Быстрая проверка перед каждым apply
Быстрые команды попадают в беду, когда один apply тихо превращается в три изменения сразу. Прежде чем запускать что‑то, убедитесь, что apply охватывает одну понятную область и ничего лишнего. Если он трогает базу, DNS и load balancer сразу — разбейте изменения.
Граница важнее, чем многие думают. Малые apply‑ы проще ревьюить, проще объяснить и гораздо легче откатить, если что‑то пойдёт не так.
Короткий чеклист держит всех честными:
- Подтвердите, что изменение затрагивает только одну определённую область.
- Прочитайте план построчно вместе с другим человеком.
- Проверьте, что имена соответствуют тем, которыми команда пользуется в быту.
- Убедитесь, что шаги отката записаны и просты в исполнении.
- Спросите, не вносились ли ручные правки с момента последнего apply.
Ревью плана должно быть медленнее, чем кажется комфортным. Пробежка глазами — это то, как команды пропускают переименованный ресурс, принудительную замену или смену тега, который позже ломает скрипт. Внимательное пяти‑минутное ревью экономит гораздо больше времени.
Имена важны. Если в обычной работе серверы, бакеты или очереди имеют один паттерн именования, Terraform должен его использовать. Новый стиль имен может выглядеть чище на бумаге, но он сбивает людей во время инцидентов.
Откат должен быть скучным. Кто‑то из команды должен точно знать, что делать, если apply завершится наполовину. «Наверное, починим» — не план отката. «Вернуть эту переменную, запустить этот apply и восстановить эту настройку» — это план.
Ручные правки — последняя ловушка. В командах, которые ещё быстро действуют вручную, кто‑то часто меняет настройку в консоли и забывает это отметить. Затем Terraform планирует неожиданное изменение, потому что реальная система больше не совпадает с кодом. Спрашивайте о таких правках каждый раз, даже если это повторяется.
Один простой пример: если коллега ночью вручную поменял лимит автоскейлинга, отметьте это перед следующим apply. Иначе Terraform может вернуть старое значение и вызвать проблему.
Что делать дальше
Начните с одной области, которую можно закончить скоро. Одна служба, одна база или одна staging‑среда — достаточно. Поставьте дату окончания, даже если это 10 рабочих дней. Дедлайны заставляют выбирать, а первые работы с Terraform обычно останавливаются, потому что команда оставляет область открытой.
Держите первый проход простым. Не нужны идеальные модули, правила именования на все случаи жизни или большая уборка перед стартом. Нужна одна область, где команда сможет сказать «это теперь в Terraform» и иметь в виду это всерьёз.
До того, как больше людей начнёт трогать код, запишите простые правила владения. Коротко, чтобы люди прочитали: кто может менять код, кто утверждает apply‑ы, что пока остаётся ручным и что делать, если кто‑то сделал срочную ручную правку.
Эти правила экономят больше времени, чем хитрый код. Без них команда быстро вернётся к чатам, быстрым правкам в консоли и загадочным изменениям, которых никто не помнит через неделю.
После того как первая область стабилизируется, копируйте тот же шаблон на следующую. Не перерабатывайте процесс каждый раз. Выбирайте границу, переводите её, прогоняйте несколько циклов, правьте шероховатости и двигаетесь дальше. Повторение — вот что превращает инфраструктуру как код в обычное поведение команды, а не в побочный проект.
Держите ревью короткими. Хорошее ревью Terraform отвечает на простые вопросы: что меняется, кто за это отвечает и что может сломаться? Если ревью превращаются в долгие архитектурные споры, команда начнёт избегать Terraform.
Небольшой пример работает лучше. Если команда переводит одну очередь в Terraform в этом месяце и один кластер фоновых задач в следующем — это реальный прогресс. Две законченные области лучше, чем полуплан компании‑в‑целом.
Если вы не знаете, где провести первую границу, или хотите бережный разворот, который не замедлит доставку, Oleg Sotnikov на oleg.is предлагает услуги Fractional CTO и стартап‑консалтинг. Внешняя помощь полезна на раннем этапе, когда небольшое решение может сэкономить недели уборки позже.
Часто задаваемые вопросы
Почему плохая идея переводить всё в Terraform сразу?
Потому что масштабное переписывание тормозит повседневную работу и одновременно выявляет все скрытые ручные правки. Начните с одной небольшой области, которая часто меняется, подтвердите рабочий процесс, и лишь затем расширяйте границы.
Что нам стоит закодировать в первую очередь?
Выберите то, что команда меняет каждую неделю и что постоянно получается не так при ручных правках. DNS для одного продукта, одна среда приложения, очереди, бакеты или повторяющиеся правила доступа обычно лучше подходят для первого шага, чем старые общие сети.
Начинать в staging или production?
Начните в staging, если команда часто её использует и может пережить небольшую ошибку. Переносите в production только после того, как тот же подход поработает пару недель и объём изменений останется узким.
Насколько маленьким должен быть первый развёртывание?
Достаточно маленьким, чтобы завершить работу за дни, а не месяцы. Одна служба, одна среда или один облачный аккаунт дают чёткую границу и упрощают проверки и откат.
Нужно ли импортировать существующие ресурсы или пересоздавать их?
Импортируйте всё, что несёт живой трафик или содержит трудно восстанавливаемые данные — база данных в проде, долгоживущая DNS‑запись и т.п. Пересоздайте дешёвые и легко тестируемые ресурсы, где чистый сброс экономит время.
Как обрабатывать изменения в консоли во время миграции?
Разрешайте ручные правки только в заранее названных зонах и фиксируйте каждое изменение в одном общем журнале. Превратите каждое экстренное исправление в Terraform‑изменение как можно скорее, чтобы следующий план не удивил никого.
Кто должен владеть первой областью Terraform?
Назначьте одного человека владельцем первой области Terraform. Этот человек принимает решения о границах, отвечает, что пока остаётся ручным, и тормозит споры по ревью и дрейфу.
Что проверять перед запуском apply?
Читайте план построчно вместе с другим инженером, убедитесь, что apply затрагивает только одну определённую область, и запишите шаги отката. Также спросите, не вносились ли ручные изменения с момента последнего apply.
Что стоит пока не переводить в Terraform?
Оставьте на потом редкие, запутанные и наследованные системы. Если система меняется раз в год и никто в ней толком не разбирается, переводить её в код с самого начала — лишняя работа.
Когда переходить к следующей области?
Расширяйте границы только после того, как первая область стабильно работает в обычном режиме команды, а не только в тихом тесте. Когда люди перестанут тянуться в консоль, а код станет соответствовать реальности, повторите тот же подход для следующей области.