Pular para o conteúdo principal
Este documento descreve a estratégia de recuperação de desastres (DR), Objetivo de Tempo de Recuperação (RTO) e Objetivo de Ponto de Recuperação (RPO) para a infraestrutura EKB AWS/EKS. Ele cobre capacidades HA integradas, sistemas de backup ativos, procedimentos de recuperação e lacunas conhecidas.
Para instruções de implantação, consulte o Guia de Implantação Terragrunt.

Resumo da Arquitetura e Alta Disponibilidade

Componentes da Infraestrutura

ComponenteImplementaçãoModelo HA
ComputaçãoEKS (Kubernetes 1.33) + KarpenterNós Multi-AZ, Spot + On-Demand
Escalonamento automático de podsKEDABaseado em CPU/Memória, mín. 2 réplicas
Ingress / SSLALB + ACMMulti-AZ, roteamento via health-check
CacheElastiCache Redis (condicional)Multi-AZ com failover automático
Fila de mensagensAmazon MQ / RabbitMQ (condicional)Instância única ou active/standby
Banco de dados (auto-hospedado)Cluster HA CloudNativePG + PgBouncerPrimário + réplicas, failover automático
Banco de dados (cloud)Supabase CloudGerenciado, entre regiões pelo provedor
ObservabilidadeSigNoz + k8s-infra (condicional)Dentro do cluster, sem ponto único de falha
Estado IaCS3 (versionado) + lock DynamoDBCriptografado, versionado
Volumes persistentesEBS (via EBS CSI Driver)Snapshots via AWS Data Lifecycle Manager

Capacidades HA Atuais

CapacidadeTempo de RecuperaçãoPerda de DadosStatus
Falha de AZ (pods)0–5 minNenhumaAtivo
Falha/crash de pod0–2 minNenhumaAtivo
Roteamento via health-check do ALB0–1 minNenhumaAtivo
Failover Multi-AZ do Redis< 1 minNenhumaAtivo (quando habilitado)
Substituição de nó pelo Karpenter0–10 minNenhumaAtivo
Restauração de snapshot EBS15–30 minAté 24 hAtivo
Restauração PITR do CloudNativePG15–60 minAté o lag do WALAtivo (quando habilitado)
Recriação completa da infraestrutura30–60 minNenhuma (IaC)Via Terragrunt

Objetivos RTO / RPO

CenárioObjetivo RTOObjetivo RPOCapacidade Atual
Falha de pod único< 2 min0Atendido (réplicas mín. KEDA)
Falha de nó único< 10 min0Atendido (substituição Karpenter)
Falha de AZ< 5 min0Atendido (distribuição Multi-AZ)
Falha do Redis< 1 min0Atendido (failover Multi-AZ)
Falha do primário do Postgres< 5 min0–segundos de lag do WALAtendido (failover automático CNPG)
Perda de volume EBS15–30 min< 24 hParcial — snapshots DLM diários
Falha de região completa> 60 minDepende da frequência de backupAtualmente não automatizado

Sistemas de Backup

1. Estado Terraform / Terragrunt — S3

O que é feito backup: Todo o estado da infraestrutura (EKS, rede, IAM, releases Helm). Implementação:
  • Bucket S3 por ambiente: ekb-terraform-state-<nome-do-ambiente> (inicializado via terragrunt/environments/<nome-do-ambiente>/state/)
  • Versionamento habilitado — qualquer versão anterior do estado pode ser restaurada
  • Criptografia no lado do servidor (AES-256)
  • Tabela DynamoDB para lock de estado
Recuperação: Reverta para qualquer versão anterior do estado no S3 e, em seguida, execute novamente terragrunt apply. RPO: A cada commit de terragrunt apply — contínuo.

2. Volumes Persistentes EBS — AWS Data Lifecycle Manager

O que é feito backup: Volumes EBS anexados a pods (PostgreSQL do Automator, Supabase MinIO, quaisquer cargas de trabalho estatais). Implementação: Política do AWS Data Lifecycle Manager (DLM) direcionada a tags de ambiente.
# Marque os volumes EBS com o nome do seu ambiente e, em seguida, crie uma política DLM:
# - Recurso: Volumes EBS
# - Tag alvo: Environment=<nome-do-seu-ambiente>
# - Agendamento: Diariamente às 02:00 UTC
# - Retenção: 7 snapshots
Recuperação:
# 1. Identifique o snapshot a ser restaurado
aws ec2 describe-snapshots --filters "Name=tag:Environment,Values=<nome-do-seu-ambiente>"

# 2. Crie um volume a partir do snapshot
aws ec2 create-volume \
  --snapshot-id snap-xxxxxxxxxxxxxxxxx \
  --availability-zone <sua-az> \
  --volume-type gp3

# 3. Atualize o PersistentVolume no Kubernetes para referenciar o novo ID do volume
kubectl patch pv <pv-name> -p '{"spec":{"awsElasticBlockStore":{"volumeID":"<novo-vol-id>"}}}'
RPO: Até 24 horas (snapshots diários). Reduza aumentando a frequência do agendamento DLM.

3. CloudNativePG (HA Supabase DB) — Backups Barman Cloud

Aplica-se a: Ambientes com ENABLE_CNPG=true e ENABLE_HA_SUPABASE_DB=true. O que é feito backup: O cluster Postgres CloudNativePG (ha-supabase-db), incluindo streaming WAL (Write-Ahead Log) contínuo para S3 ou MinIO e backups base completos agendados via CRD ScheduledBackup do CNPG. Implementação (configurado em values/ha-supabase-db.yaml):
postgres:
  backup:
    enabled: true                    # alternar backups barman-cloud
    # barmanObjectStore aponta para o bucket S3 ou endpoint MinIO
    # IRSA / service account deve ter s3:PutObject, s3:GetObject, s3:ListBucket
    retentionPolicy: "30d"           # manter backups por 30 dias
    compression: gzip
Verificar status do backup:
# Listar todos os backups do cluster
kubectl get backup -n ha-supabase-db

# Verificar um backup específico
kubectl describe backup <backup-name> -n ha-supabase-db

# Acionar um backup sob demanda
kubectl cnpg backup ha-supabase-db -n ha-supabase-db
Recuperação no ponto no tempo (PITR):
# Criar um novo CNPG Cluster restaurando a partir de um backup
# (em um novo namespace ou após remover o original)
apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
  name: ha-supabase-db-restored
  namespace: ha-supabase-db-restore
spec:
  instances: 3
  bootstrap:
    recovery:
      source: ha-supabase-db
      recoveryTarget:
        targetTime: "2026-03-19T03:00:00.000000+00:00"  # ponto alvo no tempo
  externalClusters:
    - name: ha-supabase-db
      barmanObjectStore:
        # mesma configuração S3/MinIO do cluster de origem
        serverName: ha-supabase-db
RPO: Quase zero para clusters com WAL habilitado (segundos de lag, limitado pelo intervalo de upload do WAL).

4. ElastiCache Redis — Replicação Multi-AZ

Aplica-se a: Ambientes com ENABLE_AWS_SERVICES=true. O Redis não é um armazenamento de dados primário — ele armazena cache transitório e dados de sessão. O foco da DR está em um failover rápido em vez de backup/restauração. Implementação:
  • Multi-AZ habilitado com failover automático
  • Criptografia em repouso e em trânsito
  • Uma falha de nó primário promove uma réplica automaticamente (< 1 min)
RPO: Os dados do Redis são efêmeros por design. Falhas de cache após o failover são esperadas; a aplicação repopula a partir do banco de dados.

5. Amazon MQ (RabbitMQ) — Fila de Mensagens

Aplica-se a: Ambientes com ENABLE_AWS_SERVICES=true. Implementação:
  • Implantação instância única (padrão) ou active/standby
  • Mensagens em trânsito podem ser perdidas durante uma reinicialização do broker; projete consumidores para serem idempotentes
  • Interface de gerenciamento disponível na porta 15671 (SSL)
RPO: Instância única — mensagens em trânsito no momento da falha podem ser perdidas. Use o modo de implantação active/standby para reduzir este risco.

Mecanismos de Auto-Recuperação

Karpenter — Provisionamento e Recuperação de Nós

  • Consolidação: WhenEmptyOrUnderutilized — nós ociosos são terminados automaticamente
  • Tratamento de interrupção de Spot: Escuta eventos de interrupção SQS; drena e substitui nós Spot antes da terminação
  • Drift de nó: Nós usando AMIs ou configurações desatualizadas são substituídos automaticamente quando enable_drift = true
  • Tempo de recuperação: Novo nó provisionado em 0–10 minutos

KEDA — Escalonamento Automático de Pods

  • Réplicas mínimas: 2 para todos os serviços (Web, API, Celery, Automator) — previne ponto único de falha
  • Limite de CPU: 60–70% aciona escalonamento para cima
  • Limite de memória: 80% aciona escalonamento para cima
  • Estabilização de scale-down: 30 segundos — evita oscilação
  • Tempo de recuperação: Pods com falha são reagendados em 0–2 minutos

Anti-Afinidade de Pods do Kubernetes

Todos os serviços sem estado usam anti-affinité preferredDuringSchedulingIgnoredDuringExecution em kubernetes.io/hostname para distribuir pods entre nós e AZs.
affinity:
  podAntiAffinity:
    preferredDuringSchedulingIgnoredDuringExecution:
    - weight: 100
      podAffinityTerm:
        labelSelector:
          matchExpressions:
          - key: app
            operator: In
            values: ["web", "fastapi-backend", "celery-worker", "automator"]
        topologyKey: kubernetes.io/hostname

Procedimentos de Recuperação

Cenário 1: Falha de AZ

Comportamento esperado: O Karpenter provisiona nós de substituição nas AZs restantes; o KEDA reagenda pods; o ALB para de rotear para targets não saudáveis. Verificação:
kubectl get nodes -o wide     # confirmar que nós estão em AZs saudáveis
kubectl get pods -A -o wide   # confirmar que pods estão em execução
kubectl get ingress            # confirmar que o ALB está roteando corretamente
Nenhuma intervenção manual é necessária sob circunstâncias normais.

Cenário 2: Falha do Nó Primário do Postgres (CloudNativePG)

O CloudNativePG promove automaticamente uma réplica a primário.
# Monitorar o failover
kubectl get cluster ha-supabase-db -n ha-supabase-db -w

# Confirmar o novo primário
kubectl cnpg status ha-supabase-db -n ha-supabase-db

# Verificar se o pooler PgBouncer está apontando para o novo primário
kubectl get svc -n ha-supabase-db | grep pooler
As aplicações se reconectam via PgBouncer — nenhuma alteração de string de conexão necessária.

Cenário 3: Restaurar Volume EBS a partir de Snapshot

# 1. Encontrar snapshots para o ambiente
aws ec2 describe-snapshots \
  --filters "Name=tag:Environment,Values=<nome-do-seu-ambiente>" \
  --query 'Snapshots[*].[SnapshotId,StartTime,VolumeSize]' \
  --output table

# 2. Criar um novo volume a partir do snapshot escolhido
aws ec2 create-volume \
  --snapshot-id snap-xxxxxxxxxxxxxxxxx \
  --availability-zone <az-destino> \
  --volume-type gp3 \
  --tag-specifications 'ResourceType=volume,Tags=[{Key=Environment,Value=<nome-do-seu-ambiente>}]'

# 3. Reduzir a carga de trabalho afetada
kubectl scale deployment <carga-trabalho> --replicas=0

# 4. Atualizar o PV para referenciar o novo volume EBS e, em seguida, escalar novamente
kubectl patch pv <pv-name> -p '{"spec":{"csi":{"volumeHandle":"<novo-volume-id>"}}}'
kubectl scale deployment <carga-trabalho> --replicas=2

Cenário 4: Recriação Completa da Infraestrutura

Usado após falha catastrófica ou ao reconstruir uma região.
# 1. Inicializar o bucket de estado (se não existir)
cd terragrunt/environments/<nome-do-seu-ambiente>/state
terragrunt apply

# 2. Recriar o cluster EKS e infraestrutura principal
cd terragrunt/environments/<nome-do-seu-ambiente>
terragrunt apply

# 3. Implantar serviços em ordem (veja Guia de Implantação Terragrunt § Fase 6)
ENABLE_CNPG=true terragrunt apply --target='helm_release.local["cloudnative-pg"]'
ENABLE_HA_SUPABASE_DB=true terragrunt apply --target='helm_release.local["ha-supabase-db"]'
ENABLE_SUPABASE=true terragrunt apply --target='helm_release.local["supabase"]'
RTO estimado: 30–60 minutos para o cluster completo; 60–120 minutos se os dados EBS/CNPG precisarem ser restaurados.

Cenário 5: Reversão de Estado Terragrunt

# Listar versões de estado no S3
aws s3api list-object-versions \
  --bucket ekb-terraform-state-<nome-do-seu-ambiente> \
  --prefix <chave-do-estado>

# Restaurar uma versão específica
aws s3api get-object \
  --bucket ekb-terraform-state-<nome-do-seu-ambiente> \
  --key <chave-do-estado> \
  --version-id <versao-id> \
  terraform.tfstate

# Reimportar ou aplicar com o estado restaurado

Observabilidade e Alertas (SigNoz)

Quando ENABLE_SIGNOZ=true, o SigNoz é implantado no namespace monitoring e fornece:
  • Rastreamento distribuído para todos os serviços EKB
  • Métricas do cluster via agente DaemonSet k8s-infra (CPU, memória, status do pod)
  • Agregação de logs de todos os pods
  • Alertas — configure regras de alerta no SigNoz para notificar sobre loops de crash de pods, altas taxas de erro ou pressão de nós
Para fins de DR, os painéis do SigNoz são a principal ferramenta para diagnosticar e confirmar a recuperação após um incidente. Os próprios dados do SigNoz são armazenados em volumes PV EBS e são cobertos pela política de snapshots EBS.

Lacunas e Recomendações

LacunaRiscoRecomendação
Sem replicação entre regiõesFalha de região completa = RTO estendidoConsidere réplica de leitura RDS entre regiões ou replicação S3 entre regiões para backups CNPG
Snapshots EBS são diáriosAté 24 h de perda de dados para cargas de trabalho baseadas em EBSAumente a frequência DLM para horária para volumes críticos
RabbitMQ instância única (padrão)Mensagens em trânsito perdidas na falha do brokerMude para modo de implantação ACTIVE_STANDBY_MULTI_AZ para produção
Sem DR drill automatizadoProcedimentos de recuperação não testados até serem necessáriosAgende drills trimestrais de recuperação; teste restauração PITR do CNPG em ambiente de staging
SigNoz no mesmo clusterObservabilidade perdida durante falha do clusterConsidere um endpoint de monitoramento leve separado ou alertas de fallback CloudWatch