Как автоматически ловить drift в Terraform

Ловим 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 помогает заметить расхождения до того, как они превратятся в проблему на проде.