Lab 58 — DR multi-região: as quatro estratégias
O problema, e a empresa que o tem
A Cadência chegou a 900 lojas com a arquitetura do L15: Aurora PostgreSQL Serverless v2 numa região só, escalando de madrugada a campanha sem ninguém trocar instância a mão. O time nunca perdeu uma AZ de verdade — e, desde o L57, sabe exatamente o que aconteceria se perdesse: o experimento de caos provou que a aplicação sobrevive à queda de uma zona dentro da região.
O que ninguém provou é o que acontece se a REGIÃO inteira sair do ar. Existe um documento — "Plano de Recuperação de Desastre — Cadência.pdf" — escrito há dois anos, revisado nunca, que promete "RTO: 4 horas". Ele descreve um roteiro manual: restaurar do último snapshot, reconstruir a rede, reimplantar a aplicação. Ninguém jamais executou esse roteiro. O número "4 horas" é uma estimativa de quem escreveu o documento, não uma medição.
O gatilho para este laboratório não foi um incidente da Cadência: foi um concorrente direto ficar fora do ar um dia inteiro, numa interrupção regional da AWS que apareceu no noticiário. A diretoria perguntou "e nós, quanto tempo ficaríamos parados?" — e a resposta honesta, quando alguém foi checar, era "não sabemos, porque nunca testamos".
O que este laboratório NÃO é
Não é o laboratório de alta disponibilidade DENTRO de uma região — isso é o L57, e ele já está resolvido: Multi-AZ e Auto Scaling continuam sendo a primeira linha de defesa, e continuam mais baratos e mais rápidos que qualquer coisa cross-region. Este laboratório só entra em cena quando a REGIÃO inteira falha, e ele não substitui o L57 — ele começa de onde o L57 termina.
O que você vai conseguir fazer
Objetivos verificáveis: cada um se prova com um comando na seção de implantação, não com a sensação de ter entendido.
- Nomear as quatro estratégias de DR da AWS e ordená-las por RTO/RPO crescente e custo decrescente.
- Medir o RTO real de um plano de backup/restore cross-region, cronometrando a reconstrução do zero.
- Explicar por que pilot light e warm standby usam os mesmos serviços e diferem em uma coisa só.
- Configurar um Aurora Global Database com cluster primário e secundário em regiões diferentes.
- Configurar failover de DNS no Route 53 a partir de um health check de prontidão, não de vivacidade.
- Distinguir failover de switchover no Aurora Global Database, e escolher a operação certa para cada situação.
- Ensaiar um failover regional de warm standby, medindo RTO e RPO com número, não com estimativa.
- Explicar por que AWS Elastic Disaster Recovery (DRS) não se aplica a uma carga inteiramente gerenciada.
- Identificar o que a réplica cross-region NÃO protege, e por que o backup continua sendo necessário mesmo com Aurora Global no ar.
O que a certificação cobra disto
| Conceito | Certificação | Como aparece aqui | O que dominar |
|---|---|---|---|
| As quatro estratégias de DR | SAP-C02 | nomeadas e ordenadas por RTO/RPO e custo | não é "qual é a melhor" — é qual requisito cada uma atende |
| RTO vs RPO | SAP-C02, SOA-C02 | medidos com cronômetro e com métrica de replicação | RTO mede tempo fora do ar; RPO mede dado perdido — são perguntas diferentes |
| Failover vs switchover do Aurora Global | SAP-C02 | duas operações distintas, com garantias diferentes | switchover tem RPO zero e exige as duas regiões saudáveis; failover não espera sincronia e aceita perda |
| Route 53: roteamento de failover | SAP-C02, SOA-C02 | registro PRIMARY/SECONDARY com health check de prontidão | o quórum de verificadores e a diferença entre vivacidade e prontidão |
| AWS Backup cross-region | SAP-C02 | PITR nas duas regiões, independente da réplica | a réplica propaga corrupção e deleção; só o backup protege contra isso |
| AWS Elastic Disaster Recovery (DRS) | SAP-C02 | citado como alternativa REJEITADA, com o motivo técnico | para qual tipo de carga o DRS serve, e por que ele não substitui réplica de banco gerenciado |
| Pilot light vs warm standby | SAP-C02 | a distinção que mais confunde nesta prova | não é "quais serviços", é "a aplicação já está rodando ou precisa ser ligada" |
| Well-Architected — Reliability | SAP-C02 | DR como requisito de negócio explícito, não decisão isolada de engenharia | RTO e RPO vêm de conversa com o negócio, e cada estratégia tem um custo que rastreia a esse número |
Onde isto costuma ser cobrado errado
A pergunta clássica descreve um cenário com RTO de minutos e pede a estratégia mais barata que atende. A armadilha é responder "pilot light" só porque é mais barato que warm standby, sem checar o segundo requisito da questão — que costuma ser "sem intervenção manual" ou "sem equipe de plantão". Pilot light sempre tem um passo de implantar a aplicação; se o enunciado proíbe esse passo manual, a resposta certa é warm standby, mesmo custando mais.
Requisitos, e como cada um muda o desenho
Requisito não funcional que não aparece numa linha de configuração é intenção. A coluna da direita é onde cada um deixou marca — e é ela que decide qual das quatro estratégias sobra no fim.
| Requisito | Valor declarado | O que ele decide no desenho |
|---|---|---|
| RTO em horário comercial | até 30 minutos | descarta backup/restore de saída — a arquitetura mínima deste módulo prova que o real fica na casa de horas |
| RPO de pedidos | até 5 minutos | exige réplica contínua (Aurora Global), não cópia periódica de snapshot |
| Operação sem plantão noturno dedicado | declarado pela diretoria | descarta pilot light — "ligar" a aplicação do zero é passo manual demais para quem está sendo acordado às 3h; empurra para warm standby |
| Orçamento aprovado, mas não ilimitado | segunda região, capacidade REDUZIDA | descarta multi-site ativo-ativo nesta fase — capacidade dobrada em tempo integral não se justifica pelo requisito atual |
| Escrita não particiona por região | um pedido e o estoque vivem num lugar só | descarta multi-site ativo-ativo tecnicamente, não só por custo: escrita em duas regiões ao mesmo tempo exigiria resolver conflito que o modelo de dados não prevê |
| RTO/RPO auditáveis | medidos, não estimados | obriga um ensaio de failover real e cronometrado — é o entregável deste módulo, não um "deveria funcionar" |
| Failback sem risco de dado | declarado pela diretoria | exige switchover planejado (RPO zero) para voltar a us-east-1 como primária; nunca failover para "voltar" |
| Detecção sem falso positivo caro | declarado pelo time | exige confirmação humana antes de promover o secundário — decisão registrada, não automação cega baseada só em health check |
Arquitetura mínima: o plano de DR que existe só no documento
Este é o desenho que a Cadência tem hoje, e ele é legítimo como ponto de partida: backup/restore cross-region é uma estratégia real, não um erro — só é lenta. O laboratório começa por medir essa lentidão, porque um número torna o defeito discutível, e "o RTO é de 4 horas" sem nunca ter cronometrado não é discutível, é fé.
- → HTTPS 443 — único destino que existe
- → encaminha
- → leitura e escrita, só nesta região
- → snapshot agendado, cópia cross-region 1×/dia
- → é o que o runbook realmente aponta
- → escreveu o runbook, nunca o executou
- Fora da AWS
- Rede e entrega
- Compute
- Banco de dados
- Gestão e governança
- Conceito de arquitetura
Isto publica, e por isso sobrevive: uma cópia agendada por dia e um runbook em PDF. O defeito não é nenhuma configuração errada — é que a região de recuperação está vazia até o desastre, e o RTO do documento nunca foi cronometrado. Percorra os passos e repare que "4 horas" é uma frase, não uma medição.
- O único destino que existe. O registro do Route 53 aponta para um endereço só, sem `failover_routing_policy` e sem health check. Se us-east-1 cai, o DNS continua respondendo com um endereço que não atende mais — não há PARA ONDE ele desviaria.
- A escrita não sai da região enquanto está viva. Este é o cluster único herdado do L15: rápido e barato, mas sem nenhuma cópia de dado fora de us-east-1 além do backup agendado abaixo.
- A cópia é diária, não contínua. AWS Backup copia o snapshot uma vez por dia, às 3h. No pior caso, o intervalo entre a última cópia e o desastre é de quase 24h de escrita — muito acima da "1h" que o runbook promete, e ninguém tinha medido isso porque medir exige simular a perda de verdade.
- A região de recuperação não tem nada além de um PDF. Não existe ECS, não existe cluster, não existe rede em us-west-2. A conta está habilitada na região, e é só isso. Tudo seria criado na hora, a partir do que o runbook descreve em prosa.
- Recuperar é reconstruir, não promover. Sem infraestrutura pré-existente, o primeiro passo real de uma recuperação é `terraform apply` numa região nova, sob pressão, com o time inteiro olhando. Cada erro de digitação no meio do incidente vira minuto de RTO.
- Por que a Cadência ainda não ensaiou isto. Porque um ensaio de queda de região é caro de simular e ninguém programa isso sem um gatilho externo. O gatilho, aqui, foi um concorrente ficar fora do ar um dia inteiro — e a diretoria perguntar "e nós, quanto tempo ficaríamos parados?".
Antes de propor qualquer estratégia mais cara, meça o que já existe. Este roteiro simula a perda da região primária e cronometra, do zero, até a aplicação responder na região de recuperação.
# Rode isto contra uma copia de teste do ambiente, NUNCA contra producao viva.
# O numero que sair daqui e a linha de base contra a qual toda estrategia mais
# cara tem de justificar o custo extra.
INICIO=$(date +%s)
# 1. "Descobrir" a ultima copia cross-region (o primeiro passo do runbook real).
ULTIMA=$(aws backup list-recovery-points-by-backup-vault --region us-west-2 \
--backup-vault-name cadencia-vault-dr \
--query "sort_by(RecoveryPoints,&CreationDate)[-1].RecoveryPointArn" --output text)
# 2. Restaurar o cluster do zero, numa regiao sem NADA de pe.
aws backup start-restore-job --region us-west-2 \
--recovery-point-arn "$ULTIMA" --iam-role-arn "$ROLE_RESTORE" \
--resource-type Aurora
# ... aguarde o job terminar (aws backup describe-restore-job em loop) ...
# 3. So DEPOIS do banco restaurado comeca a construcao de rede e aplicacao —
# exatamente como o runbook em prosa descreve.
terraform -chdir=infra-dr-minima apply -auto-approve
until curl -sf "https://dr.cadencia.example/health/ready"; do sleep 10; done
FIM=$(date +%s)
echo "RTO medido: $(( (FIM - INICIO) / 3600 )) horas"
# Na Cadencia: pouco mais de 5 horas — acima das "4h" do documento, porque o
# documento nunca contou o tempo de RECONSTRUIR rede e aplicacao do zero, so o
# tempo de restaurar o banco.O custo de nunca ter medido é descobrir o RTO real no pior momento
Enquanto o RTO de 4 horas não é testado, ele é uma crença — e crença não aparece em nenhuma fatura até o dia em que o desastre acontece de verdade e o número real, maior, chega junto com clientes sem conseguir comprar. O risco aqui não é técnico, é de continuidade de negócio: a Cadência estava prometendo, para a diretoria e potencialmente para contratos com lojas, um número que nunca tinha verificado.
Arquitetura para produção: warm standby
Cada peça nova abaixo rastreia a uma linha da tabela de requisitos. Se você não conseguir apontar o requisito, a peça é adorno — e este desenho não tem nenhuma.
- → resolve o domínio antes de cada conexão
- → health check saudável → resolve para cá
- → health check falhou → resolve para cá
- → encaminha
- → leitura e escrita
- → replicação assíncrona contínua, RPO tipicamente em segundos
- → encaminha (capacidade reduzida, sempre de pé)
- → lê localmente; só escreve depois da promoção
- → cópia pontual, independente da réplica
- → mede o atraso de replicação em milissegundos
- Fora da AWS
- Rede e entrega
- Compute
- Banco de dados
- Gestão e governança
O que muda não é uma caixa a mais — é que a região de DR deixou de ser um PDF e passou a ter réplica contínua de dado e capacidade viva, ainda que reduzida. Percorra os passos: cada peça nova rastreia a uma linha da tabela de requisitos, e o RTO deixa de ser uma crença para virar um número que este módulo mede.
- O DNS decide, e decide sobre dado real. O health check do Route 53 é uma checagem HTTP na rota de prontidão do ALB primário, verificada por pontos de checagem espalhados pelo mundo. A AWS só considera o alvo insalubre quando 18% ou menos desses verificadores continuam reportando saudável — o que evita marcar a região como fora do ar por causa de um problema de rede local a um único verificador.
- O health check escolhe a região, não o operador. Com `failover_routing_policy`, existe um registro PRIMARY e um SECONDARY. Enquanto o health check do primário está saudável, o SECONDARY nunca é devolvido — mesmo que alguém consulte o DNS mil vezes.
- A réplica corre o tempo todo — é o que mantém o RPO baixo. Aurora Global Database replica de forma assíncrona e contínua, fora do caminho do motor de banco. A AWS caracteriza o RPO típico do Aurora Global Database em segundos, não em minutos — isso não é sincronia: é replicação rápida. A diferença importa porque sincronia teria custo de latência em toda escrita do primário, e este módulo mede o número real na sua conta em vez de repetir o do folheto.
- Backup continua existindo: réplica não é proteção contra corrupção. Se um `DELETE` sem `WHERE` roda no primário — o mesmo incidente do L10 —, a réplica propaga o dado apagado para us-west-2 em poucos segundos. Quem protege contra isso é o PITR do AWS Backup, não a réplica.
- Capacidade quente evita "ligar do zero" sob pressão. O serviço ECS em us-west-2 já está rodando, com poucas tasks, ANTES do desastre. A diferença para o pilot light é exatamente esta: aqui não existe um passo de "implantar a aplicação" no meio do incidente — existe só um passo de escalar o que já está de pé.
- A escrita só migra depois da promoção — não antes. Até alguém (ou uma automação supervisionada) executar o failover do cluster global, o secundário continua só leitura. Escrever local antes da promoção não é uma opção que o Aurora Global oferece — e é uma restrição, não uma falha.
- O atraso medido é a prova do RPO, não a suposição. O alarme sobre `AuroraGlobalDBReplicationLag` é o número que este módulo cobra na seção de provas — em milissegundos, medido, não copiado da documentação da AWS como se fosse garantia contratual.
A diferença estrutural em relação ao desenho anterior não é uma caixa a mais: é que as DUAS regiões têm infraestrutura viva e simultânea. Tudo o mais — Route 53 de failover, réplica contínua, capacidade quente, alarme de atraso — existe para tornar essa convivência segura e mensurável.
O ajuste com maior efeito por dólar investido
Das cinco parcelas da fórmula, a que domina no cenário de backup/restore é escala_de_capacidade: construir rede, aplicação e banco do zero leva horas. Warm standby ataca justamente essa parcela — reduz de "implantar" para "escalar o que já existe", que é minutos. Investir em réplica de banco mais rápida sem resolver a camada de aplicação deixaria o RTO dominado pelo mesmo gargalo de sempre.
Um failover regional, ponta a ponta
Os nomes das operações não são jargão intercambiável: switchover e failover são comandos DIFERENTES do RDS, com garantias diferentes, e a diferença é o que separa uma troca planejada sem perda de um failover de emergência que aceita perder transações recentes.
Failover gerenciado, failover manual e switchover — três operações, não duas
Switchover é para manutenção planejada, com as duas regiões saudáveis: sincroniza antes de trocar, RPO zero. Failover GERENCIADO é para outage real: promove o secundário sem esperar sincronia, aceita perda medida, e — quando a região antiga volta — a AWS a readiciona sozinha como secundária. Failover MANUAL só existe para quando as versões de engine das duas regiões são incompatíveis, e exige desanexar o cluster e reconstruir a topologia manualmente. Confundir os três é o erro mais caro desta seção, porque o comando errado no dia errado descarta dado que não precisava ser descartado.
O que o ensaio de failover grava é um marco por etapa, no mesmo espírito do roteiro cronometrado do L10 — a diferença é que aqui o marco cruza duas regiões.
{
"ensaio_id": "dr-2026-08-08-01",
"estrategia": "warm-standby",
"marco": "promocao_concluida",
"instante_utc": "2026-08-08T14:32:11Z",
"regiao_origem": "us-east-1",
"regiao_destino": "us-west-2",
"global_cluster_identifier": "cadencia-global",
"operacao": "failover_gerenciado",
"allow_data_loss": true,
"atraso_replicacao_medido_ms": 2140,
"rto_parcial_segundos": 187,
"observacao": "atraso medido no ultimo ponto antes da promocao, via CloudWatch AuroraGlobalDBReplicationLag — numero de EXEMPLO desta conta, nao garantia da AWS"
}
As decisões, e o que se perde em cada uma
📋 A Cadência, agora com 900 lojas, depois de um concorrente direto ficar fora do ar um dia inteiro numa interrupção regional da AWS. A diretoria aprovou orçamento para uma segunda região, com dois requisitos escritos: RTO de até 30 minutos em horário comercial, e RPO de até 5 minutos de pedidos — sem contratar plantão noturno dedicado.
O requisito de RTO de 30 minutos, medido pela fórmula acima, descarta backup/restore (a arquitetura mínima deste módulo prova que o real fica na casa de horas). O requisito de "sem plantão dedicado" descarta pilot light: promover o secundário do banco leva poucos minutos, mas "ligar" a aplicação do zero — implantar, configurar, só então escalar — é exatamente o tipo de passo manual que sai errado quando quem executa está sendo acordado às 3h. Warm standby elimina esse passo: a aplicação já está rodando, só precisa crescer.
Alt: Pilot light — Mais barato que warm standby, porque a aplicação não roda continuamente na segunda região — só o banco replica. Continua legítimo quando o RTO aceito é de algumas horas e o orçamento é mais apertado do que o da Cadência agora.
Alt: Multi-site ativo-ativo — Chegaria perto de RTO zero, mas exige resolver ESCRITA em duas regiões ao mesmo tempo — e o pedido da Cadência não se particiona naturalmente por região (uma loja e seu estoque vivem num lugar só). Pagaria capacidade dobrada em tempo integral por uma capacidade de escrita que ficaria ociosa quase todo o tempo. Fica reservado para quando o requisito for latência global de leitura, não recuperação de desastre.
Alt: AWS Elastic Disaster Recovery (DRS) — Não se aplica a esta carga. DRS replica no nível de bloco/servidor — para EC2, on-premises ou outra nuvem — e não replica Aurora nem "recupera" um serviço ECS Fargate, porque não existe servidor para replicar. Seria a ferramenta certa se a Cadência tivesse um componente legado em EC2; não tem.
| Decisão | Escolha | Alternativas | Motivo | O que se perde |
|---|---|---|---|---|
| Estratégia de DR | warm standby | pilot light; multi-site ativo-ativo; backup/restore | atinge RTO de 30 min sem plantão dedicado, sem exigir escrita em duas regiões | paga capacidade ociosa 24/7 na região secundária, mesmo em dias sem incidente |
| Réplica de banco | Aurora Global Database | AWS DRS (rejeitado, não se aplica); réplica lógica caseira via CDC | replicação gerenciada com RPO tipicamente em segundos, sem operar pipeline próprio | não protege contra corrupção nem DELETE — exige backup separado, que o desenho já tem |
| Operação de promoção | failover gerenciado (FailoverGlobalCluster) | failover manual (desanexar e reconstruir); switchover, reservado para manutenção | reconecta a região antiga como secundária automaticamente quando ela volta | aceita perda de dado não replicado — por isso exige confirmação explícita de perda |
| Roteamento de cliente | Route 53 com failover_routing_policy | AWS Global Accelerator; Application Recovery Controller (ARC) | já é a ferramenta usada desde o L01/L03, sem serviço novo a operar | decisão de failover fica só no health check — sem os controles mais finos que o ARC ofereceria para orquestrar múltiplos recursos |
| Confirmação do failover | humana, assistida por runbook executável | 100% automática, disparada só pelo health check | evita failover desnecessário por falso positivo, ao custo de minutos a mais de RTO | o RTO real depende de haver alguém disponível para confirmar no momento do incidente |
| Proteção contra corrupção | AWS Backup com PITR nas duas regiões | confiar só na réplica do Aurora Global | cobre DELETE e corrupção, que a réplica propagaria em poucos segundos | dobro do custo de armazenamento de backup — uma cópia por região |
A dívida que este módulo aceita conscientemente, e não paga
A Cadência optou por DUAS regiões, não três. Se us-east-1 e us-west-2 caírem juntas — cenário raro, mas não impossível —, não há terceira região para onde ir. Para o requisito atual, uma terceira região seria over-engineering: o custo de manter uma terceira capacidade quente não se justifica por um risco composto que a própria AWS trata como extremamente improvável. Fica registrado como limite conhecido, não como lacuna escondida.
Construir: o cluster global e as duas regiões
O cluster global é o objeto que amarra o primário e o secundário como uma unidade só para fins de failover/switchover. Duas restrições da documentação oficial mudam como este Terraform é escrito, e ignorá-las é o motivo mais comum de um failover falhar exatamente quando ele é necessário.
# aurora-global.tf — um cluster global, um primario, um secundario
#
# Duas restricoes que a documentacao da AWS marca como restricao, nao como
# detalhe: (1) failover e switchover so funcionam entre clusters com a
# MESMA versao MAJOR e MINOR de engine — atualizar so o primario quebra
# essa garantia ate o secundario alcancar a mesma versao. (2) a aplicacao
# le a credencial do Secrets Manager por variavel injetada pelo pipeline
# nesta conta; o cluster SECUNDARIO nao tem master_username/master_password
# proprios antes da promocao — ele herda a identidade do primario.
resource "aws_rds_global_cluster" "cadencia" {
global_cluster_identifier = "cadencia-global"
engine = "aurora-postgresql"
engine_version = "16.4"
database_name = "cadencia"
storage_encrypted = true
}
# ── Regiao primaria (provider default, us-east-1) ────────────────────────────
resource "aws_rds_cluster" "primario" {
cluster_identifier = "cadencia-primario"
engine = aws_rds_global_cluster.cadencia.engine
engine_version = aws_rds_global_cluster.cadencia.engine_version
global_cluster_identifier = aws_rds_global_cluster.cadencia.id
master_username = "cadencia_admin"
master_password = random_password.mestre.result # entra no Secrets Manager UMA vez, no bootstrap
db_subnet_group_name = aws_db_subnet_group.primario.name
vpc_security_group_ids = [aws_security_group.banco.id]
storage_encrypted = true
kms_key_id = aws_kms_key.banco.arn
deletion_protection = true
skip_final_snapshot = false
final_snapshot_identifier = "cadencia-primario-final"
serverlessv2_scaling_configuration {
min_capacity = 1 # herdado do L15; ver justificativa la
max_capacity = 16
}
}
resource "aws_rds_cluster_instance" "primario" {
cluster_identifier = aws_rds_cluster.primario.id
instance_class = "db.serverless"
engine = aws_rds_global_cluster.cadencia.engine
engine_version = aws_rds_global_cluster.cadencia.engine_version
}
# ── Regiao secundaria (provider alias us-west-2) ──────────────────────────────
resource "aws_rds_cluster" "secundario" {
provider = aws.regiao_dr
cluster_identifier = "cadencia-secundario"
engine = aws_rds_global_cluster.cadencia.engine
engine_version = aws_rds_global_cluster.cadencia.engine_version
global_cluster_identifier = aws_rds_global_cluster.cadencia.id
db_subnet_group_name = aws_db_subnet_group.secundario.name
vpc_security_group_ids = [aws_security_group.banco_dr.id]
storage_encrypted = true
kms_key_id = aws_kms_key.banco_dr.arn
skip_final_snapshot = true # secundario nao carrega o dado "de origem"; o primario ja tem final_snapshot
serverlessv2_scaling_configuration {
min_capacity = 0.5 # minimo: so precisa aplicar a replicacao, nao servir leitura de producao
max_capacity = 16 # mesmo teto do primario: no failover, ele PASSA A SER o primario
}
}
resource "aws_rds_cluster_instance" "secundario" {
provider = aws.regiao_dr
cluster_identifier = aws_rds_cluster.secundario.id
instance_class = "db.serverless"
engine = aws_rds_global_cluster.cadencia.engine
engine_version = aws_rds_global_cluster.cadencia.engine_version
}
# O alarme que torna o RPO um numero medido, nao um numero do folheto.
# A metrica so existe na regiao SECUNDARIA — e de la que se mede o quanto
# ela esta atrasada em relacao ao primario. O nome da metrica muda por
# versao de engine (AuroraGlobalDBReplicationLag em versoes mais antigas,
# AuroraGlobalDBRPOLag nas mais novas); confirme qual existe no seu cluster
# antes de copiar este bloco.
resource "aws_cloudwatch_metric_alarm" "atraso_replica" {
provider = aws.regiao_dr
alarm_name = "cadencia-aurora-global-replication-lag"
namespace = "AWS/RDS"
metric_name = "AuroraGlobalDBReplicationLag"
statistic = "Maximum"
period = 60
evaluation_periods = 3
# 5000 ms = o RPO maximo aceito pela diretoria (5 min de PEDIDOS, nao de
# replicacao — o alarme usa milissegundos porque a metrica e milissegundos;
# a distancia entre os dois numeros e o motivo de este alarme existir).
threshold = 5000
comparison_operator = "GreaterThanThreshold"
treat_missing_data = "breaching" # ausencia de dado de replica E uma falha aqui
dimensions = {
DBClusterIdentifier = aws_rds_cluster.secundario.cluster_identifier
}
alarm_actions = [aws_sns_topic.alertas_dr.arn]
}
A versão de engine tem de ser idêntica nas duas regiões
Failover e switchover gerenciados só funcionam entre clusters com a mesma versão MAJOR e MINOR de engine. Atualizar o primário sem atualizar o secundário na mesma janela quebra essa garantia até as duas convergirem — e é uma dívida silenciosa: o cluster continua replicando normalmente, só o failover gerenciado que para de funcionar, e isso só aparece no dia em que alguém tenta usá-lo.
Construir: o DNS que decide sobre dado real
O health check de failover aponta para a mesma distinção do L03: prontidão consulta dependência, vivacidade não. Um health check de failover na rota errada é o antipadrão mais silencioso desta seção — ele passa em todo teste manual e falha exatamente na hora que importa.
# route53-failover.tf — o DNS decide sobre dado real, nao sobre opiniao
#
# O health check aponta para a rota de PRONTIDAO do ALB primario (a mesma
# distincao do L03: prontidao toca dependencia, vivacidade nao). Health
# check de failover que so verifica vivacidade aprova uma regiao que esta
# de pe e nao consegue atender ninguem.
resource "aws_route53_health_check" "primario" {
fqdn = aws_lb.primario.dns_name
port = 443
type = "HTTPS"
resource_path = "/health/ready"
# A AWS so oferece dois valores para o intervalo entre checagens: 10 s
# (mais caro) ou 30 s (padrao). Aqui 30 s foi escolhido porque a parcela
# que domina o RTO deste modulo e escala_de_capacidade, nao deteccao.
request_interval = 30
failure_threshold = 3
tags = { Nome = "cadencia-primario-us-east-1" }
}
resource "aws_route53_record" "primario" {
zone_id = aws_route53_zone.cadencia.zone_id
name = "api.cadencia.example"
type = "A"
set_identifier = "primario"
# TTL baixo de proposito: a documentacao da AWS recomenda reduzir o TTL
# do registro de failover ANTES de um failover, justamente para acelerar
# a parcela propagacao_de_dns da formula acima.
ttl = 30
failover_routing_policy {
type = "PRIMARY"
}
health_check_id = aws_route53_health_check.primario.id
records = [aws_lb.primario.dns_name]
}
resource "aws_route53_record" "secundario" {
zone_id = aws_route53_zone.cadencia.zone_id
name = "api.cadencia.example"
type = "A"
set_identifier = "secundario"
ttl = 30
failover_routing_policy {
type = "SECONDARY"
}
# SEM health_check_id proprio aqui de proposito: o registro SECONDARY so e
# devolvido quando o PRIMARY falha, e ele proprio nao precisa de outro
# health check apontando para si mesmo para isso funcionar.
records = [aws_lb.secundario.dns_name]
}
TTL baixo é decisão deliberada, não sobra de configuração
O TTL de 30 segundos nos dois registros existe para que a parcela propagação_de_dns da fórmula não vire o gargalo. TTL alto — os 3.600 s do padrão de muitos provedores — economiza consulta de DNS todo dia normal e cobra exatamente no dia do incidente, quando clientes com a resposta antiga em cache continuam batendo na região morta minutos depois de o Route 53 já ter mudado.
Construir: capacidade quente na região de DR
Warm standby só é warm se a aplicação já estiver rodando antes do desastre. Isso exige que a imagem exista nas duas regiões — não só a task definition apontando para ela.
# warm-standby.tf — a segunda regiao ja de pe, em capacidade reduzida
#
# A imagem precisa existir nas DUAS regioes. Isto usa replicacao entre
# registros do ECR (configurada uma vez, no repositorio); sem ela, o
# `docker pull` da task em us-west-2 falha exatamente no momento em que
# ninguem tem tempo de descobrir por que.
resource "aws_ecr_replication_configuration" "cadencia" {
replication_configuration {
rule {
destination {
region = "us-west-2"
registry_id = data.aws_caller_identity.atual.account_id
}
}
}
}
resource "aws_ecs_service" "api_dr" {
provider = aws.regiao_dr
name = "cadencia-api-dr"
cluster = aws_ecs_cluster.dr.id
task_definition = aws_ecs_task_definition.api_dr.arn
launch_type = "FARGATE"
# Capacidade QUENTE: pequena, mas rodando o tempo todo. E a diferenca
# estrutural em relacao a pilot light, onde este numero seria 0.
desired_count = 1
deployment_minimum_healthy_percent = 100
deployment_maximum_percent = 200
network_configuration {
subnets = aws_subnet.privada_dr[*].id
security_groups = [aws_security_group.task_dr.id]
assign_public_ip = false
}
load_balancer {
target_group_arn = aws_lb_target_group.api_dr.arn
container_name = "api"
container_port = 8080
}
}
# O que permite crescer RAPIDO quando o trafego real chegar apos o failover
# — sem este recurso, "escalar" significa alguem mudando desired_count a mao.
resource "aws_appautoscaling_target" "api_dr" {
provider = aws.regiao_dr
max_capacity = 12 # mesmo teto de producao herdado do L06
min_capacity = 1
resource_id = "service/${aws_ecs_cluster.dr.name}/${aws_ecs_service.api_dr.name}"
scalable_dimension = "ecs:service:DesiredCount"
service_namespace = "ecs"
}
resource "aws_appautoscaling_policy" "api_dr_cpu" {
provider = aws.regiao_dr
name = "cadencia-api-dr-cpu"
policy_type = "TargetTrackingScaling"
resource_id = aws_appautoscaling_target.api_dr.resource_id
scalable_dimension = aws_appautoscaling_target.api_dr.scalable_dimension
service_namespace = aws_appautoscaling_target.api_dr.service_namespace
target_tracking_scaling_policy_configuration {
predefined_metric_specification {
predefined_metric_type = "ECSServiceAverageCPUUtilization"
}
target_value = 60
scale_in_cooldown = 300
scale_out_cooldown = 60 # assimetrico de proposito: subir rapido apos um failover, descer com calma
}
}
Sem replicação de imagem, "capacidade quente" é decoração
A task definition da região de DR pode estar perfeita e o serviço, saudável em zero réplicas — mas se a imagem nunca foi replicada para o registro de us-west-2, o `docker pull` da primeira task falha exatamente no momento em que ninguém tem tempo de investigar por quê. `aws_ecr_replication_configuration` é a linha que fecha esse buraco, e é fácil esquecer porque o resto do desenho funciona sem ela até o dia do failover.
Construir: a proteção que a réplica não oferece
Este bloco existe mesmo com o Aurora Global no ar, e a razão é a mesma do L10: réplica propaga erro, backup permite voltar a um instante anterior a ele.
# backup-crossregion.tf — protecao contra corrupcao, independente da regiao
#
# Isto continua existindo mesmo com Aurora Global no ar. A replica propaga
# um DELETE sem WHERE para us-west-2 em poucos segundos — o mesmo incidente
# do L10, so que agora replicado. Quem protege contra ISSO e o PITR, nao a
# replica.
resource "aws_backup_vault" "primario" {
name = "cadencia-vault-primario"
kms_key_arn = aws_kms_key.backup.arn
}
resource "aws_backup_vault" "dr" {
provider = aws.regiao_dr
name = "cadencia-vault-dr"
kms_key_arn = aws_kms_key.backup_dr.arn
}
resource "aws_backup_plan" "cadencia" {
name = "cadencia-pitr-cross-region"
rule {
rule_name = "diario-com-copia-cross-region"
target_vault_name = aws_backup_vault.primario.name
schedule = "cron(0 3 * * ? *)"
copy_action {
destination_vault_arn = aws_backup_vault.dr.arn
lifecycle {
delete_after = 35
}
}
lifecycle {
delete_after = 35
}
}
}
resource "aws_backup_selection" "cadencia" {
iam_role_arn = aws_iam_role.backup.arn
name = "cadencia-cluster-global"
plan_id = aws_backup_plan.cadencia.id
resources = [aws_rds_cluster.primario.arn]
}
Por que a Cadência mantém as duas coisas, e o custo disso
Réplica e backup resolvem falhas diferentes: a réplica resolve "a região sumiu"; o backup resolve "alguém apagou o que não devia, e a região não sumiu". Manter os dois dobra o custo de armazenamento de proteção de dado — um vault por região —, e é um custo que este módulo aceita porque a alternativa (perder pedidos por um `DELETE` sem `WHERE` propagado às duas regiões) é pior.
Construir: o programa que promove o secundário, e a política que ele usa
Este programa executa só a parcela `promoção_do_dado` da fórmula. Escala de capacidade e troca de DNS correm em paralelo, por mecanismos próprios — combiná-los num único script esconderia qual parcela demorou o quê.
// FailoverRegional/Program.cs — promove o secundario, e grava um marco por
// etapa, no mesmo espirito do roteiro cronometrado do L10.
//
// Fica de fora de proposito: chamar isto sozinho nao e "o failover" — e so a
// parcela `promocao_do_dado` da formula. Escala de capacidade (o
// Auto Scaling do ECS) e troca de DNS (o health check do Route 53) correm
// em paralelo, cada um pelo seu proprio mecanismo.
using System.Text.Json;
using Amazon.RDS;
using Amazon.RDS.Model;
var globalClusterId = args.ElementAtOrDefault(0)
?? throw new ArgumentException("uso: FailoverRegional <global-cluster-identifier> <cluster-arn-destino>");
var clusterArnDestino = args.ElementAtOrDefault(1)
?? throw new ArgumentException("informe o ARN do cluster que sera promovido");
using var rds = new AmazonRDSClient(Amazon.RegionEndpoint.USEast1); // a chamada de failover roda a partir da regiao PRIMARIA
var marcos = new List<object>();
void Marco(string nome, object? extra = null) =>
marcos.Add(new { nome, instante = DateTimeOffset.UtcNow.ToString("O"), extra });
Marco("failover_solicitado", new { globalClusterId, clusterArnDestino });
// FailoverGlobalCluster e o FAILOVER GERENCIADO: usado quando a regiao
// primaria esta INDISPONIVEL. Para uma troca planejada com as duas regioes
// saudaveis, o metodo correto e SwitchoverGlobalCluster (RPO zero) — sao
// operacoes DIFERENTES, e usar failover para uma troca planejada descarta
// dado sem necessidade nenhuma.
//
// AllowDataLoss=true e a contrapartida programatica da flag --allow-data-loss
// da CLI: e a confirmacao explicita de que voce aceita perder as transacoes
// que ainda nao tinham replicado no instante da promocao. (Confira o nome
// exato da propriedade na versao do AWS SDK for .NET que voce usa — nao foi
// possivel confirmar a assinatura exata do SDK na documentacao consultada
// para este modulo, so o comportamento equivalente na CLI/API.)
var resposta = await rds.FailoverGlobalClusterAsync(new FailoverGlobalClusterRequest
{
GlobalClusterIdentifier = globalClusterId,
TargetDbClusterIdentifier = clusterArnDestino,
AllowDataLoss = true,
});
Marco("failover_aceito", new { status = resposta.GlobalCluster.Status });
// A API aceita o pedido e devolve antes de a promocao terminar. O RTO real
// so para de contar quando o cluster novo aceita ESCRITA — por isso o laco
// abaixo consulta o estado, em vez de confiar na resposta imediata.
while (true)
{
await Task.Delay(TimeSpan.FromSeconds(5));
var descricao = await rds.DescribeGlobalClustersAsync(new DescribeGlobalClustersRequest
{
GlobalClusterIdentifier = globalClusterId,
});
var estado = descricao.GlobalClusters.Single().Status;
Marco("polling", new { estado });
if (estado == "available")
{
Marco("failover_concluido");
break;
}
}
var caminho = $"marcos-failover-{DateTimeOffset.UtcNow:yyyyMMdd-HHmmss}.json";
await File.WriteAllTextAsync(caminho, JsonSerializer.Serialize(marcos, new JsonSerializerOptions { WriteIndented = true }));
Console.WriteLine($"marcos gravados em {caminho}");
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PromoverClusterGlobal",
"Effect": "Allow",
"Action": [
"rds:FailoverGlobalCluster",
"rds:SwitchoverGlobalCluster",
"rds:DescribeGlobalClusters"
],
"Resource": "arn:aws:rds::111122223333:global-cluster:cadencia-global"
},
{
"Sid": "LerAtrasoDeReplicacao",
"Effect": "Allow",
"Action": ["cloudwatch:GetMetricData", "cloudwatch:GetMetricStatistics"],
"Resource": "*"
}
]
}
A flag que aceita perder dado não pode ser reflexo
`AllowDataLoss = true` (a contrapartida programática do `--allow-data-loss` da CLI) é a confirmação explícita de que a promoção aceita descartar transações ainda não replicadas. Chamar esta operação numa manutenção planejada, com as duas regiões saudáveis, joga fora dado sem necessidade — o comando certo para esse caso é switchover, que não tem essa flag porque não precisa dela: ele sincroniza antes de trocar.
Implantar, e provar RTO e RPO com número
#!/usr/bin/env bash
# implantar-dr.sh — sobe as duas regioes; a ordem importa
set -euo pipefail
PROJETO="${PROJETO:?defina PROJETO}"
REGIAO_PRIMARIA="us-east-1"
REGIAO_DR="us-west-2"
echo "== 1/3: cluster global e as duas regioes de banco =="
terraform apply -target=aws_rds_global_cluster.cadencia \
-target=aws_rds_cluster.primario -target=aws_rds_cluster_instance.primario \
-auto-approve
# o secundario so pode ser criado DEPOIS de o primario existir — e por isso
# que este script nao aplica tudo de uma vez.
terraform apply -target=aws_rds_cluster.secundario -target=aws_rds_cluster_instance.secundario \
-auto-approve
echo "== 2/3: capacidade quente em us-west-2 =="
terraform apply -target=aws_ecs_service.api_dr -target=aws_appautoscaling_target.api_dr \
-target=aws_appautoscaling_policy.api_dr_cpu -auto-approve
echo "== 3/3: DNS de failover e backup cross-region =="
terraform apply -target=aws_route53_health_check.primario -target=aws_route53_record.primario \
-target=aws_route53_record.secundario -target=aws_backup_plan.cadencia -auto-approve
echo "no ar: ${REGIAO_PRIMARIA} ativa, ${REGIAO_DR} quente"
Cinco provas. Nenhuma aceita "o console mostrou verde" como resultado — cada uma tem um número ou um estado esperado, e a quinta é a que mais gente esquece de fazer depois de um failover que "pareceu" funcionar.
# provas-dr.sh — cinco medicoes; nenhuma conclusao vem de "o console mostrou verde"
PROJETO=cadencia; PRIMARIA=us-east-1; DR=us-west-2
# ── Prova 1: o RPO real da MINIMA (backup/restore), medido de verdade ────────
# Distancia entre o instante do desastre simulado e a copia cross-region mais
# recente do AWS Backup. Esperado: proximo de 24h no pior caso, contra a 1h
# que o runbook antigo promete.
ULTIMA_COPIA=$(aws backup list-recovery-points-by-backup-vault --region "$DR" \
--backup-vault-name "${PROJETO}-vault-dr" \
--query 'sort_by(RecoveryPoints,&CreationDate)[-1].CreationDate' --output text)
echo "ultima copia cross-region: ${ULTIMA_COPIA}"
# ── Prova 2: o RTO real da MINIMA, cronometrado ponta a ponta ────────────────
# Cronometra do 'terraform apply' na regiao vazia ate o primeiro 200 na nova
# URL. E o numero que confronta o "RTO: 4h" do documento.
INICIO=$(date +%s)
terraform -chdir=infra-dr-minima apply -auto-approve
until curl -sf "https://dr.${PROJETO}.example/health/ready"; do sleep 5; done
FIM=$(date +%s)
echo "RTO medido da minima: $(( (FIM - INICIO) / 60 )) minutos"
# ── Prova 3: o RPO real da PRODUCAO — o atraso de replicacao do Aurora Global ─
aws cloudwatch get-metric-statistics --region "$DR" \
--namespace AWS/RDS --metric-name AuroraGlobalDBReplicationLag \
--dimensions Name=DBClusterIdentifier,Value="${PROJETO}-secundario" \
--start-time "$(date -u -d '10 min ago' +%FT%TZ)" --end-time "$(date -u +%FT%TZ)" \
--period 60 --statistics Maximum --query 'Datapoints[].Maximum'
# Esperado: valores na casa de segundos ou menos, medidos em milissegundos.
# Acima de 5000 ms (o limiar do alarme) o RPO exigido pela diretoria ja nao
# esta sendo cumprido.
# ── Prova 4: o RTO real da PRODUCAO — failover promovido e medido ────────────
dotnet run --project FailoverRegional -- "${PROJETO}-global" \
"arn:aws:rds:${DR}:$(aws sts get-caller-identity --query Account --output text):cluster:${PROJETO}-secundario"
# O arquivo marcos-failover-*.json grava o instante de cada etapa. RTO_promocao
# = failover_concluido - failover_solicitado. Compare contra os 30 min do requisito.
# ── Prova 5: o Route 53 realmente desviou, sem intervencao manual no DNS ─────
dig +short api.cadencia.example
# Esperado, com a regiao primaria fora do ar: o endereco devolvido resolve
# para o ALB de us-west-2. Se ainda resolver para o ALB de us-east-1 depois
# do health check ter marcado insalubre, o problema mais comum e TTL alto em
# cache de resolvedor de terceiros — nao no registro do Route 53 em si.
| Prova | Comando | Resultado que aprova | O que reprova, e o que significa |
|---|---|---|---|
| 1 · RPO real da mínima | `list-recovery-points-by-backup-vault` | distância entre desastre e última cópia próxima de 24h no pior caso | se a distância for muito maior, o agendamento do backup não está rodando como configurado |
| 2 · RTO real da mínima | cronômetro em torno da restauração completa | um número, em horas, medido — não "cerca de 4 horas" copiado do documento | se o script travar antes de terminar, o runbook em prosa tinha um passo que a automação não cobre |
| 3 · RPO real da produção | `get-metric-statistics` em `AuroraGlobalDBReplicationLag` | valores medidos em milissegundos, dentro do limiar de 5.000 ms do alarme | acima do limiar, o RPO exigido pela diretoria já não está sendo cumprido — mesmo sem nenhum desastre acontecer |
| 4 · RTO real da produção | `FailoverRegional` e o `marcos-failover-*.json` gerado | a diferença entre `failover_concluido` e `failover_solicitado` abaixo dos 30 min | se passar disso, meça cada marco separadamente — a parcela mais provável de estar lenta é escala_de_capacidade, não a promoção do banco |
| 5 · O DNS realmente desviou | `dig +short api.cadencia.example` | o endereço devolvido resolve para o ALB de us-west-2 | se ainda resolver para us-east-1 minutos depois do health check falhar, suspeite de TTL alto em cache de resolvedor de terceiros antes de suspeitar do Route 53 |
Quebrar de propósito: três falhas e o diagnóstico
As três acontecem de verdade, em contas reais, e nenhuma delas exige que a região primária realmente caia — é possível provocar as três num ambiente de teste.
| Falha | Como provocar | Sintoma | Onde olhar | Correção |
|---|---|---|---|---|
| Failover usado numa troca planejada | rode `FailoverGlobalCluster` (com `AllowDataLoss`) com as duas regiões saudáveis, em vez de `SwitchoverGlobalCluster` | transações recentes desaparecem mesmo sem nenhum outage real ter acontecido | CloudTrail no evento `FailoverGlobalCluster`, comparado ao AWS Health Dashboard no mesmo horário | use switchover sempre que as duas regiões estiverem saudáveis; failover é só para outage confirmado |
| TTL de DNS alto mascarando o failover | suba o TTL dos registros para 3.600 s antes do ensaio | parte dos clientes continua batendo na região morta minutos depois de o Route 53 já apontar para a região de DR | `dig` em resolvedores diferentes, comparando o TTL restante | baixar o TTL para segundos antes de qualquer ensaio ou incidente real |
| Health check de failover na rota de vivacidade | aponte `resource_path` para `/health/live` em vez de `/health/ready` | o Route 53 continua considerando a região primária saudável mesmo com o banco primário inacessível para a aplicação | compare a resposta de `/health/live` e `/health/ready` com o banco desligado | health check de failover sempre na rota de prontidão, nunca na de vivacidade |
O cenário que nenhuma das três proteções deste módulo cobre sozinha
Se a aplicação antiga continuar aceitando escrita na região com outage enquanto a nova primária já aceita escrita na região de DR — porque alguém não tirou a região antiga do ar antes do failover, ou porque o "write fencing" da promoção não conseguiu bloquear a tempo —, as duas regiões passam a ter versões divergentes do mesmo pedido. É split-brain, é dado real perdido ou duplicado, e é o motivo pelo qual a documentação da AWS recomenda tirar a aplicação do ar na região com outage antes de confirmar o failover, não depois.
A Cadência mantém, na região secundária, um cluster Aurora Global sempre replicando e um serviço ECS com `desired_count = 0` — nada rodando até o failover. Essa configuração corresponde a qual estratégia de DR?
Segurança: os riscos que só existem porque há duas regiões
Cada risco abaixo é específico de operar duas regiões simultaneamente — os riscos do L01/L03/L15 continuam valendo e não estão repetidos aqui.
| Risco | Probabilidade | Impacto | Controle preventivo | Detecção | Resposta |
|---|---|---|---|---|---|
| Split-brain: escrita aceita nas duas regiões após failover mal coordenado | baixa | alto | tirar a aplicação do ar na região com outage ANTES do failover; usar o endpoint global de escrita, não o endpoint regional | CloudTrail e comparação de IDs de pedido divergentes entre regiões | reconciliar ou descartar transações conflitantes manualmente — é o pior cenário, e é por isso que a confirmação humana existe |
| Failover desnecessário por falso positivo do health check | média | médio | confirmação humana antes de promover; o quórum de 18% do Route 53 já filtra ruído de rede local a um verificador | alarme de failover disparado sem outage correspondente no AWS Health Dashboard | switchover de volta (RPO zero) assim que o falso alarme for confirmado |
| Uso de `--allow-data-loss` numa manutenção planejada | média | alto | runbook explícito: rotina usa switchover; só incidente confirmado usa failover | CloudTrail no evento `FailoverGlobalCluster` fora de uma janela de incidente declarado | nenhuma automática — o dado já se perdeu; aqui o que importa é prevenção, não resposta |
| Segredo do banco desatualizado na região secundária | média | alto | segredo replicado ou injetado pelo pipeline nas duas regiões, nunca hardcoded na imagem | falha de autenticação da aplicação logo após uma promoção | sincronizar o segredo nas duas regiões antes do próximo ensaio |
| Automação de failover com privilégio amplo demais | baixa | alto | política restrita ao ARN do cluster global específico onde a ação suporta recurso | CloudTrail de chamada RDS fora do papel esperado | revisar e restringir a política até o ARN exato |
| Vault de backup na região de DR com KMS compartilhado ou policy permissiva | baixa | médio | CMK própria por região e vault policy restritiva | AWS Config sobre a configuração do vault | recriar o vault com a policy correta e um backup novo |
O `*` que aparece na política, e por que ele se justifica
`cloudwatch:GetMetricData` e `cloudwatch:GetMetricStatistics` não suportam permissão em nível de recurso — a AWS não oferece ARN por métrica individual, então restringir essas duas ações a um recurso específico simplesmente não é possível. As duas ações de RDS na mesma política, com ARN do cluster global, não precisariam dessa exceção. A regra não é "nunca use `*`" — é "todo `*` tem de ter uma frase explicando por que não pode ser mais estreito".
Observabilidade: as perguntas que o painel de DR tem de responder
Um painel de DR tem uma função estreita: dizer, a qualquer momento, se a Cadência está dentro do RPO prometido e se a região de DR continua pronta para assumir. Métrica que não ajuda nessa resposta pertence a outro painel.
| Pergunta | Métrica ou consulta | O que significa mudar | Limiar inicial |
|---|---|---|---|
| A réplica está dentro do RPO? | `AuroraGlobalDBReplicationLag` | atraso crescente é sinal de saturação de escrita no primário ou de rede entre regiões | > 5.000 ms por 3 períodos de 1 min |
| A região de DR continua saudável? | health check secundário do Route 53 | se a região de DR cai, o failover perde para onde ir | qualquer falha, alerta imediato — diferente do primário, aqui não há "para onde desviar" |
| O registro DNS está apontando para onde deveria? | consulta periódica de `dig` | mudança inesperada indica failover disparado sem confirmação registrada | qualquer mudança fora de um ensaio ou incidente conhecido |
| A imagem está replicada nas duas regiões? | evento de replicação do ECR | atraso aqui é o que faz o `docker pull` falhar no pior momento | replicação com mais de 1 h de atraso |
| O backup cross-region está correndo? | `list-recovery-points-by-backup-vault` na região DR | ausência de cópia recente é backup silenciosamente quebrado | nenhuma cópia nova em mais de 25 h |
| Quem disparou o último failover ou switchover? | CloudTrail em `FailoverGlobalCluster` e `SwitchoverGlobalCluster` | qualquer chamada fora de um ensaio agendado ou incidente declarado | qualquer identidade fora da automação esperada |
A métrica que só significa algo LOGO APÓS uma promoção
Ler `AuroraGlobalDBReplicationLag` no cluster que acabou de ser promovido a primário não faz sentido: um primário não tem "atraso de replicação" em relação a si mesmo. A métrica útil, nos minutos seguintes a um failover, é o atraso dos NOVOS secundários — inclusive a antiga região primária, quando ela volta e é readicionada. Confundir isso gera alarme sem sentido logo depois de um failover que funcionou.
Escala: da AZ que já foi resolvida à região que ainda não tinha sido
| Cenário | O que acontece | O que passa a doer | O que fazer |
|---|---|---|---|
| Falha de uma AZ dentro da região ativa | Multi-AZ do Aurora e do ECS absorve sozinho | nada — é o L57, já resolvido antes deste módulo começar | nada; este módulo não repete esse trabalho |
| 10× o volume de escrita (9 mil → 90 mil pedidos/dia) | o atraso de replicação cresce sob carga, ainda dentro do limiar na maioria das janelas | picos de campanha podem empurrar o RPO medido para perto do limiar de 5.000 ms | medir o atraso DURANTE um pico real, não só em vazio — é a lacuna que a seção de provas deste módulo ainda não fecha sozinha |
| Mais regiões secundárias | cada uma soma custo de capacidade quente e de transferência de dado entre regiões | operar N réplicas e N alarmes de atraso, um por região | só adicionar região quando o requisito for algo que duas não resolvem — ex.: latência de leitura para um mercado geograficamente distante |
| Falha da região primária (o cenário deste módulo) | o failover promove a região de DR; RTO passa a depender da estratégia escolhida, não de sorte | a capacidade quente precisa aguentar o tráfego REAL, não só o health check | ensaiar o failover sob carga simulada, não só com o sistema ocioso |
| Falha simultânea das duas regiões | fora do escopo de qualquer estratégia com duas regiões | não há terceira região para onde ir | aceito como limite conhecido para o requisito atual — ver a dívida registrada na seção de decisões |
O motivo de este módulo não repetir a tabela de carga do L15
A escala de REQUISIÇÃO por segundo já foi resolvida pelo Aurora Serverless v2 e pelo Auto Scaling do ECS, dentro de uma região — isso é o L06 e o L15, e continua valendo igual nas duas regiões deste módulo. O eixo novo aqui não é volume, é RESILIÊNCIA GEOGRÁFICA: quantas regiões, e o que cada uma custa parada.
Custo: o preço de manter uma segunda região sempre acesa
Ao contrário do L03 — o laboratório mais barato da série —, este é dos mais caros: warm standby paga capacidade real, todo santo dia, mesmo sem nenhum incidente. É um custo deliberado, e vale entender exatamente por quê.
| Cenário | Volume | O que acrescenta | Tendência | Otimização |
|---|---|---|---|---|
| Protótipo (ensaio único) | ambiente de teste, sem tráfego real | capacidade mínima do secundário (Aurora Serverless em 0,5 ACU, 1 task ECS) | baixa e previsível | desligar entre ensaios se o requisito de RTO permitir |
| Produção — warm standby | 900 lojas, capacidade reduzida sempre viva | Aurora secundário rodando 24/7, 1+ task ECS sempre de pé, ALB na segunda região, transferência de dado da réplica | fixa e contínua, independente de incidente | revisar anualmente se o requisito de RTO ainda pede warm standby ou já comportaria pilot light |
| Alta escala — mais de uma região secundária | expansão para um terceiro mercado geográfico | cada região nova soma capacidade quente e réplica própria | cresce linearmente por região adicionada | só adicionar quando o requisito for algo que a região atual não resolve |
| Dimensão | Cobra por | Cuidado |
|---|---|---|
| Capacidade ECS na região de DR | vCPU-segundo e GB-segundo, 24 horas por dia | é o item que warm standby paga e pilot light não — compare contra o custo do RTO mais alto do pilot light antes de decidir |
| Aurora Serverless v2 secundário | ACU-hora, mesmo em capacidade mínima | nunca chega a zero como o ECS poderia; é sempre pelo menos o piso configurado |
| Transferência de dado entre regiões | GB replicado, saída de uma região para outra | cresce com o volume de escrita — é proporcional ao negócio, não fixo |
| AWS Backup, dois vaults | GB-mês retido, em cada região | dobra o custo de armazenamento de backup em relação a uma região só |
| Route 53 health check e registros | por health check-mês e por consulta | valor pequeno e fixo; não é onde se otimiza |
| ECR replicado | armazenamento na segunda região mais transferência da replicação | cresce com o número de imagens retidas — o ciclo de vida do L03 se aplica nas duas regiões |
O custo oculto que a fatura de infraestrutura não mostra
O maior custo de um plano de DR nunca ensaiado não aparece em nenhuma linha da AWS: é o RTO real, descoberto pela primeira vez durante um incidente de verdade, sendo maior que o prometido para clientes e para a diretoria. O gasto mensal com capacidade quente é o preço, medido e previsível, de nunca mais descobrir isso do jeito caro.
Well-Architected nos seis pilares
| Pilar | Situação ao fim deste laboratório | Risco que fica | Melhoria | Prioridade |
|---|---|---|---|---|
| Excelência operacional | failover ensaiado com marcos gravados; runbook executável, não só em prosa | o ensaio até aqui é único — repetibilidade não está comprovada | agendar ensaio periódico (game day) com o mesmo roteiro cronometrado | alta |
| Segurança | segredo por referência nas duas regiões, CMK dedicada por região, IAM restrito ao cluster global | split-brain continua possível se alguém pular a etapa de tirar a região com outage do ar | automatizar write fencing dentro do próprio runbook de failover | alta |
| Confiabilidade | RTO e RPO medidos e comparados ao requisito, não estimados | apenas duas regiões — uma falha composta das duas não tem para onde ir | aceito como limite conhecido para o requisito atual (ver seção de decisões) | média |
| Eficiência de performance | capacidade quente dimensionada pela medição de campanha herdada do L15 | capacidade reduzida pode não bastar sob o pico REAL de um failover em produção | ensaiar failover durante carga simulada, não só com o sistema ocioso | média |
| Otimização de custos | warm standby escolhido com justificativa registrada, não por padrão | crescer para multi-site ativo-ativo sem um requisito novo que justifique | revisar anualmente se o requisito de RTO ainda pede warm standby | baixa |
| Sustentabilidade | capacidade quente é o mínimo que atende o requisito, não um teto arbitrário | capacidade ociosa 24/7 consome recursos mesmo sem uso | avaliar se partes não críticas da aplicação bastariam com pilot light | baixa |
Evolução em níveis: o que muda quando o requisito de RTO aperta
A terceira arquitetura não é um desenho: é a resposta a QUANDO trocar de estratégia de DR. Cada nível resolve um risco e compra outro, e a segunda coluna — o novo risco — é a que raramente se escreve.
Backup/restore cross-region agendado, sem nenhum ensaio. É a arquitetura mínima deste módulo, e continua legítima para carga que aceita RTO em horas.Pilot light ou warm standby com Aurora Global Database e Route 53 de failover, com failover ensaiado e cronometrado de verdade.Failover semi-automatizado — health check mais confirmação humana assistida por runbook executável — com ensaio trimestral agendado e fallback documentado.Parte do tráfego — leitura de catálogo, conteúdo estático — passa a ser servida das duas regiões simultaneamente, com roteamento por latência; a escrita continua concentrada.Toda nova carga da Cadência nasce com um blueprint de duas regiões (módulo Terraform compartilhado), catálogo de RTO/RPO por camada de criticidade, orçamento de DR aprovado por padrão.O histórico de ensaios de failover e de incidentes reais vira DADOS: RTO medido por trimestre, causa de cada indisponibilidade, região mais afetada. Um MODELO simples sobre esse histórico ajuda a decidir QUANDO subir de warm standby para ativo-ativo — não decide o failover em si, que continua sendo checagem determinística de saúde mais confirmação humana.A ordem não é negociável, e o motivo é concreto
Multi-site ativo-ativo no nível 4 depende de saber medir RTO e RPO com confiança — que é o nível 2 — e de ter um runbook testado sob pressão real — que é o nível 3. Quem tenta ativo-ativo antes de ter ensaiado sequer um failover simples está resolvendo um problema mais difícil sem ter comprovado que resolve o mais fácil.
Onde IA entra nesta arquitetura, e onde não entra
Neste módulo, IA não decide o failover, e forçá-la a decidir seria o antipadrão que a própria série critica. A pergunta "esta região caiu de verdade?" tem resposta determinística — quórum de health check mais confirmação humana —, e um modelo probabilístico no meio dessa decisão troca um sinal exato por um que pode errar com confiança, exatamente no momento de maior custo do erro.
Há um lugar onde IA acrescentaria valor real, e ele é de longo prazo, não operacional: ajudar a decidir QUANDO subir de estratégia. Hoje a Cadência decidiu "warm standby" uma vez, com os números que tinha. Um modelo sobre o histórico de ensaios e incidentes — RTO medido por trimestre, custo de cada minuto de indisponibilidade, frequência de eventos regionais da AWS — poderia sinalizar quando o retorno de subir para ativo-ativo passa a compensar o custo.
| Pergunta | Resposta honesta para este módulo |
|---|---|
| Qual problema a IA resolveria? | quando vale subir de warm standby para ativo-ativo, com base em dado histórico em vez de intuição |
| Por que uma regra não bastaria? | uma regra bastaria para começar: "RTO medido estourou o requisito duas vezes no ano → revisar estratégia" cobre a maior parte. IA só se justificaria depois que a regra simples mostrasse seu limite |
| De onde viriam os dados? | CloudTrail dos failovers e switchovers, os marcos gravados pelo `FailoverRegional`, e o histórico de incidentes — tudo já existe |
| Qual o risco? | aprender de poucos incidentes reais e recomendar investimento errado com aparência de rigor estatístico; por isso a decisão fica com humano, informada pelo modelo, nunca automática |
| Por que não agora? | porque a Cadência tem um ensaio até aqui. Modelo sobre um exemplo é opinião com aparência de dado |
O uso de IA que parece atraente e é armadilha aqui
Pedir a um modelo para "decidir se a queda é real e disparar o failover sozinho" troca um sinal determinístico — quórum de health check, que é exato e auditável — por um probabilístico, no ponto exato em que este módulo escolheu, de propósito, manter confirmação humana. Failover automático baseado em IA não é mais rápido de forma útil: a parcela que domina o RTO é escala_de_capacidade, não a decisão, e o risco de um falso positivo caro é real.
Anti-padrões deste laboratório
| Anti-padrão | Por que alguém faz | Por que é problema | Sintoma em produção | Forma correta |
|---|---|---|---|---|
| Confiar no RTO do documento sem nunca ter ensaiado | simular a perda de uma região inteira parece caro e arriscado, e ninguém agenda isso sem um gatilho externo | o número prometido é uma estimativa de quem escreveu, não uma medição | o RTO real, descoberto no primeiro desastre de verdade, é maior que o prometido | ensaiar o failover num ambiente de teste, cronometrado, antes de prometer o número |
| Failover automático 100% por health check, sem confirmação humana | parece mais "automatizado" e elimina o fator humano do tempo de resposta | um falso positivo dispara um failover desnecessário, que custa o mesmo RTO e RPO de um real | promoções que acontecem sem incidente correspondente no AWS Health Dashboard | health check decide o roteamento de DNS; promoção do banco passa por confirmação humana |
| Usar failover (com perda de dado aceita) numa troca planejada | é o primeiro comando que aparece numa busca rápida, e funciona | descarta dado desnecessariamente quando switchover, sem perda, resolveria o mesmo caso | transações recentes ausentes depois de uma manutenção que não era um incidente | switchover para qualquer troca com as duas regiões saudáveis; failover só para outage confirmado |
| Achar que Aurora Global substitui backup | "já está replicado" soa como "já está protegido" | a réplica propaga corrupção e `DELETE` para a outra região em poucos segundos | o mesmo dado errado em duas regiões, sem cópia anterior para restaurar | manter PITR do AWS Backup nas duas regiões, independente da réplica |
| Prometer RTO de pilot light sem contar o tempo de implantar a aplicação | o cálculo mental para no banco de dados e esquece a camada de aplicação | promover o banco é rápido; "ligar" a aplicação do zero, sob pressão, não é | RTO medido bem maior que o prometido, mesmo com o banco promovido rapidamente | medir o RTO ponta a ponta, banco mais aplicação, nunca só o banco |
| Ignorar TTL alto de DNS achando que o failover é instantâneo | o console mostra o registro SECONDARY ativo imediatamente, e ninguém testa com cliente real com cache | resolvedores de terceiros mantêm a resposta antiga em cache pelo tempo do TTL | parte dos clientes continua chegando à região morta minutos após o Route 53 já ter mudado | baixar o TTL do registro para segundos, de forma permanente, não só antes do ensaio |
Quando algo não funciona
| Sintoma | Causa provável | Como investigar | Onde olhar | Correção |
|---|---|---|---|---|
| Route 53 continua resolvendo para a região morta | TTL alto em cache de resolvedor de terceiros, não é o registro em si | `dig` em resolvedores diferentes, comparando o TTL restante | configuração do registro no Route 53 vs. resposta real do `dig` | baixar o TTL antes do próximo ensaio; propagação de cache de terceiros foge do controle direto |
| Failover do Aurora Global não conclui | versão de engine incompatível entre os clusters, ou algum deles insalubre | `describe-global-clusters` e o log de eventos do cluster | campo `Status` de cada membro do cluster global | alinhar versões de engine antes do ensaio; failover manual como plano B para versões incompatíveis |
| Aplicação na região secundária escreve erro de "read-only" | a promoção ainda não terminou, ou a aplicação aponta para o endpoint `-ro` | checar qual endpoint a aplicação usa contra o estado atual do cluster | string de conexão da aplicação vs. `describe-global-clusters` | usar o endpoint GLOBAL de escrita, que muda de destino sozinho após a promoção |
| RPO medido muito acima do esperado sob carga | a réplica atrasou por um pico de escrita no primário | `AuroraGlobalDBReplicationLag` no momento exato do pico, não numa janela ampla | CloudWatch, período curto, em torno do horário do pico | considerar `rds.global_db_rpo` para pausar transações até a réplica alcançar, ou aceitar explicitamente um RPO maior para picos de campanha |
| Backup cross-region vazio na região de DR | o plano de backup não tinha `copy_action`, ou aponta para o vault errado | `list-recovery-points-by-backup-vault` na região de DR | definição do `aws_backup_plan`, campo `copy_action` | corrigir o plano; a cópia cross-region não acontece por padrão, precisa ser declarada |
| Duas regiões aceitando escrita ao mesmo tempo (split-brain) | write fencing (melhor esforço da AWS) não conseguiu bloquear a região antiga a tempo | CloudTrail e comparação de registros com o mesmo identificador de pedido nas duas regiões | logs de aplicação das duas regiões no mesmo intervalo de tempo | tirar a aplicação do ar na região com outage ANTES de confirmar o failover, e reduzir o TTL do DNS para acelerar a virada de cliente |
A pergunta que resolve metade destes casos
Antes de suspeitar de bug, pergunte: isto é atraso de PROPAGAÇÃO (DNS, réplica) ou é IDENTIDADE errada (endpoint `-ro` em vez do global, versão de engine divergente)? Os sintomas de propagação se resolvem sozinhos, com tempo; os de identidade não se resolvem sozinhos nunca, porque apontam para a configuração errada.
Limpeza: o que o destroy não leva, em DUAS regiões
Este laboratório dobra a superfície de limpeza em relação a um módulo de região única — cada recurso esquecido cobra na região de DR exatamente como cobraria na primária, e é mais fácil esquecer o que está numa região onde ninguém olha o console todo dia.
#!/usr/bin/env bash
# limpar-dr.sh — a segunda regiao tem recursos que a primeira nao tem, e eles
# cobram sozinhos se ficarem esquecidos.
set -uo pipefail
PROJETO=cadencia; PRIMARIA=us-east-1; DR=us-west-2
echo "== 1: Terraform administra a maior parte =="
terraform destroy -auto-approve
# 2. CLUSTER SECUNDARIO DO AURORA GLOBAL: se o failover foi ensaiado, a
# identidade de primario/secundario pode ter INVERTIDO. Confirme QUAL
# regiao e a primaria antes de destruir, ou o destroy tenta apagar quem
# esta servindo trafego real.
aws rds describe-global-clusters --global-cluster-identifier "${PROJETO}-global" \
--query "GlobalClusters[0].GlobalClusterMembers[].{Cluster:DBClusterArn,Writer:IsWriter}" \
--output table
# 3. REGISTRO GLOBAL: um cluster global nao e removido pelo destroy dos
# clusters regionais — ele tem de ser desfeito por ultimo, depois que
# NENHUM cluster regional pertencer mais a ele.
aws rds describe-global-clusters --query "GlobalClusters[].GlobalClusterIdentifier" --output table
# 4. VAULT DE BACKUP NA REGIAO DR: guarda ate 35 dias de recovery points por
# plano. Apagar o vault sem esvaziar os recovery points falha; esvaziar
# manualmente e o passo que mais gente pula.
aws backup list-recovery-points-by-backup-vault --region "$DR" \
--backup-vault-name "${PROJETO}-vault-dr" --query "length(RecoveryPoints)" --output text
# 5. REPOSITORIO ECR REPLICADO em us-west-2: a replicacao copia a imagem;
# apagar o repositorio na regiao primaria NAO apaga a copia na regiao DR.
aws ecr describe-repositories --region "$DR" --query "repositories[].repositoryName" --output table
# 6. ALB, GRUPO DE DESTINO E ELASTIC IP eventual na regiao DR: cobram por
# hora ligada mesmo com desired_count=1 e nenhum trafego real.
aws elbv2 describe-load-balancers --region "$DR" --query "LoadBalancers[].LoadBalancerArn" --output table
# 7. Prova final: nada com a tag do projeto de pe em NENHUMA das duas regioes.
for r in "$PRIMARIA" "$DR"; do
echo "-- $r --"
aws resourcegroupstaggingapi get-resources --region "$r" \
--tag-filters Key=Projeto,Values="${PROJETO}" \
--query "ResourceTagMappingList[].ResourceARN" --output table
done
| Recurso | Sai no destroy? | Cobra parado? | Por que fica |
|---|---|---|---|
| Cluster secundário do Aurora Global | só depois de removido do cluster global | sim, por ACU-hora mínima | um cluster preso a um cluster global não pode ser destruído isoladamente — a ordem de remoção importa |
| O próprio cluster global (registro) | não junto com os clusters regionais | não, mas fica órfão | ele só desaparece depois que NENHUM cluster regional pertence mais a ele — é um passo separado, fácil de esquecer |
| Vault de backup na região de DR | só com os recovery points esvaziados antes | sim, GB-mês por até 35 dias de retenção configurada | o destroy do vault falha se houver recovery point dentro, e a mensagem de erro não deixa óbvio quantos existem |
| Repositório ECR replicado em us-west-2 | não junto com o da região primária | sim, GB-mês | a replicação copia a imagem; apagar o repositório de origem não apaga a cópia no destino |
| ALB e grupo de destino na região de DR | sim, se em Terraform | sim, por hora ligada | cobra igual ao da região primária, mesmo recebendo zero tráfego em operação normal |
| Alarme de atraso de réplica | sim, se em Terraform | centavos | criado à mão no console da região de DR não aparece no estado do Terraform da região primária |
A região que ninguém olha é a que continua cobrando por mais tempo
É comum destruir a infraestrutura da região PRIMÁRIA ao final de um ensaio, porque é ali que o time trabalha todo dia, e esquecer a região de DR — que só aparece no console quando alguém procura por ela de propósito. O resultado é capacidade quente, vault de backup e réplica de banco continuando a cobrar, sozinhos, numa região sem nenhum tráfego e sem ninguém olhando, potencialmente por meses.
Resumo: problema, peça e motivo
| Problema | Peça | Por que ela, e não outra |
|---|---|---|
| RTO nunca medido, só prometido em documento | ensaio cronometrado, ponta a ponta | um número medido é discutível; uma frase em PDF não é |
| Segunda região vazia até o desastre | capacidade ECS quente, sempre rodando | elimina o passo de implantar sob pressão, que é o que mais atrasa um RTO real |
| Escrita só existe numa região | Aurora Global Database, réplica contínua | RPO tipicamente em segundos, sem operar pipeline de replicação próprio |
| Cliente não sabe que a região caiu | Route 53 com failover_routing_policy | já é a ferramenta em uso desde o L01; decide sobre a rota de PRONTIDÃO, não de vivacidade |
| Réplica propaga erro, não só dado bom | AWS Backup com PITR nas duas regiões | protege contra corrupção e `DELETE`, que a réplica levaria para a outra região também |
| Promoção pode perder dado sem necessidade | switchover para manutenção; failover só para outage | a operação certa depende de as duas regiões estarem saudáveis ou não — nunca do hábito |
| Failover desnecessário por falso alarme | confirmação humana antes de promover | o quórum do Route 53 já filtra ruído de rede; a confirmação filtra o resto |
| Split-brain depois de um failover mal coordenado | tirar a região com outage do ar antes de promover | é o único jeito de garantir que só uma região aceita escrita por vez |
| Falha | O que a protege | O que ela NÃO protege |
|---|---|---|
| Região primária inteira fora do ar | Route 53 de failover + Aurora Global + capacidade quente | as duas regiões caindo ao mesmo tempo — sem terceira região |
| Dado apagado por engano (`DELETE` sem `WHERE`) | AWS Backup com PITR | a réplica NÃO protege — ela propaga o erro em poucos segundos |
| Falso positivo de health check | confirmação humana antes da promoção | não protege contra decisão humana lenta demais para o RTO prometido |
| Cliente preso na região morta por TTL | TTL baixo nos registros de DNS | cache de resolvedor de terceiros fora do controle direto da Cadência |
| Failover em manutenção planejada perdendo dado | usar switchover, não failover | não protege contra engenheiro que digita o comando errado — só o runbook e o treino protegem isso |
- O health check do Route 53 na rota de prontidão do ALB primário passa a falhar.
- Depois de três falhas consecutivas, o quórum de verificadores marca o primário como insalubre.
- Um humano confirma que é outage real, checando o AWS Health Dashboard.
- O failover gerenciado do Aurora Global é disparado, aceitando a perda medida de dado não replicado.
- Em paralelo, o Auto Scaling do ECS na região de DR sobe de capacidade reduzida para plena.
- O registro SECONDARY do Route 53 já estava sendo devolvido desde a falha do health check.
- A primeira escrita bem-sucedida na nova região marca o fim do RTO do incidente.
- Quando a região antiga volta, o failover gerenciado a readiciona como secundária, sozinho.
- Voltar a ser primária exige um switchover deliberado, planejado, sem perda.
Desafio — sem roteiro
O requisito
Dispare de verdade uma falha regional simulada (torne a região primária inacessível para a aplicação — por exemplo, revogando temporariamente a permissão da aplicação de escrever na região primária) e meça o RTO real obtido.
Critério de aceite — executável, não "verifique se funciona"
Um cronômetro corrido do momento da falha simulada até a aplicação voltar a responder na região secundária produz um número — e esse número é comparado por escrito contra o RTO alvo que a estratégia escolhida promete (ex: pilot light promete minutos, não segundos).
- Dica 1: A forma mais limpa de simular a falha sem derrubar a região de verdade é bloquear a rota de rede ou a permissão da aplicação especificamente para os recursos da região primária — a região continua de pé, só inacessível para o seu sistema.
- Dica 2: O RTO medido inclui a DETECÇÃO da falha, não só a troca de região — se o teste começa cronometrando a partir do failover manual, ele está medindo só uma fração do RTO real que um incidente real teria.
- Dica 3: Depois de medir, reverta a permissão/rota IMEDIATAMENTE e confirme que a aplicação volta a escrever na região primária — um DR que só testa a ida e nunca a volta esconde metade do problema.
Lembrete de limpeza
Reverter toda alteração de rede/permissão feita para simular a falha é o primeiro passo da limpeza — antes até do `terraform destroy` dos recursos novos.
Perguntas frequentes
❓ Backup/restore cross-region ainda é uma estratégia de DR válida?
❓ Qual a diferença entre pilot light e warm standby, na prática?
❓ Failover e switchover do Aurora Global Database são a mesma operação com nomes diferentes?
❓ AWS Elastic Disaster Recovery (DRS) substitui o Aurora Global Database?
❓ Por que o Route 53 não troca de região assim que o servidor primário cai?
❓ Preciso de plantão 24 horas para operar DR com warm standby?
❓ O que garante que o RTO medido no ensaio vale para um desastre real?
❓ Preciso escolher só uma das quatro estratégias de DR para sempre?
Fixando
Durante uma manutenção planejada, com as duas regiões do cluster Aurora Global saudáveis, um engenheiro executa o comando de failover com a flag que confirma perda de dado, em vez do comando de switchover. O que isso causa, na pior hipótese, mesmo com tudo saudável?
Após um ensaio de failover bem-sucedido — banco promovido, aplicação escalada, health check do Route 53 marcado como insalubre —, parte dos clientes ainda chega à região com outage por vários minutos. Qual é a explicação mais provável, dado que o registro SECONDARY já está correto no Route 53?
Conhecimentos, próximo módulo e documentação
| Item | Conteúdo |
|---|---|
| Conhecimentos anteriores necessários | L10 (RTO/RPO medidos, PITR), L15 (Aurora Serverless v2) e L57 (chaos de AZ) no ar; Terraform e .NET 8 básicos |
| Conhecimentos adquiridos | as quatro estratégias de DR e o requisito que decide cada uma; a diferença exata entre failover e switchover; o quórum do Route 53; o que a réplica cross-region não protege; RTO como soma de cinco parcelas mensuráveis |
| Limitação que fica | apenas duas regiões — uma falha composta das duas não tem para onde ir; e o ensaio até aqui foi único, não repetido em condições de carga real |
| Próximo exemplo recomendado | L99 — a última banda do catálogo, onde as peças de resiliência, custo e observabilidade construídas ao longo da série se encontram num caso de síntese |
| Também habilitado por este módulo | qualquer carga que precise declarar RTO/RPO auditável para um cliente ou regulador agora tem um roteiro ensaiado para apontar, não uma promessa em PDF |
| Data da última validação técnica | 8 de agosto de 2026 |
Documentação oficial consultada: AWS Whitepaper — Disaster Recovery Options in the Cloud, origem das quatro estratégias e do vocabulário de RTO/RPO por estratégia; Amazon RDS/Aurora User Guide — Using switchover or failover in Amazon Aurora Global Database, fonte da distinção entre as duas operações, da flag de confirmação de perda de dado e do comportamento de readição automática da região antiga como secundária; e Amazon Route 53 Developer Guide — How Amazon Route 53 determines whether a health check is healthy, fonte do quórum de mais de 18% dos verificadores e dos intervalos de checagem de 10 s ou 30 s. Os valores de preço não aparecem neste módulo por decisão: use o AWS Pricing Calculator, porque preço varia por região e envelhece mais rápido que o conteúdo.
O que não foi verificado, e você deve conferir na sua conta
O RTO de "5 horas" citado na arquitetura mínima e o RPO de "2.140 ms" no payload de exemplo são números MEDIDOS na conta de exemplo desta série, não garantias da AWS nem valores que se repetem na sua conta — a documentação da AWS caracteriza o RTO do Aurora Global Database "na ordem de minutos" e o RPO "tipicamente em segundos", como ordens de grandeza, não como compromisso numérico. O nome exato da métrica de atraso de replicação também muda por versão de engine — confirme se o seu cluster expõe `AuroraGlobalDBReplicationLag` ou `AuroraGlobalDBRPOLag` antes de copiar o alarme deste módulo. Meça no seu ambiente; não decore os números daqui.
Terminou de ler?
Marcar como concluído registra o XP, mantém sua sequência e coloca 3 cartas deste módulo na fila de revisão espaçada.
Próximos passos sugeridos
Temas deste módulo
Discussão
Carregando comentários…