Когда инфраструктура — это продукт: управление IaC и обнаружение дрейфа
Представьте, что вы отвечаете за сотни или тысячи серверов, разбросанных по нескольким облачным провайдерам и регионам. Ваша компания может быть облачным провайдером, крупной e-commerce платформой или технологической компанией с инфраструктурой, развернутой одновременно в Сингапуре, Франкфурте и Вирджинии.
В такой среде инфраструктура — это не просто место, где работают приложения. Инфраструктура является продуктом. Каждое изменение конфигурации — добавление правила файрвола, изменение размера экземпляра базы данных, настройка параметров балансировщика нагрузки — может повлиять на десятки сервисов одновременно. Одна неправильная конфигурация ломает не одно приложение. Она ломает сотни сервисов, которые зависят от этой общей инфраструктуры.
Это совсем другой мир, чем развертывание одного веб-приложения. Ставки выше, радиус поражения шире, а допустимая погрешность стремится к нулю.
Проблема согласованности, ведущая к IaC
Когда инфраструктурой управляют вручную через SSH-сессии или облачные дашборды, несогласованность проникает быстро. Ваше staging-окружение имеет немного другие правила файрвола, чем production. Ваша production-установка в Азии отличается от европейской. Никто не может с уверенностью сказать, какая конфигурация на самом деле работает прямо сейчас.
Это тот момент, когда команды обращаются к Infrastructure as Code (IaC). Вы пишете всю конфигурацию инфраструктуры как код, храните ее в Git и применяете автоматически через пайплайны. Terraform, Pulumi, AWS CDK или CloudFormation становятся вашими основными инструментами. Каждый сервер, сетевое правило и бакет для хранения определены в системе контроля версий.
Но написание конфигурации как код — это только первый шаг. Как только ваша инфраструктура живет в коде, возникает новый вопрос: «Как мы можем быть уверены, что каждое изменение соответствует нашим политикам, прежде чем оно попадет в production?»
Управление IaC: автоматизированные политики, а не бюрократия
Управление (governance) звучит как слово, которое замедляет работу. На практике управление IaC — это полная противоположность. Это автоматизированные барьеры, которые проверяют каждое изменение до того, как оно попадет в production, без необходимости человеку читать каждую строку конфигурации.
Вот как это работает на практике. Ваша команда безопасности решает, что все бакеты для хранения должны быть зашифрованы. Ваша команда комплаенса требует, чтобы все экземпляры баз данных использовали определенный тип инстанса. Ваша сетевая команда требует, чтобы ни одно правило файрвола не открывало порт 22 или 3306 для публичного интернета.
Следующая диаграмма иллюстрирует автоматизированный пайплайн управления от коммита кода до развертывания и обнаружения дрейфа:
Эти правила записываются как автоматизированные политики, которые выполняются внутри вашего CI/CD пайплайна. Когда кто-то отправляет pull request с изменениями кода инфраструктуры, пайплайн не просто применяет изменение. Он сначала проверяет каждый ресурс на соответствие вашим политикам. Если изменение нарушает политику, пайплайн завершается ошибкой. Изменение никогда не попадает в production.
Например, вот простое правило Open Policy Agent (OPA), которое обеспечивает соблюдение стандарта тегирования, требуя, чтобы каждый ресурс имел тег cost-center:
package terraform
# Deny any resource that doesn't have a 'cost-center' tag
violation[msg] {
resource := input.resource_changes[_]
resource.type in ["aws_s3_bucket", "aws_instance", "aws_db_instance"]
not resource.change.after.tags.cost-center
msg := sprintf("%v %v is missing required tag 'cost-center'", [resource.type, resource.address])
}
Когда эта политика выполняется в вашем CI/CD пайплайне, любое изменение ресурса, в котором отсутствует требуемый тег, приведет к сбою пайплайна, предотвращая попадание неправильно настроенной инфраструктуры в production.
Это не про добавление шлюзов утверждения ради контроля. Это про выявление проблем до того, как они станут инцидентами. Неправильно настроенный бакет для хранения, доступный для чтения всем, не приводит к утечке данных. Слишком маленький экземпляр базы данных не вызывает сбой производительности. Политика ловит это в пайплайне, и команда исправляет это до того, как оно заработает.
Дрейф: когда реальность расходится с кодом
IaC дает вам единый источник истины для вашей инфраструктуры. Но эта истина сохраняется только в том случае, если то, что на самом деле работает, соответствует тому, что написано в вашем коде. На практике это соответствие нарушается постоянно.
Дрейф (drift) возникает, когда реальная конфигурация инфраструктуры отличается от того, что определено в вашем коде IaC. Кто-то входит в облачную панель управления во время инцидента и вручную меняет правило группы безопасности. Член команды добавляет слушатель балансировщика нагрузки напрямую через консоль, потому что это было нужно срочно. Автоматизированный процесс другой команды изменяет ресурс, не проходя через ваш пайплайн.
Дрейф опасен, потому что он делает ваш IaC ненадежным. Если ваш код говорит, что сервер имеет конфигурацию A, а реальность — конфигурацию B, то восстановление, масштабирование или создание нового окружения дадут неожиданные результаты. Вы не сможете пересобрать инфраструктуру из кода, если код не соответствует реальности.
Обнаружение дрейфа решает эту проблему, периодически сравнивая фактическое состояние вашей инфраструктуры с вашим кодом. Пайплайн выполняет те же команды, которые используются для применения инфраструктуры, но в режиме «plan» или «preview». Он ничего не меняет. Он просто сравнивает. Когда он находит различия, он сообщает о них.
Некоторые команды идут дальше. Когда дрейф обнаружен, пайплайн может автоматически привести инфраструктуру в соответствие с состоянием, определенным в коде. Другие предпочитают уведомлять ответственную команду и позволить ей решить, обновить код или принять дрейф как намеренный.
Обработка изменений с высоким риском
Некоторые изменения инфраструктуры несут больший риск, чем другие. Изменение конфигурации production-базы данных, модификация правила файрвола, влияющего на основной трафик, или изменение балансировщика нагрузки, обслуживающего миллионы запросов, — все это требует особой осторожности.
Для таких изменений вам нужно больше, чем автоматизированные политики. Вам нужны интегрированные процессы утверждения, которые происходят внутри пайплайна, а не вне его. Рабочий процесс выглядит так:
- Разработчик создает pull request с изменением инфраструктуры.
- Автоматизированные политики запускаются и проверяют нарушения.
- Если политики пройдены, пайплайн уведомляет соответствующих рецензентов — возможно, DBA для изменений базы данных или сетевого инженера для изменений файрвола.
- Рецензенты утверждают или запрашивают изменения непосредственно в pull request.
- Только после получения всех утверждений изменение применяется.
Ключевой момент в том, что утверждение не означает замедление. Это означает, что нужные люди проверяют нужные изменения в нужное время, имея весь контекст, доступный в пайплайне. Никакой беготни за людьми в чате. Никаких утверждений в последнюю минуту перед закрытием окна релиза.
Практический чек-лист для управления IaC
- Напишите автоматизированные политики для каждого правила безопасности и комплаенса, применимого к вашей инфраструктуре
- Запускайте проверки политик в вашем пайплайне перед применением любых изменений инфраструктуры
- Настройте обнаружение дрейфа для запуска по расписанию (ежедневно или еженедельно, в зависимости от вашей толерантности к риску)
- Решите, будете ли вы автоматически устранять дрейф или уведомлять команду
- Определите, какие изменения требуют дополнительного утверждения и кто является утверждающим
- Сделайте утверждение частью пайплайна, а не отдельным процессом вне его
Вывод
Когда инфраструктура является вашим продуктом, согласованность и контроль не являются опциональными. IaC дает вам основу, но управление и обнаружение дрейфа превращают эту основу в то, чему можно доверять. Автоматизированные политики выявляют проблемы до того, как они попадут в production. Обнаружение дрейфа сообщает вам, когда реальность разошлась с вашим кодом. А интегрированные утверждения гарантируют, что изменения с высоким риском получат должное внимание, не становясь узкими местами.
Цель — не замедлить изменения инфраструктуры. Цель — сделать их достаточно безопасными, чтобы вы могли двигаться быстро без страха.