0 XP

DEVOPSQUEST

Minha Trilha
Módulo 7 · Terraform e Ansible

Pipeline de IaC: plano aprovado, apply rastreável e drift triado

Avançado 55 min+25 XPGitHub ActionsTerraformAWS OIDC

Objetivos desta aula

  • Separar credenciais de plan e apply
  • Aplicar o mesmo plano aprovado
  • Interpretar códigos de saída sem mascarar falhas
  • Distinguir mudanças esperadas de possível drift
  • Definir limites de confiança em workflows

O pipeline anterior conectou ferramentas; agora o foco é garantir o que foi aprovado. Um plano é uma proposta calculada para código, variáveis, providers e state específicos. Rodar outro plan silenciosamente no job de apply pode executar algo diferente do que a revisão autorizou.

Separe validação sem credenciais de acesso à nuvem. fmt e verificações estáticas podem rodar em PRs não confiáveis; planos autenticados ficam restritos a código revisado e origens confiáveis. Nunca combine checkout de código de fork com segredos usando um gatilho privilegiado como atalho.

Autentique com OIDC e roles distintas. A trust policy deve restringir repositório, branch ou environment e audience. A role de plan lê recursos, lê state e, quando necessário, escreve o lockfile; isso não significa conceder alteração dos recursos de produção.

No plan persistido, fixe a revisão e salve plan.tfplan. O job de apply recebe esse mesmo arquivo, usa a mesma versão do Terraform e providers compatíveis e depende de aprovação do environment. Se outro apply alterar o state, o plano pode ficar obsoleto: gere outro e solicite nova aprovação.

Artifacts são sensíveis: o plano binário e sua representação JSON podem conter valores que a interface normalmente oculta. Restrinja acesso, retenção e origem do artifact. Não publique o plano completo em comentários abertos; apresente um resumo revisável sem segredos.

Trate exit codes como protocolo: com -detailed-exitcode, 0 indica ausência de mudanças, 1 indica erro e 2 indica mudanças propostas. O shell de CI pode encerrar no código 2 antes de você classificá-lo; capture o resultado explicitamente sem converter um erro real em sucesso.

Para drift detection, rode um plano agendado sobre a revisão implantada e as mesmas entradas aprovadas. Um código 2 apenas sinaliza diferença: ela também pode vir de alteração de código, variáveis ou provider. Correlacione o plano com histórico de deploy e auditoria antes de chamar tudo de drift.

O fluxo seguro é detectar, triar e aprovar, não corrigir automaticamente qualquer diferença. Abra um incidente ou tarefa com responsável e prazo; decida se a alteração externa deve virar código ou ser revertida. Use concorrência por ambiente no CI e mantenha o lock do backend como proteção adicional.

Na prática

Capturar o resultado do plano em um job autenticado

yaml

# Trecho de steps após checkout confiável, setup-terraform com
# terraform_wrapper: false, autenticação OIDC e terraform init.
- name: Gerar plano e classificar resultado
  id: plan
  shell: bash
  working-directory: infra/envs/dev
  run: |
    set +e
    terraform plan -input=false -lock-timeout=5m -detailed-exitcode -out=plan.tfplan
    rc=$?
    set -e
    case "$rc" in
      0) echo "changes=false" >> "$GITHUB_OUTPUT" ;;
      2) echo "changes=true" >> "$GITHUB_OUTPUT" ;;
      *) echo "Falha ao calcular plano" >&2; exit "$rc" ;;
    esac
# No fluxo completo, envie o plano como artifact privado de curta retenção.
# O job de apply protegido baixa exclusivamente o artifact desta execução.

Aplicar o plano revisado no job protegido

bash

# Pré-condições: aprovação de environment, checkout do mesmo commit,
# role de apply via OIDC e plano íntegro baixado desta mesma execução.
set -euo pipefail
cd infra/envs/dev
terraform init -input=false -lockfile=readonly
# Não executar um novo plan neste job: aplique o arquivo já aprovado.
terraform apply -input=false -lock-timeout=5m plan.tfplan
# Se o plano estiver obsoleto, interrompa e reinicie plan + aprovação.
# Em execução separada, valide convergência e notifique diferenças.

Por que isso importa

Vincular revisão, plano e execução reduz mudanças inesperadas e permite reconstruir quem aprovou cada alteração.

Erro comum

Capturar qualquer falha de plan com || true e publicar o job como sucesso sem distinguir código 1 de 2.

Dica de produção

Use environment protegido, concorrência por ambiente sem cancelar apply em andamento e retenção curta de artifacts.

Alerta de segurança

Código de PR pode executar comandos arbitrários: não dê credenciais de plan ou acesso ao state a contribuições não confiáveis.

Pergunta de entrevista

Como garantir que o apply executa exatamente a mudança revisada e como tratar um plano obsoleto?

Glossário

plano persistido
Arquivo produzido por plan -out para aplicação posterior da mesma proposta.
OIDC
Protocolo usado para trocar identidade do job por credenciais temporárias na nuvem.
environment protegido
Contexto de implantação com restrições e aprovação antes da execução autorizada.
artifact
Arquivo preservado por uma execução de CI para uso controlado em outros jobs.
drift detection
Verificação periódica de divergências que exige triagem de causa e intenção.

Conexão com o CloudShop

Fortalecer o pipeline do CloudShop com plano persistido, aprovação, roles separadas e triagem de diferenças agendadas.

Quiz da aula

  1. 1. O plan retorna 2 com -detailed-exitcode. Isso significa:

  2. 2. O state mudou após a aprovação e o plano ficou obsoleto. O que fazer?

  3. 3. Quem pode receber acesso ao state em um workflow de PR?

Minhas anotações

Salvo automaticamente neste navegador.

AnteriorPróxima