(+351) 21 24 10006  ·  info@bconcepts.pt
Carnaxide, Lisboa

Cómo hacer rollback automático de Terraform en CI/CD: paso a paso

João Barros 27 de September de 2026 4 min de lectura

Este tutorial explica cómo implementar un rollback automático para despliegues realizados con Terraform en pipelines CI/CD, útil para proteger la infraestructura cuando las verificaciones post-deploy fallan. Aprenderá por qué hacer rollback y cómo automatizar la reversión usando GitHub Actions y estado remoto (remote state).

Prerequisitos

  • Cuenta Azure y una storage account con un contenedor para el backend de Terraform (u otro backend remoto soportado).
  • Repositorio GitHub con código Terraform sencillo (providers y un recurso mínimo).
  • GitHub Actions activado y un secret con credenciales para acceder al backend (ej.: AZURE_CREDENTIALS).
  • Conocimientos básicos de Terraform (init, plan, apply) y YAML para Actions.

Paso 1: entender la estrategia de rollback

Por qué: Terraform mantiene state que representa el estado real de los recursos. Un rollback automático puede revertir cambios aplicados si verificaciones externas fallan (tests, smoke tests). La estrategia aquí es: tomar un snapshot del state antes del apply, aplicar, ejecutar verificaciones; si hay fallo, restaurar el snapshot como state y re-aplicar para revertir.

Paso 2: crear snapshot del state antes del apply

Explicación: vamos a copiar el archivo de state remoto a un archivo con timestamp en el backend (o exportarlo localmente). En el ejemplo usamos la Azure CLI para copiar el blob que contiene el state.

# exemplo: guardar snapshot do state em Azure Blob
az storage blob download --container-name tfstate --name prod.terraform.tfstate \
  --file /tmp/prod.terraform.tfstate --account-name mystorageaccount

Paso 3: aplicar Terraform en el pipeline (plan + apply)

Explicación: ejecutar terraform init, terraform plan y terraform apply automatizado. El apply crea los cambios que podrían necesitar rollback.

terraform init -backend-config="storage_account_name=mystorageaccount"
terraform plan -out=plan.tfplan
terraform apply -input=false plan.tfplan

Paso 4: ejecutar verificaciones post-deploy

Explicación: aquí ejecutamos smoke tests, comprobaciones de endpoints, integraciones o tests de políticas. Si estas verificaciones fallan, activamos el rollback.

# Exemplo simples de verificação: HTTP 200 numa API
status=$(curl -s -o /dev/null -w "%{http_code}" https://api.exemplo.local/health)
if [ "$status" -ne 200 ]; then
  exit 1
fi

Paso 5: restaurar el state para rollback

Explicación: si las verificaciones detectan fallo, restauramos el state desde el snapshot guardado y re-aplicamos para que Terraform reconcilie y elimine los cambios no deseados. En el backend Azure Blob, subir el archivo snapshot para sustituir el state actual.

# Substituir o state remoto pelo snapshot
az storage blob upload --container-name tfstate --name prod.terraform.tfstate \
  --file /tmp/prod.terraform.tfstate --account-name mystorageaccount --overwrite

# Re-aplicar para reconciliar la reversión
terraform init -backend-config="storage_account_name=mystorageaccount"
terraform apply -auto-approve

Paso 6: integrar todo en una GitHub Actions

Explicación: crear un workflow que encadena los pasos: snapshot -> apply -> verificaciones -> (rollback si es necesario). Indicamos un ejemplo mínimo de job que usa az cli y terraform.

name: terraform-deploy-with-rollback
on: [push]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Azure Login
        uses: azure/login@v1
        with:
          creds: ${{ secrets.AZURE_CREDENTIALS }}
      - name: Download state snapshot
        run: az storage blob download --container-name tfstate --name prod.terraform.tfstate \
              --file /tmp/prod.terraform.tfstate --account-name mystorageaccount
      - name: Terraform Init
        run: terraform init -backend-config="storage_account_name=mystorageaccount"
      - name: Terraform Plan
        run: terraform plan -out=plan.tfplan
      - name: Terraform Apply
        run: terraform apply -input=false plan.tfplan
      - name: Run smoke tests
        run: |
          status=$(curl -s -o /dev/null -w "%{http_code}" https://api.exemplo.local/health)
          if [ "$status" -ne 200 ]; then
            echo "Smoke tests fallaron, iniciando rollback"
            az storage blob upload --container-name tfstate --name prod.terraform.tfstate \
              --file /tmp/prod.terraform.tfstate --account-name mystorageaccount --overwrite
            terraform apply -auto-approve
            exit 1
          fi

Verificar el resultado

Cómo confirmarlo: tras ejecutar el workflow, revise los logs del job en GitHub Actions. Si las verificaciones pasan, la infraestructura debe reflejar el nuevo estado. Si hay fallo, confirme que el blob del Terraform state fue restaurado y que los recursos fueron revertidos. Use la Azure CLI para listar recursos y comparar con el estado esperado.

Conclusión

Implementar rollback automático con Terraform y GitHub Actions aumenta la resiliencia del despliegue: guarda un snapshot del state, aplica cambios y revierte automáticamente si las verificaciones fallan. Próximos pasos: añadir bloqueos (state locking), cifrar snapshots y probar el rollback en entornos de staging. Consejo: empiece con un recurso sencillo y valide el proceso antes de aplicarlo en producción — ¿qué test automatizado lo dejaría más confiado?