Skip to main content

Caso · INV-0052

Oito minutos de imagens quebradas, e cada screenshot da demo virou um 504.

Rodrigo Lima estava no meio de uma demo com um prospect quando todo .webp da página virou ícone quebrado. O CDN parecia saudável. O CauseFlow encontrou o teto real: um cold start do Lambda que consumiu 3.098 ms de um orçamento de 5.000 ms — sobrando zero tempo para os fetches das imagens.

4 min de leituraAltoDemo ao vivo abandonadaResolvido pelo CauseFlow em 1,5 min

O Relógio de Orçamento do Lambda

Cada requisição de otimização de imagem tem um orçamento de 5.000 ms. Um cold start consumiu 3.098 ms antes de um único pixel ser buscado.

0 msOrçamento de 5000 ms
.webp #1.webp #2.webp #3
Cold start (INIT)Janela de fetch3× fetch .webp

Matemática do Cold Start

Três fetches de imagem dispararam concorrentes no instante em que o Lambda inicializou — os três bateram direto na parede do orçamento.

0 ms3098 ms5000 ms5598 msParede de 5000 msINIT 3098 ms#1INIT 3098 ms#2INIT 3098 ms#3

INIT_DURATION 3098 ms + fetch 2500 ms ≈ 5598 ms > orçamento de 5000 ms → Timeout

Hipótese do CloudFront — Descartada

O primeiro instinto do time foi CDN. As métricas do CloudFront não mostraram anomalias — taxa de cache hit normal, sem erros de origem reportados. O problema estava upstream do CDN, inteiramente.

CloudFront — sem anomalia
CacheHitRate: 97.3% ← normal
OriginLatency: n/a ← sem erros de origem
5xxErrorRate: 0.00% ← o CloudFront em si está saudável
Conclusão: o problema está upstream do CDN.

Assim que uma instância quente do Lambda passou a atender as requisições seguintes, o overhead do INIT_START desapareceu — imagens servidas em 312 ms. Auto-resolução clássica de cold start.

Diff de Logs de Auto-Recuperação

Durante o incidente — cold start
INIT_START Runtime: nodejs:20.v37
initDuration: 3098.74 ms
fetch dashboard-hero.webp → TimeoutError
fetch test-flow-builder.webp → TimeoutError
fetch results-panel.webp → TimeoutError
→ Retornando 504 ao CloudFront
Após warm-up — saudável
START RequestId: b2c3d4e5
fetch dashboard-hero.webp → 200 (312 ms)
fetch test-flow-builder.webp → 200 (289 ms)
fetch results-panel.webp → 200 (301 ms)
→ status: 200 billed: 847 ms

Três Caminhos Possíveis

O CauseFlow mostra as opções. Seu time decide.

Recomendado

Provisioned Concurrency

Mantém uma instância Lambda sempre quente. Elimina cold starts no horário comercial. Custo: ~$15–20/mês por instância quente.

Dividir o Image Optimizer

Um Lambda por tipo de imagem reduz o payload de init e a duração do cold start. Mais infra para manter.

Aumentar o Timeout

Sobe o timeout do Lambda para 10 s — ganha fôlego no cold start. Não previne. A latência degrada para o usuário final.

Causa Raiz

A função WebsiteImageOptimizerFunction teve cold start de 3.098 ms — 62% do orçamento total de 5.000 ms — deixando apenas 1.902 ms para três fetches concorrentes de .webp que precisavam de ~2.500 ms cada. Os três deram timeout, o CloudFront recebeu 504, e o navegador exibiu imagens quebradas pelos ~8 minutos até uma instância quente ficar disponível.

Demo abandonada1 sessão ao vivo com prospect perdida

Pare de caçar logs.
Comece a entregar produto.

Conecte sua stack em minutos e investigue incidentes reais na sua infra. Sem contrato, sem cartão.