- Castro/
- blog/
- Migrando um endpoint específico para Docker e usando CloudFront como camada de transição/
Migrando um endpoint específico para Docker e usando CloudFront como camada de transição
Como validar um path específico em uma origem Docker por CloudFront de homologação antes de alterar a distribuição que atende produção.
Quando uma API pública tem vários paths, a migração não precisa acontecer como uma unidade indivisível.
Em uma operação real de ECS para Docker, um dos padrões usados foi tratar cada endpoint/path como uma peça migrável e validar a nova origem atrás de um CloudFront de homologação antes de mexer na distribuição de produção.
A arquitetura de teste ficou conceitualmente assim:
| |
Enquanto isso, a origem antiga continuava atendendo produção.
O CloudFront não era só “uma CDN na frente”. Ele virou uma forma de testar a mesma ideia de roteamento público sem usar o tráfego real como laboratório.
O contrato a preservar era o path #
Os serviços migrados tinham URLs finais planejadas em um mesmo domínio de API, diferenciadas por paths.
Algo como:
| |
No ambiente de homologação, cada behavior podia apontar o path correspondente para o Docker host correto.
Isso permitia provar uma pergunta por vez:
“o endpoint X funciona na nova origem quando passa pela camada HTTP que se parece com a produção?”
Sem precisar trocar todos os endpoints juntos.
Primeiro, a API precisava funcionar sem CloudFront #
Antes de criar ou ajustar behavior, a aplicação era validada diretamente.
Exemplo:
| |
Depois entrava o Traefik local:
| |
E só então o origin externo.
Se essa sequência falha antes do CloudFront, não faz sentido começar a alterar behavior para tentar “consertar” a aplicação.
Behavior específico é uma ferramenta de migração #
No CloudFront HMG, o roteamento foi organizado por behaviors de path.
Conceitualmente:
| |
Isso oferece uma propriedade operacional muito útil: cada rota pode ser validada de forma independente.
A migração deixa de ser:
| |
para virar:
| |
O blast radius do teste cai bastante.
API não deveria depender de cache acidental #
Na fonte desse caso, a policy de API usava cache desabilitado e permitia os métodos necessários além de GET/HEAD.
Esse ponto é importante porque um behavior reaproveitado de conteúdo estático pode introduzir efeitos que nada têm a ver com a aplicação:
- cache de resposta que deveria ser dinâmica;
- método HTTP bloqueado;
- headers não encaminhados;
- query strings tratadas de forma diferente;
- cookies ausentes;
- redirects inesperados.
Quando CloudFront participa da migração, a pergunta não é só “o origin está certo?”.
É também:
“o behavior preserva o contrato HTTP que essa API precisa?”
O hostname do origin e o certificado importam #
Em alguns dos hosts Docker, o Traefik terminava TLS.
Se o CloudFront conecta em HTTPS ao origin usando um hostname que não combina com o certificado apresentado, o teste pode falhar antes mesmo de chegar à API.
Por isso foi usado, quando necessário, um domínio técnico de origin com certificado válido.
A ideia é evitar um cenário como:
| |
Isso é diferente de a aplicação estar fora.
O teste de origin direto com o Host correto ajuda a separar as duas coisas.
A validação pela borda vinha por último #
Depois de container, path, Traefik e origin:
| |
O primeiro ajuda a enxergar TLS/headers e o segundo confirma o corpo/status esperado.
Na operação que originou esta pauta, múltiplos paths chegaram ao estado HTTP 200 Healthy no CloudFront HMG.
Esse resultado provava a cadeia de homologação.
Não provava ainda que a virada de produção havia sido executada.
A fonte operacional mantinha essa distinção explícita: HMG validado; cutover final ainda dependente de mudança coordenada e aceite.
Por que isso é melhor que apontar produção “só para testar” #
Porque teste e cutover deixam de ser o mesmo evento.
Com uma distribuição de HMG:
| |
Quando tudo passa, a virada de produção ainda merece plano e rollback, mas já não carrega as incertezas básicas do novo ambiente.
O que eu registraria antes da virada #
Para cada path:
| |
Sem esse mapa, vários endpoints no mesmo domínio viram uma massa única e difícil de migrar de forma controlada.
O ponto principal #
CloudFront pode ser mais que a camada que você altera no fim da migração.
Usado com uma distribuição de homologação e behaviors por path, ele pode virar parte da própria estratégia de validação.
Nesse caso, o endpoint novo foi exercitado pela cadeia:
| |
antes de a produção antiga ser desligada ou o CloudFront de produção ser alterado.
A mudança final ainda existia.
Mas ela passou a acontecer depois de o caminho novo já ter acumulado evidência de que funcionava.
E isso é uma diferença enorme entre migrar e apostar.
Me chama.
Manda o contexto, os sintomas e o que já foi testado. Bora organizar as evidências antes de sair mexendo.