Короткий ответ
Drift — это расхождение между описанным в коде желаемым состоянием и фактическим состоянием инфраструктуры; он возникает, когда кто-то (человек или другой процесс) меняет ресурс напрямую — через консоль, CLI облака, автомасштабирование или другой инструмент — минуя Terraform/Ansible.
Как это работает подробнее
Terraform узнаёт о реальном состоянии только во время plan/apply (запрашивая его через API провайдера) — между запусками инфраструктура может измениться незаметно для инструмента; Ansible, в отличие от Terraform, обычно не хранит state и просто применяет задачи заново, поэтому drift там проявляется иначе — как "незапланированные" changed-задачи при следующем прогоне.
Пример кода
example.txt
# aws_security_group.app has changed outside of Terraform
~ resource "aws_security_group" "app" {
~ ingress = [
+ { from_port = 22, to_port = 22, cidr_blocks = ["0.0.0.0/0"] },
]
}Что использовать на практике
- Практика. типичные причины drift — инженер вручную поправил security group "на скорую руку" во время инцидента; автомасштабирование изменило количество инстансов; другой инструмент изменил тег ресурса; drift обнаруживают регулярным запуском
terraform plan(без apply) и сравнением вывода.
Подводные камни
- Ошибка. игнорировать непустой
terraform planв CI как "шум"; не фиксировать в процессе, что любое экстренное ручное изменение должно быть как можно скорее отражено в коде, из-за чего drift накапливается и со временем план становится нечитаемым.