
State remoto: migração, contenção de concorrência e recuperação
Objetivos desta aula
- Migrar state local sem perder vínculos
- Configurar lock nativo no S3
- Distinguir permissões do state e do lockfile
- Investigar locks antes de removê-los
- Planejar recuperação com versionamento
O backend já foi apresentado; esta aula aprofunda operação segura do state. Migrar não é simplesmente copiar um arquivo para S3: o Terraform precisa passar a usar a localização correta sem criar um segundo inventário independente. Faça a mudança em janela controlada, sem outros plans ou applies.
Prepare o backend antes da migração. O bucket precisa existir com versionamento, bloqueio público, criptografia e acesso restrito. Use uma configuração de bootstrap separada ou infraestrutura corporativa existente; não dependa do backend que ainda está tentando criar.
O lockfile nativo do S3 exige Terraform >= 1.10 e use_lockfile = true. Padronize essa versão em todas as máquinas e pipelines que acessam o state. Uma configuração compatível não protege contra clientes antigos que não adotam o mesmo mecanismo de lock.
As permissões são distintas: a role precisa ler e gravar o objeto de state e listar o prefixo necessário no bucket; no objeto .tflock, precisa também excluir o lock ao terminar. Se houver SSE-KMS, as permissões da chave entram na análise. Não conceda DeleteObject ao state sem necessidade operacional.
Execute init -migrate-state após configurar o backend e confirme a migração solicitada. Não confunda com reconfigure: -reconfigure aceita uma configuração de backend sem migrar o state anterior. Compare inventário antes/depois e só prossiga quando estiver certo de conta, bucket e chave.
Com concorrência legítima, aguarde o lock, não o desative. -lock-timeout=5m dá tempo para outra operação terminar. O lock coordena um state específico; não serializa automaticamente stacks diferentes que alteram o mesmo recurso por desenho incorreto.
Um lock aparentemente preso exige investigação de execução ativa: confira job, operador, horário e logs. Só use force-unlock após confirmar que o dono não está mais escrevendo e preservar evidências. Destravar um apply ainda vivo pode permitir duas gravações concorrentes.
Recuperação é procedimento ensaiado, não restauração impulsiva de versão. Pare os escritores, preserve state atual, identifique a versão boa e reconcilie o que mudou na AWS desde então. Após recuperar sob controle, execute plan e revise; restaurar um state antigo não desfaz recursos já criados ou removidos.
Na prática
Backend parcial e configuração do ambiente
hcl
# backend.tf no módulo raiz; o bucket é criado por bootstrap separado.
terraform {
required_version = ">= 1.10, < 2.0"
backend "s3" {}
}
# Salve o conteúdo abaixo em dev.s3.tfbackend, sem credenciais.
# bucket = "cloudshop-tfstate-CONTA"
# key = "dev/infra.tfstate"
# region = "us-east-1"
# encrypt = true
# use_lockfile = true
# Troque CONTA pelo identificador do bucket privado já provisionado.Janela de migração e validação do inventário
bash
# Execute no diretório raiz correto, sem outros escritores ativos.
set -euo pipefail
umask 077
# Backup sensível fora do repositório; aplique a política de retenção do time.
terraform state pull > /tmp/cloudshop-before-migration.tfstate
terraform state list > /tmp/cloudshop-before-migration.txt
terraform init -migrate-state -backend-config=dev.s3.tfbackend
terraform state list > /tmp/cloudshop-after-migration.txt
diff -u /tmp/cloudshop-before-migration.txt /tmp/cloudshop-after-migration.txt
# Revise qualquer diferença; este comando não aplica mudanças.
terraform plan -lock-timeout=5m
# Não use -lock=false para contornar outro job.Por que isso importa
Procedimentos de migração e recuperação evitam perder o vínculo entre código e infraestrutura durante incidentes.
Erro comum
Usar -reconfigure achando que ele transfere automaticamente o state local para o backend remoto.
Dica de produção
Teste recuperação em ambiente isolado e registre responsáveis, permissões de emergência e tempo de restauração.
Alerta de segurança
Backups de state contêm dados sensíveis: restrinja acesso, criptografe o armazenamento durável e nunca publique em artifacts abertos.
Pergunta de entrevista
Como migrar state local para S3 e comprovar que nenhum recurso perdeu seu vínculo?
Glossário
- bootstrap
- Etapa inicial que provisiona dependências necessárias à infraestrutura principal.
- lockfile S3
- Objeto .tflock usado pelo backend para coordenar operações sobre o state.
- migrate-state
- Opção do init que conduz a transferência do state ao mudar o backend.
- reconfigure
- Opção do init que descarta a configuração anterior de backend sem migrar o state.
- versionamento S3
- Manutenção de versões de objetos para recuperação e auditoria.
Conexão com o CloudShop
Migrar o state de dev do CloudShop em janela controlada, comparar inventários e documentar investigação de lock órfão.
Quiz da aula
1. Qual versão mínima suporta use_lockfile no backend S3?
2. Antes de force-unlock, o que é indispensável?
3. Restaurar uma versão antiga de state desfaz mudanças na AWS?
Minhas anotações
Salvo automaticamente neste navegador.
