Предотвращение и устранение дрейфа инфраструктуры в Terraform для Azure
By Mirko Peters ·
Узнайте, как возникает дрейф инфраструктуры в Terraform и Azure, как экстренные исправления через портал ломают файлы состояния и как безопасно выявлять расхождения и устранять их.
Automatically translated with AI from the original post. Read the English original

Дрейф инфраструктуры — один из самых распространённых и опасных «тихих убийц» современных облачных сред. Когда инженеры вносят ручные изменения непосредственно в портале Azure во время аварийных ситуаций, их действия незаметно нарушают синхронизацию с репозиториями кода. В этом подробном руководстве рассматривается, как возникает дрейф, какие риски он несёт для файлов состояния и как systematically выявлять и устранять расхождения без простоев в производственной среде.
Главное
- Дрейф инфраструктуры возникает, когда ручные изменения в консоли облака расходятся с объявленным в Terraform кодом.
- Экстренные исправления, внесённые непосредственно в производственной среде, обходят систему контроля версий и создают скрытые сбои при последующих обычных запусках плана.
- Файлы состояния Terraform выступают в роли «памяти», сопоставляя написанную конфигурацию, предыдущее состояние и фактические облачные ресурсы.
- Раннее выявление дрейфа требует регулярных автоматических запусков плана и строгой политики против незадокументированных ручных изменений в портале.
- Устранение дрейфа требует решения: вернуть рабочую среду к коду или обновить конфигурацию в соответствии с реальностью.
Что такое дрейф инфраструктуры и почему он возникает?
Даже самые дисциплинированные команды облачной инфраструктуры рано или поздно сталкиваются с дрейфом инфраструктуры. Дрейф — это любое несанкционированное, незадокументированное или экстренное изменение облачных ресурсов, которое управляет состоянием вне ваших автоматизированных конвейеров. Представьте: ночью инженера вызывают на инцидент. Под давлением он заходит в консоль Azure, увеличивает лимит автомасштабирования с пяти экземпляров до десяти, решает проблему и возвращается ко сну.
Проблема в том, что файл конфигурации в репозитории по-прежнему говорит «пять». В реальной облачной среде — «десять». Поскольку никто не задокументировал изменение и не обновил код, между задуманной архитектурой и реальностью возникает серьёзный разрыв. Он остаётся незамеченным неделями, пока кто-то не запустит обычный план Terraform для совершенно другого обновления. Внезапно в выводе терминала появляется предупреждение: Terraform намерен вернуть количество экземпляров обратно к пяти.
Человеческий фактор и давление операционных задач
Дрейф редко бывает злонамеренным; почти всегда его порождает срочность операционных задач. Когда производственная среда выходит из строя, инстинкт подсказывает инженерам как можно быстрее остановить проблему любыми доступными инструментами. Настройка через портал Azure по принципу «указал и щёлкнул» быстра, наглядна и мгновенна. Однако каждый раз, когда инженер использует портал для исправления проблемы, не отражая это в коде, он создаёт технический долг, который потом придётся выплачивать с процентами.
Как состояние Terraform выявляет расхождения
Чтобы понять, как Terraform обнаруживает дрейф, нужно внимательно разобраться в его механизме памяти — файле состояния. Файл состояния Terraform служит главным источником истины, сопоставляя облачные ресурсы с конфигурационными файлами. Когда вы выполняете команду, Terraform не просто слепо отправляет файлы в облако. Вместо этого он выполняет трёхстороннее сравнение.
Во-первых, он читает то, что вы написали в конфигурационных файлах. Во-вторых, он проверяет, что было записано в файл состояния во время последнего успешного применения. В-третьих, он обращается к API облачного провайдера через плагины и проверяет, что на самом деле существует в вашей подписке прямо сейчас. Когда эти три источника не совпадают, Terraform понимает, что реальность незаметно изменилась.
Опасность игнорируемых предупреждений
Во время выполнения plan Terraform формирует подробный вывод с перечнем добавлений, изменений и удалений. При наличии дрейфа вы часто увидите предупреждения о том, что ресурс нужно изменить или даже полностью пересоздать. Новички нередко паникуют, увидев предупреждения о принудительной замене ресурсов. Это предупреждение не является ошибкой — это сигнал Terraform о том, что реальный ресурс настолько изменился, что узнать его уже нельзя, и чтобы вернуть его в соответствие с кодом, его нужно удалить и создать заново.
Лучшие практики выявления и предотвращения дрейфа
Предотвращение дрейфа требует сочетания организационных ограничений и автоматизированных технических средств контроля. Если полагаться только на ручные проверки, рано или поздно вы неизбежно столкнётесь с болезненными сбоями в продуктивной среде. Вот базовые стратегии, которые команды используют, чтобы их облачные среды оставались согласованными:
- Ограничьте доступ только на чтение: Уберите права на запись в продуктивную среду у пользователей. Все изменения инфраструктуры должны проходить через ваши конвейеры CI/CD и проверку запросов на слияние.
- Настройте регулярные автоматические запуски plan: Настройте конвейеры непрерывной интеграции для регулярного выполнения команды «terraform plan» без её применения. Проверяйте вывод на наличие неожиданных изменений.
- Разбивайте монолитные файлы состояния: Делите большие среды на более мелкие модульные компоненты. Небольшие файлы состояния упрощают выявление, проверку и устранение дрейфа.
- Внедрите блокировку удалённого состояния: Убедитесь, что ваша команда использует безопасные удалённые бэкенды с блокировкой состояния, чтобы параллельные запуски не повредили записи о состоянии.
Как устранять дрейф, когда он обнаружен
Когда вы обнаруживаете, что реальная инфраструктура отклонилась от конфигурации, перед вами стратегическая развилка. Есть два основных пути устранения:
Первый вариант — позволить Terraform перезаписать действующую среду. Выполнив стандартную команду «terraform apply», вы заставите Azure вернуться к состоянию, описанному в вашем коде. Этот путь правилен, когда дрейф вызван несанкционированным ручным изменением или временной отладочной настройкой, которая больше не должна существовать.
Второй вариант — обновить конфигурацию Terraform, чтобы она соответствовала реальности. Выбирайте этот путь, когда ручное экстренное исправление, выполненное во время инцидента, оказалось необходимым, стабильным и полезным для продуктивной среды. Обновив код так, чтобы он отражал новую реальность, вы закрываете расхождение и гарантируете, что будущие автоматические запуски сохранят нужную конфигурацию.
Заключение
Дрейф инфраструктуры — неизбежная проблема в динамичных облачных средах, но он не обязан стать катастрофой для команды. Понимая, как файл состояния Terraform отслеживает изменения, внедряя строгие механизмы контроля доступа и рассматривая выявление дрейфа как регулярную операционную практику, вы сможете полностью контролировать облачную архитектуру. Чтобы подробнее разобрать основы инфраструктуры как кода, провайдеров и управления состоянием, послушайте полный выпуск и узнайте экспертные советы, которые помогут вывести вашу автоматизацию облачной инфраструктуры на новый уровень.
Часто задаваемые вопросы
Что вызывает дрейф инфраструктуры в Terraform?
Дрейф возникает из-за внеполосных изменений, внесённых непосредственно в облачные ресурсы через портал, команды CLI или скрипты, которые обходят конвейер Terraform.
Как Terraform обнаруживает дрейф конфигурации во время выполнения plan?
Terraform сравнивает сохранённые данные файла состояния с фактическими облачными ресурсами через API провайдеров и с вашими локальными файлами конфигурации.
Что произойдёт, если кто-то вручную изменит ресурс Azure, которым управляет Terraform?
При следующем запуске plan Terraform отметит расхождение и попытается вернуть ресурс к состоянию, описанному в вашем коде, если только конфигурация не будет обновлена.
Стоит ли мне обновить код Terraform или откатить изменение, внесённое на портале Azure?
Если ручное изменение было экстренным хотфиксом, который теперь необходим для стабильности, обновите конфигурацию Terraform. Если же это было несанкционированное или случайное изменение, позвольте Terraform откатить его.