Дрейф в Terraform: плохой, уродливый и Черный Лебедь
"Дрейф в Terraform" - это хорошо известная проблема. Он возникает, когда изменения происходят с ресурсами вашей облачной среды, которые не были вызваны изменениями в Terraform, и приводит к различиям между тем, что фактически настроено в вашем облаке, и тем, что объявлено в вашем коде Terraform. Другими словами, ваше облако "отклонилось" от вашего Terraform. Эти различия могут возникнуть через следующие каналы:
- Инженеры вручную вносят изменения в ресурсы через веб-приложение поставщика облачных услуг. Иногда это называется "ClickOps" в шутку.
- Инженеры вносят изменения с помощью команд CLI, таких как инструмент gcloud от Google или AWS CLI.
- Логика приложения или системы развертывания создает или изменяет ресурсы вне рабочего процесса Terraform. Смотрите в сторону boto3 или других SDK облачных служб.
Эти источники дрейфа чаще всего присутствуют в организациях, которые двигаются очень быстро, имеют команду инженеров, привыкших к управлению инфраструктурой вне Terraform, или и то, и другое.
Теперь, когда мы понимаем, что такое дрейф в Terraform и как он возникает, почему это вообще должно нас волновать?
Дрейф в Terraform: Плохой
Вероятность того, что инфраструктура, определенная с помощью Terraform, просмотренная другими членами команды и затем развернутая, имеет очень конкретные характеристики, очень высока. Размер экземпляра EC2, диапазон CIDR-блока подсети и права доступа к бакету S3 были выбраны по какой-то причине.
Когда возникает дрейф, это означает, что существует недокументированное различие между этой описанной инфраструктурой и тем, что происходит в облаке. Это, в свою очередь, может привести к ухудшению работы приложения, излишним расходам или рискам в области безопасности и соответствия требованиям вашей организации. Как результат, при выявлении дрейфа, часто во время выполнения terraform plan, требуется ручная работа для выяснения и устранения дрейфа с целью смягчения потенциальных долгосрочных рисков. Эта ручная работа отнимает время и ресурсы, несет вред и считается "плохой".
Дрейф в Terraform: Уродливый
Как мы отметили выше, для большинства команд дрейф обнаруживается при выполнении terraform plan. Обычно инженеры не запускают произвольно Terraform (по нашим данным!). Фактически, они часто вызывают его исключительно при попытке развернуть новую функциональность или исправить ошибки. Это означает, что:
- незамеченый дрейф может оставаться и вызывать проблемы в вашей инфраструктуре на протяжении довольно продолжительного времени до его обнаружения;
- когда он обнаруживается во время запуска Terraform, посреди развертывания, это крайне дорогостоящий момент, когда ваши инженеры отвлекаются на ручную работу.
Это "уродливо".
Дрейф в Terraform: Черный Лебедь
Недетектированные изменения и выделение ресурсов вне рабочего процесса Terraform могут привести к событиям "Черного Лебедя", именно поэтому многие инженеры вынуждены исправлять "плохие" и "уродливые" затраты, чтобы предотвратить дрейф до того, как он станет проблемой. Например:
- Изменение ресурса может привести к простою приложения (например, уменьшение размера базы данных, после чего она должна буть пересоздана) или огромному счету (по какой-то причине в нашем кластере GKE было выделено 1500 узлов, а не 150).
- Конфигурации, оптимизированные с точки зрения безопасности, становятся менее строгими, и происходит утечка данных или взлом.
- Возможно, взлом не произойдет, но при аудите вашей организации для сертификации соответствия критическим бизнес-требованиям вы проваливаете аудит из-за уязвимой инфраструктуры.
Самое сложное во всей этой ситуации то, что все вышеперечисленное может произойти, когда ресурсы облака создаются вне контроля Terraform. Обнаружить эти ресурсы гораздо сложнее (они не отобразятся в вашем terraform plan), и требуется гораздо больше усилий, чтобы выявить и затем добавить эти ресурсы в управление Terraform.