Что такое Infrastructure as Code (и почему ручная настройка серверов не масштабируется)?
Любая инфраструктура начинается одинаково: кто-то заходит в облачную консоль, заполняет несколько форм и создаёт сервер. Всё работает. А через полгода этот сервер нужно пересоздать — после сбоя или чтобы поднять такую же тестовую среду, — и никто уже точно не помнит все настройки, выбранные в первый раз. Infrastructure as Code существует, чтобы такой сценарий стал невозможен.
Основная идея
Infrastructure as Code, или сокращённо IaC («инфраструктура как код»), означает, что ваши серверы, сети, базы данных и другие облачные ресурсы описываются в конфигурационных файлах, которые хранятся в системе контроля версий точно так же, как код приложения, а не настраиваются вручную через веб-консоль. Вместо того чтобы нажимать «Создать инстанс» и выбирать параметры в выпадающих списках, вы пишете файл с точным описанием того, что должно существовать, а инструмент читает этот файл и приводит реальную инфраструктуру в соответствие с ним.
Самый распространённый инструмент для этого — Terraform: он работает со всеми крупными облачными провайдерами по одному и тому же принципу. У каждого крупного облака есть и собственное решение (AWS CloudFormation, шаблоны Azure Resource Manager). Суть не зависит от инструмента: источник истины — файл, а не то состояние, которое в данный момент случайно сложилось в консоли.
Почему это важнее, чем кажется
- Воспроизводимость. Нужна идентичная тестовая среда или восстановить продакшен после аварии? Примените ту же конфигурацию ещё раз. Это не надежда на то, что вы вспомнили все настройки, — это гарантировано по определению.
- Код-ревью для изменений инфраструктуры. Изменение правила файрвола или размера базы данных превращается в pull request, который коллега проверяет до применения, как и любое изменение кода приложения, — вместо клика в консоли, которого больше никто не видел.
- Настоящий журнал аудита. Система контроля версий точно показывает, что изменилось, когда и кто это изменил. Вопрос «почему эта группа безопасности открыта всему интернету» решается через git blame, а не превращается в археологические раскопки.
- Обнаружение дрейфа конфигурации. IaC-инструменты умеют сравнивать конфигурационный файл с тем, что реально работает, и отмечать расхождения. Так выявляется ручное «быстрое исправление», которое кто-то внёс прямо в консоли и которое так и не попало обратно в файлы: иначе его молча перезапишут или, что хуже, расхождение будет незаметно нарастать.
С чего обычно начинают команды
Никто не описывает всю инфраструктуру в Terraform с первого дня, и это нормально. Распространённый и разумный путь — начать с того, что больно потерять или долго восстанавливать вручную: сетевой конфигурации, базы данных, основных вычислительных ресурсов, — и постепенно расширять охват по мере того, как появляются новые болевые точки. Цель — не буквально ноль ручных действий в консоли, а то, чтобы ресурсы, которые вы действительно не можете позволить себе потерять или которые нужно надёжно воспроизводить, были описаны в файле, а не существовали только в чьей-то памяти о том, что и где было нажато.
Ловушка, которой стоит остерегаться
Чаще всего внедрение IaC проваливается не из-за инструментов, а из-за частичного внедрения, которое незаметно разлагается. Команда пишет Terraform для первоначальной настройки, затем во время инцидента вносит срочные исправления прямо в консоли (что в моменте часто правильно) и так и не возвращается, чтобы отразить эти изменения в файлах. Через полгода файлы описывают инфраструктуру, которая уже не соответствует действительности, и никто им до конца не доверяет, — а это ровно та проблема, которую IaC и должен был решить. Долговечным этот подход делает только одно: правило «файлы описывают реальность» должно быть постоянным, а не благим пожеланием.
Такая организация инфраструктуры с самого начала — стандартная практика в нашей работе с облаком и DevOps в Burncode. Благодаря ей пересоздание окружения, его масштабирование или передача другому инженеру становятся рутинной и спокойной задачей, а не игрой в угадайку.