Como fazer rollback automático de Terraform em CI/CD: passo a passo
Este tutorial explica como implementar um rollback automático para deployments feitos com Terraform em pipelines CI/CD, útil para proteger a infraestrutura quando verificações pós-deploy falham. Aprenderá por que fazer rollback e como automatizar a reversão usando GitHub Actions e estado remoto (remote state).
Pré-requisitos
- Conta Azure e uma storage account com um contentor para o backend do Terraform (ou outro backend remoto suportado).
- Repositório GitHub com código Terraform simples (providers e um recurso mínimo).
- GitHub Actions ativado e um secret com credenciais para aceder ao backend (ex.: AZURE_CREDENTIALS).
- Conhecimentos básicos de Terraform (init, plan, apply) e YAML para Actions.
Passo 1: perceber a estratégia de rollback
Porquê: o Terraform mantém state que representa o estado real dos recursos. Um rollback automático pode reverter alterações aplicadas se verificações externas falharem (testes, smoke tests). A estratégia aqui é: fazer um snapshot do state antes do apply, aplicar, executar verificações; se houver falha, restaurar o snapshot como state e re-aplicar para reverter.
Passo 2: criar snapshot do state antes do apply
Explicação: vamos copiar o ficheiro de state remoto para um ficheiro com timestamp no backend (ou exportar localmente). No exemplo usamos a Azure CLI para copiar o blob que contém o 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
Passo 3: aplicar Terraform no pipeline (plan + apply)
Explicação: executar terraform init, terraform plan e terraform apply automatizado. O apply cria as alterações que poderão necessitar de rollback.
terraform init -backend-config="storage_account_name=mystorageaccount"
terraform plan -out=plan.tfplan
terraform apply -input=false plan.tfplan
Passo 4: executar verificações pós-deploy
Explicação: aqui corremos smoke tests, verificações de endpoints, integrações ou testes de políticas. Se estas verificações falharem, accionamos o 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
Passo 5: restaurar o state para rollback
Explicação: se as verificações detectarem falha, restauramos o state para o snapshot guardado e re-aplicamos para que o Terraform reconcilie e remova as alterações indesejadas. No backend Azure Blob, subir o ficheiro snapshot para substituir o state atual.
# 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 a reversão
terraform init -backend-config="storage_account_name=mystorageaccount"
terraform apply -auto-approve
Passo 6: integrar tudo numa GitHub Actions
Explicação: criar um workflow que encadeia os passos: snapshot -> apply -> verificações -> (rollback se necessário). Indicamos um exemplo mínimo de job que usa az cli e 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 falharam, a iniciar 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 o resultado
Como confirmar: após correr o workflow, verifique os logs do job no GitHub Actions. Se as verificações passarem, a infraestrutura deve refletir o novo estado. Se houver falha, confirme que o blob do Terraform state foi restaurado e que os recursos foram revertidos. Use a Azure CLI para listar recursos e comparar com o estado esperado.
Conclusão
Implementar rollback automático com Terraform e GitHub Actions aumenta a resiliência do deployment: guarda um snapshot do state, aplica alterações e reverte automaticamente se as verificações falharem. Próximos passos: adicionar bloqueios (state locking), encriptar snapshots e testar o rollback em ambientes de staging. Dica: comece com um recurso simples e valide o processo antes de aplicar em produção — que teste automatizado o deixaria mais confiante?