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

Como fazer rollback automático de Terraform em CI/CD: passo a passo

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

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?