Ловим drift в Terraform автоматически
Кто-то вручную поправил инфраструктуру через консоль. Terraform об этом ничего не знает. При следующем terraform apply начинаются конфликты, откаты и поиски причины. Это и называют drift. Состояние инфраструктуры перестает совпадать с тем, что описано в коде.
Сам Terraform drift не отслеживает. Но у него есть инструмент, который помогает это проверять.
Как обнаружить drift
У terraform plan есть флаг -detailed-exitcode. Он возвращает разные коды выхода в зависимости от результата.
terraform plan -detailed-exitcodeКод 0 означает, что изменений нет. Код 1 сообщает об ошибке. А вот код 2 говорит о том, что план нашел расхождения между стейтом и реальной инфраструктурой. Именно код 2 и служит признаком drift.
Проверять это вручную каждый раз неудобно. Надежнее встроить проверку в CI. Например, в GitHub Actions это можно сделать так:
name: Drift Detection
on:
schedule:
- cron: '0 9 * * 1'
jobs:
detect-drift:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: hashicorp/setup-terraform@v3
- run: terraform init
- run: terraform plan -detailed-exitcode
continue-on-error: true
id: plan
- run: echo "Drift detected!"
if: steps.plan.outcome == 'failure' && steps.plan.outputs.exitcode == '2'Такой workflow запускается раз в неделю по понедельникам. Если plan возвращает код 2, значит, кто-то менял инфраструктуру в обход Terraform. Аналогичную логику можно настроить и в Jenkins через проверку $? после выполнения команды.
Drift особенно вероятен в командах, где инфраструктурой занимается больше одного человека. Регулярная автоматическая проверка через CI помогает заметить расхождения до того, как они превратятся в проблему на проде.