Terraform alerts

Terraform apply упал — push на телефон.

Ловите failed apply, drift в plan и сломанные Atlantis runs сразу. Без Telegram-бота, без Slack-шума, с зашифрованным сигналом.

Почему Terraform нужен отдельный алерт

terraform apply может упасть посередине и оставить инфраструктуру в частично измененном состоянии. В чате это легко пропустить. Nerve отправляет push сразу после non-zero exit code и не требует бота с доступом к истории.

Локальный wrapper

#!/bin/bash
set -euo pipefail
export NERVE_DSN="nerve://TOKEN:[email protected]"

cd /opt/infra/production

if terraform apply -auto-approve 2>&1 | tee /tmp/tf-output.log; then
  echo "Terraform OK: production" | nerve send
else
  echo "TERRAFORM FAILED: production on $(hostname)" | nerve send --severity critical
  tail -20 /tmp/tf-output.log | nerve send --severity alert
fi

GitHub Actions

- name: Terraform Apply
  id: apply
  run: terraform apply -auto-approve tfplan
  continue-on-error: true

- name: Notify on failure
  if: steps.apply.outcome == 'failure'
  env:
    NERVE_DSN: ${{ secrets.NERVE_DSN }}
  run: |
    echo "terraform apply FAILED: ${{ github.repository }} (${{ github.ref_name }})" \
      | nerve send --severity critical

GitLab CI

apply:
  stage: deploy
  script:
    - terraform apply -auto-approve tfplan
  after_script:
    - |
      if [ "$CI_JOB_STATUS" = "failed" ]; then
        echo "terraform apply FAILED: $CI_PROJECT_NAME / $CI_COMMIT_REF_NAME" \
          | nerve send --severity critical
      fi

Drift detection

terraform plan -detailed-exitcode возвращает 2, если есть изменения. Это хороший ночной check.

terraform plan -detailed-exitcode -out=tfplan 2>&1 | tee /tmp/tf-plan.log
EXIT=$?

if [ "$EXIT" -eq 2 ]; then
  echo "Terraform drift detected: production" | nerve send --severity alert
elif [ "$EXIT" -ne 0 ]; then
  tail -15 /tmp/tf-plan.log | nerve send --severity critical
fi

Что не отправлять

Не надоПолный plan, state, provider credentials, output с secrets.
НадоWorkspace, environment, exit code, короткая причина, ссылка на CI run.
NerveШифрует payload локально; sender DSN не читает историю и не выполняет команды.

FAQ

Как получить уведомление если terraform apply упал?

Проверьте exit code и при ошибке отправьте summary через nerve send. В CI храните NERVE_DSN как secret.

Это замена Telegram-боту для Terraform?

Для failed alerts — да. Telegram удобен для обсуждения, но ops-сигнал лучше отправлять отдельным encrypted pipe.