AWS us-east-1 (2025): uma corrida na automação de DNS do DynamoDB derruba meia região
Entre 23:48 PDT de 19/10 e 14:20 PDT de 20/10/2025, uma condição de corrida latente na automação de DNS do DynamoDB deixou vazio o registro do endpoint regional em us-east-1, e a própria automação não conseguiu se reparar. Analiso a cascata: o EC2 perdeu leases, os health checks do NLB derrubaram serviço saudável e a recuperação de cada camada levou horas a mais que a anterior. Fecho com o que eu mudaria num sistema de pagamentos que só roda em us-east-1.
cerca de 8 min · áudio gerado ao tocar
Fatos do incidente
- Provedor
- AWS, região Northern Virginia (`us-east-1`)
- Início
- 19/10/2025, 23:48 PDT
- Fim
- 20/10/2025, 14:20 PDT (todos os serviços normalizados)
- Duração total
- Cerca de 14h30, contra cerca de 3h de indisponibilidade do DNS do DynamoDB
- Gatilho
- Condição de corrida latente na automação que gerencia o DNS do DynamoDB deixou vazio o registro de `dynamodb.us-east-1.amazonaws.com`
- Efeito em cascata
- EC2 (DropletWorkflow Manager perdeu leases, lançamento de instâncias travado), NLB (health checks falhando), Lambda, ECS, EKS, Connect, Redshift, login
- Correções anunciadas
- Automação de DNS desligada globalmente até corrigir a corrida, proteção contra plano de DNS incorreto, controle de velocidade no failover de health check do NLB, testes de escala no EC2
Depois de 16 anos construindo plataformas financeiras sobre AWS, a pergunta que esse incidente me obrigou a refazer não é "meu sistema está em várias AZs?", é "do que o meu sistema depende que eu não vejo no diagrama?". Em 20/10/2025 a resposta para metade da internet foi: um registro DNS vazio, num serviço que nem aparecia na arquitetura deles.
O que aconteceu
O DynamoDB em us-east-1 não é um conjunto de servidores atrás de um nome fixo. É uma frota enorme de load balancers, e o DNS do endpoint regional dynamodb.us-east-1.amazonaws.com é mantido por automação: um componente calcula o plano de DNS (quais load balancers, com quais pesos) e outro aplica esse plano no Route 53. Segundo o resumo da AWS, o aplicador roda de forma redundante e independente em três AZs, justamente para tolerar falha de uma delas.
Foi essa redundância que abriu a janela. Um aplicador atrasou de forma incomum enquanto aplicava um plano antigo. Nesse meio tempo, um aplicador mais rápido aplicou um plano novo e disparou a limpeza de planos considerados obsoletos. O aplicador lento terminou depois e sobrescreveu o endpoint regional com o plano antigo; a limpeza, vendo aquele plano como velho, apagou o plano. Resultado: o registro do endpoint regional ficou vazio, sem nenhum IP, e o sistema entrou num estado inconsistente que impediu a própria automação de aplicar qualquer atualização em seguida.
Isso merece uma frase própria: a automação não falhou de forma barulhenta, ela falhou em silêncio e depois travou. Não houve erro de API do Route 53, não houve deploy ruim de alguém. Duas execuções corretas, em ordem errada, produziram um estado que nenhuma delas sabia consertar. A reparação exigiu intervenção manual de operadores.
A partir de 23:48 PDT de 19/10, todo cliente que resolvia o endpoint regional recebia resposta vazia. Isso inclui clientes externos, e inclui o próprio control plane da AWS: vários serviços internos guardam estado no DynamoDB. Às 02:25 PDT a informação de DNS foi restaurada, e a recuperação de quem dependia diretamente do DynamoDB veio conforme os caches de DNS expiravam. Se a história terminasse aí, seria um incidente de pouco menos de três horas. Ela não terminou aí.
Linha do tempo (PDT, segundo o resumo da AWS)
- 1
19/10, 23:48
O registro DNS do endpoint regional do DynamoDB fica vazio. Chamadas ao DynamoDB em
us-east-1começam a falhar, de clientes e de serviços internos da AWS. - 2
20/10, 02:25
Operadores restauram manualmente a informação de DNS. A recuperação do DynamoDB acompanha a expiração dos caches de DNS nos clientes.
- 3
Madrugada
O DropletWorkflow Manager do EC2, que mantém leases com os servidores físicos e depende do DynamoDB, tinha perdido leases durante a janela. Ao tentar restabelecê-las todas ao mesmo tempo, entra em sobrecarga; lançamentos de instâncias seguem falhando.
- 4
Manhã
Instâncias novas sobem sem estado de rede propagado. Os health checks do NLB passam a falhar e tiram de serviço capacidade que estava saudável, ampliando o impacto para Lambda, ECS, EKS, Connect, Redshift e login.
- 5
Manhã e início da tarde
Engenheiros aplicam throttling, reiniciam hosts do gerenciador e desligam o failover automático de health check do NLB para estancar a remoção de capacidade.
- 6
20/10, 14:20
EC2 e os serviços dependentes voltam ao normal. Fim do evento, cerca de 14h30 após o início.
Fluxo de falha: do DNS vazio ao NLB derrubando capacidade saudável
Reconstrução simplificada a partir do resumo oficial. Setas tracejadas são o efeito em cascata.
- DNS Planner · calcula o plano
- Enactor (AZ lenta) · aplica plano antigo
- Enactor (AZ rápida) · aplica plano novo + limpeza
- Route 53 · registro regional VAZIO
- DynamoDB · endpoint regional
- EC2 DropletWorkflow Manager · leases com servidores físicos
- EC2 · lançamento de instâncias
- NLB · health checks
- Lambda, ECS, EKS · Connect, Redshift, login
- Apps de clientes · em us-east-1
Causa raiz
Uma condição de corrida latente entre aplicadores independentes de plano de DNS. Não havia verificação de que o plano sendo aplicado ainda era mais novo que o vigente, nem trava contra aplicar um plano que deixasse o endpoint sem nenhum registro. A limpeza de planos obsoletos completou o estrago, e o estado inconsistente bloqueou a automação de se reparar. O agravante não é a corrida, é a ausência de um invariante simples: "um endpoint regional nunca pode ficar vazio".
Por que três horas viraram quatorze
A parte mais instrutiva do resumo não é a corrida no DNS. É o que veio depois que o DynamoDB voltou.
Recuperar o serviço não é drenar o backlog. O DropletWorkflow Manager do EC2 mantém leases com cada servidor físico que hospeda instâncias. Essas leases ficam em DynamoDB. Durante as três horas de DNS vazio, as verificações de estado falharam e as leases expiraram. Quando o DynamoDB voltou, o gerenciador tentou restabelecer a frota inteira de uma vez. O volume foi tão grande que o trabalho passou a expirar antes de terminar, gerando nova fila de trabalho: colapso congestivo. O serviço de que ele dependia estava saudável e ele continuava travado.
O mecanismo de proteção amplificou a falha. Com o EC2 voltando, instâncias novas subiam sem o estado de rede propagado. Os health checks do NLB enxergavam esses alvos como ruins e faziam failover, tirando capacidade de serviço. O failover automático, feito para isolar nó doente, passou a remover capacidade em velocidade maior que a capacidade voltava. Não por acaso, uma das correções anunciadas é controle de velocidade nesse failover: limitar quanto da capacidade um health check pode remover em uma janela.
A dependência estava escondida. Quem rodava Lambda, ECS ou EKS em us-east-1 sem usar DynamoDB nenhum foi afetado mesmo assim, porque o DynamoDB é dependência do próprio control plane da AWS. Nenhum diagrama de cliente mostrava essa aresta. O blast radius real de um serviço regional não é o conjunto de quem o chama, é o conjunto de quem chama algo que o chama.
"Estamos em 3 AZs" não protege de falha regional. O registro DNS é regional. O control plane do EC2 é regional. Ter réplicas em us-east-1a, 1b e 1c não ajuda quando o que falta é o nome que resolve para todas elas. Multi-AZ protege contra perda de datacenter; não protege contra erro lógico em componente compartilhado pela região inteira.
O que a AWS mudou, e o que isso ensina
As quatro correções anunciadas são, cada uma, uma lição de desenho:
- Automação de DNS desligada globalmente até corrigir a corrida. Quando a automação pode produzir um estado que ela mesma não repara, operar manualmente é mais seguro. É uma decisão cara de manter, e a AWS tomou mesmo assim.
- Proteção contra aplicar plano de DNS incorreto. É o invariante que faltava: validar o plano contra o estado atual antes de aplicar, e recusar qualquer plano que zere o endpoint.
- Controle de velocidade no failover de health check do NLB. Mecanismo automático de remoção precisa de teto. Health check que pode remover 100% da capacidade é um botão de desligar com outro nome.
- Testes de escala no EC2. O caminho de recuperação em massa (restabelecer leases da frota inteira) não estava exercitado no volume real. Caminho de recuperação que só roda em incidente é código não testado.
O padrão por trás das quatro é o mesmo: o sistema estava bem desenhado para o caminho feliz e para a falha de um componente; não estava desenhado para a recuperação de uma falha ampla. É aí que mora a maior parte das horas de incidente que eu já vi em plataforma financeira também.
Estabilidade estática: o que fica de pé quando o control plane cai
A AWS usa há anos o termo estabilidade estática: o data plane continua funcionando com o último estado conhecido mesmo quando o control plane está indisponível. Esse incidente é uma demonstração prática do conceito, para o bem e para o mal.
Instâncias EC2 que já estavam rodando, em boa parte, continuaram rodando. O que quebrou foi tudo que precisava do control plane para mudar: lançar instância, escalar, registrar alvo novo no NLB, subir container novo. Isso tem uma consequência direta para quem desenha sistema: auto scaling é dependência de control plane. Se a sua estratégia de resiliência é "o ASG sobe mais máquinas quando precisar", ela falha exatamente no tipo de evento em que você mais precisaria dela.
Na prática, estabilidade estática do lado do cliente significa:
- Capacidade pré-provisionada para absorver a perda de uma AZ sem lançar nada. Custa mais por mês; é o preço de não depender do control plane na hora ruim.
- Credenciais, configuração e segredos com cache local e tempo de vida maior que a duração plausível de um incidente regional. Se cada request busca configuração num serviço regional, você herdou a disponibilidade dele.
- Caminho de leitura que não depende de escrita. Consultar saldo não deveria quebrar porque o lançamento de instância está travado.
- Nada de failover que dependa de criar recurso. Failover que precisa de
RunInstancesou de alterar registro DNS no momento do evento depende do mesmo control plane que pode estar fora.
Lições
Não começaria por multi-região ativo-ativo. Começaria pelo inventário: listar cada dependência regional do caminho de autorização de pagamento, incluindo as de segunda ordem (STS, KMS, Secrets Manager, DynamoDB, resolução DNS de endpoint regional). Depois, três mudanças em ordem de custo. Primeiro, estabilidade estática dentro da região: capacidade pré-provisionada para perder uma AZ sem escalar, segredos e chaves de dados em cache com validade de horas, e health check com limite de quanto alvo pode remover por minuto. Segundo, um modo degradado explícito: autorizar transações abaixo de um limite de risco com base em estado local e conciliar depois, com idempotência por transactionId para que o backlog drene sem duplicar cobrança. Terceiro, só então, uma região secundária em warm standby com failover que não dependa de criar recurso na região que caiu: DNS com registros pré-criados e decisão de failover tomada fora de us-east-1. A lição dura desse incidente: o custo de multi-região não é o de subir a segunda região, é o de manter dados, testes e runbooks sincronizados por anos. Por isso eu só pago esse custo depois de esgotar o que a estabilidade estática resolve sem ele.
Veredito
O gatilho foi uma corrida rara entre aplicadores de DNS, mas o que transformou três horas em quatorze foi a recuperação: leases expiradas em massa, colapso congestivo no EC2 e health checks sem teto removendo capacidade saudável. Para quem roda sistema financeiro, a recomendação é condicional. Se o seu RTO tolera horas, invista primeiro em estabilidade estática e em modo degradado dentro de us-east-1, porque resolvem a maior parte do impacto com custo previsível. Se o seu RTO é de minutos, ou se o regulador exige continuidade durante falha regional, multi-AZ não basta: você precisa de uma segunda região com failover decidido fora da região que caiu, e precisa ensaiá-lo com a mesma seriedade que a AWS passou a ensaiar a recuperação do EC2.
Continue lendo
Post-mortems, ADRs e deep dives de arquitetura no seu email, do jeito que um arquiteto lê.
Sem spam · cancele quando quiser
Pergunte ao Fernando sobre isto
Uma resposta focada sobre este estudo, do meu assistente de IA, baseada no meu trabalho.
Participe da conversa
Entre para comentar
Confirme seu e-mail para participar, você também recebe a newsletter. Sem senha.