Cómo hacer rollback automático de Terraform en CI/CD: paso a paso
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?