Настройка Terragrunt для управления Terraform-конфигурациями

Окружения растут, и ручные правки конфигураций превращаются в постоянный источник ошибок. Мы настраиваем Terragrunt под ключ: единый слой описания инфраструктуры, повторяемые окружения и предсказуемые развёртывания. Передаём команде готовую схему, регламенты и сопровождение.
Часто задаваемые вопросы

Почему ручные Terragrunt-настройки разъезжаются при росте окружений

Пока окружений два, terragrunt конфигурации держат копированием каталога. dev, stage и prod отличаются парой значений в переменных, а каждое новое окружение — копия предыдущего вместе с чужими настройками: адресом кластера, размером пула, политикой резервных копий. Через несколько релизов уже никто не помнит, почему в stage включён другой набор ресурсов, а в prod остался параметр из прошлого запуска.

Дальше начинается дрейф конфигурации инфраструктуры. Один сервис подключает модуль из актуальной ветки, другой закреплён на прежней, третий описывает ресурсы прямо внутри окружения и живёт отдельно от общего модуля. Правка в общем коде доезжает до части сервисов, и расхождение обнаруживается уже в облаке, а не на ревью.

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

Корень не в самих файлах, а в управлении конфигурациями вручную: нет единого источника правды для параметров, нет общей версии модулей на все среды, нет проверки, которая поймает расхождение до применения. Разбираем, как это закрывается.

Что даёт единый слой описания инфраструктуры: меньше ручных правок

Terragrunt здесь не самоцель, а способ держать единый слой описания инфраструктуры: тестовый, предпродуктивный и продуктивный контуры собираются из одних модулей, а различия вынесены в параметры. Ниже — эффекты, которые видно по метрикам, а не по ощущениям.

Скорость поднятия окружения и восстановления

  • Новый стенд под тест или нагрузочную проверку собирается из тех же модулей: время развёртывания окружения измеряется десятками минут вместо дней переписки и ручных шагов.
  • Восстановление после сбоя — повторный запуск того же описания: стенд возвращается в известное состояние, а не «как получилось».
  • Окружение снимается одной командой, поэтому временные стенды не живут месяцами и не копят расхождения с репозиторием.

Предсказуемость изменений и откат

  • План изменений заранее показывает, что будет создано, изменено и удалено, поэтому снижение ручных правок видно по числу операций вне репозитория.
  • Откат изменений инфраструктуры — возврат к предыдущему описанию: состояние приводится к нему тем же планом, без разбора ручных действий «по памяти».
  • Повторяемость окружений держится на общих модулях: расхождения ловятся на этапе плана, а не в продуктивном контуре.

«Раньше стенд под нагрузочный тест поднимали два дня и половину правили руками — теперь это одна команда, и он повторяет продуктив один в один», — говорит наш инженер.

Terragrunt, рабочие пространства или модули: выбор для окружений

Когда конфигураций Terraform становится больше одной, появляется развилка: держать окружения в рабочих пространствах одного каталога, разводить их по каталогам с модулями или ставить сверху Terragrunt. От схемы организации конфигураций зависит, сколько стоит добавить новое окружение и как быстро разработка и продуктив начинают расходиться.

Вариант Когда подходит Ограничения
Рабочие пространства Набор ресурсов один, окружения отличаются размерами и адресами Общий файл состояния и провайдер: ошибка в разработке задевает продуктив
Каталоги и модули без обёртки Состав ресурсов на окружение разный, сервисов немного Бэкенды и переменные копируются вручную, каждый сервис — новый набор файлов
Terragrunt Окружений и сервисов много, отличаются состав и параметры Лишний слой абстракции: наследование и пути надо понимать, иначе ошибки в зависимостях

Ограничения каждого варианта

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

Как выбирать при росте числа сервисов

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

Этапы внедрения: аудит, схема, настройка, проверка, передача

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

Аудит и инвентаризация

  1. Аудит инфраструктурных конфигураций: собираем репозитории и файлы состояния, находим дубли описаний ресурсов, ручные правки в консоли провайдера и расхождения между окружениями.
  2. Проектирование структуры окружений: общий корневой файл с настройками хранилища состояния и провайдеров, отдельные каталоги под dev/stage/prod, переиспользуемые модули вместо копий.
  3. План перевода окружений: порядок миграции, перенос состояния без пересоздания живых ресурсов, точка отката на каждом шаге.

Проверка перед продуктивом

  • Проверка инфраструктурных изменений: план в конвейере до применения, ревью вторым инженером, проверка формата и правил, запрет разрушающих операций без подтверждения.
  • Прогон на копии продуктивного контура: окружение поднимается из снимка, план применяется, повторный план должен быть пустым, откат проверяется отдельно.
  • Передача инфраструктуры команде: документация, регламент изменений, шаблон нового окружения, обучение инженеров и разграничение доступов.

После этого новый контур поднимается копированием каталога окружения и правкой переменных — без переписывания конфигураций и без ручных действий в консоли.

Что остаётся в репозитории: модули, каталоги, политики, регламенты

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

Состав репозитория

  • Иерархия каталогов: окружение → регион → сервис. Новая площадка добавляется копированием уровня, модули править не нужно.
  • Переиспользуемые модули с фиксированными версиями: сеть, кластеры, базы, балансировщики. Обновление — через смену версии, а не правку на живом контуре.
  • Конфигурации Terragrunt: значения окружений вынесены в отдельные файлы, общая логика наследуется — расхождение между стендами видно при сравнении версий.
  • Удалённое хранение состояния с блокировкой: параллельный запуск двух инженеров не портит состояние, история изменений доступна по каждому ресурсу.
  • Разграничение доступа: чтение, предварительный просмотр и применение разделены; права на продуктивном контуре уже, чем на тестовом.
  • Политики проверок до применения: запрет открытых портов, защита от удаления критичных ресурсов, обязательные метки владельца.

Документация и регламент изменений

  • Регламент изменений: любое изменение проходит предварительный просмотр и проверку вторым инженером, применение — из общей ветки, а не с рабочей машины.
  • Инструкция дежурной смене: как откатить релиз, где смотреть состояние, к кому идти при инциденте.
  • Матрица доступов и карта репозитория на одной странице — новый инженер выходит в работу без устных пересказов.

Кейс: как развёртывание окружения перестало быть ручной работой

Заказчик — продуктовая команда, которая вела три окружения в одном облаке. Инфраструктура частично жила в конфигурациях, частично поднималась руками из консоли: воспроизвести стенд с нуля по репозиторию было невозможно.

Что было до

Развёртывание нового окружения занимало два дня и около 40 ручных шагов на двух инженеров. Каждый третий запуск заканчивался откатом — расхождения в именах и параметрах ресурсов всплывали только на этапе применения. Разбор одного такого сбоя занимал до четырёх часов ручного сравнения.

Что стало после

Мы разложили конфигурации на переиспользуемые модули и отдельные слои окружений, оставив в них только различия: размеры, зоны, переменные. Обёртку над конфигурациями — Terragrunt — настроили так, чтобы параметры подставлялись из одного места, а состояние каждого слоя хранилось отдельно.

Окружение поднимается одной командой за 20–25 минут, ручных шагов осталось три. Доля откатов снизилась с одной трети запусков до одного случая на двадцать, а возврат к предыдущему состоянию занимает минуты.

«Новый стенд под клиента мы собирали вдвоём и сдвигали сроки. Теперь его поднимает один инженер до обеда, и откатов из-за расхождений конфигураций у нас больше не было.» — технический директор заказчика

Чем Terragrunt отличается от рабочих пространств и когда он лишний

Рабочие пространства Terraform — это изолированные состояния внутри одной конфигурации. Один и тот же код разворачивается в dev, stage и prod, отличается только имя пространства, а переменные подставляются через файлы значений. Схема работает, пока окружения расходятся лишь параметрами: размером узлов, числом реплик, тегами.

Как только расходятся структура и адрес состояния, начинаются обходные пути. У рабочих пространств один backend на всю конфигурацию, поэтому хранилище состояния и провайдеры не задать по-разному для разных сред. Порядок применения модулей выстраивается вручную, а копипаст блока module с новыми путями становится главным источником расхождений между стендами.

Terragrunt — надстройка над Terraform, которая снимает эту ручную работу: генерирует блоки backend и provider перед запуском, держит состояние отдельно для каждого окружения, описывает зависимости между модулями и применяет их в правильном порядке. Цена — дополнительный слой: команда должна разобраться в языке шаблонов, а обновления версий идут по двум цепочкам сразу.

Граница применимости формулируется коротко. «Надстройка оправдана, когда окружения отличаются структурой и адресом состояния, а модулей больше десятка. Если стек один и всё помещается в пару модулей — это лишний слой, который придётся обслуживать», — говорит один из наших инженеров.

Практический критерий простой. Совпадает структура, различаются только переменные и масштаб — хватает встроенных рабочих пространств. Расходятся backend, состав модулей, версии провайдеров или нужен строгий порядок применения между слоями — встроенных средств уже мало, и надстройка окупает себя.

Сомнения по хранению состояния и доступам: разбираем по пунктам

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

Два инженера запустят изменения одновременно — состояние не сломается?

Состояние лежит в удалённом хранилище, блокировка берётся автоматически: второй запуск встаёт в ожидание или завершается ошибкой, а не пишет поверх. В Terragrunt состояние разложено по модулям, поэтому блокировка работает на уровне конкретного модуля, а не всей инфраструктуры — команды не блокируют друг друга на пустом месте.

Как разделить права доступа между командами?

Права раздаются ролями в облаке и путями в хранилище: команда пишет только в свои модули и окружения, чужое читает без возможности изменить. Секреты не попадают в репозиторий — подставляются из хранилища секретов на этапе запуска.

Что делать, если изменение нужно откатить?

Состояние версионируется, поэтому доступна предыдущая ревизия. Откат — это возврат конфигурации и построение плана: видно, какие ресурсы будут пересозданы, а какие изменены; перед применением план уходит на согласование.

Можно ли внедрять постепенно, не останавливая текущие процессы?

Да. Начинаем с одного контура рядом с существующей схемой, сверяем план с фактическим состоянием и убеждаемся, что расхождений нет. Только после этого переводим следующий контур — остальные процессы в это время работают как раньше.

Обсудим вашу схему окружений и вернёмся с оценкой и планом

Чтобы оценка внедрения была предметной, а не «на глазок», достаточно прислать то, что уже есть в репозиториях и в головах у команды: так видно, где конфигурации дублируются между средами, а где отличие действительно оправдано. Terragrunt в первую очередь убирает копипасту и разъезд параметров, поэтому без схемы окружений любая оценка будет приблизительной.

  • Схема окружений: сколько сред, чем они отличаются, что обязано оставаться общим — регионы, размеры, набор сервисов.
  • Текущие конфигурации Terraform: структура каталогов, где хранится состояние, как подключены провайдеры и модули.
  • Работа с секретами: что лежит открыто, где хранится, что должно подставляться на этапе применения.
  • Требования к доступам: кому нужен доступ к продуктивной среде, кто его выдаёт, как ведётся журнал изменений.
  • Правила версионирования модулей и провайдеров: фиксируются ли версии, как проходит обновление и откат.
  • Порядок выпуска: конвейер сборки, ручные шаги, окна изменений, кто подтверждает применение.
  • Ожидаемый результат: какие части должны стать воспроизводимыми, а что останется ручным исключением.

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

Опишите задачу в свободной форме и приложите то, что есть: вернёмся с оценкой, планом и границами работ.

Наши компетенции:

Последние работы

  • Разработка сайта компании B2B ADVANCE
    Разработка сайта компании B2B ADVANCE
    1542
  • Разработка веб-приложения для компании FEEDME
    Разработка веб-приложения для компании FEEDME
    1394
  • Разработка веб-сайта для компании БЕЛФИНГРУПП
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1081
  • Разработка интернет магазина для компании FURNORO
    Разработка интернет магазина для компании FURNORO
    1369
  • Разработка логотипа компании B2B Advance
    Разработка логотипа компании B2B Advance
    816
  • Разработка веб-приложения для компании Enviok
    Разработка веб-приложения для компании Enviok
    1142