Como faço para solucionar erros 504 retornados durante o uso de um Application Load Balancer?

Data da última atualização 25/04/2022

Encontrei erros HTTP 504 nos logs de acesso do Application Load Balancer, nas métricas do Amazon CloudWatch ou ao me conectar ao meu serviço por meio de um Application Load Balancer. Como corrijo isso?

Breve descrição

Um erro HTTP 504 é um código de status HTTP que indica que um gateway ou proxy expirou.

Os erros HTTP 504 do Application Load Balancer podem ocorrer se:

  • O balanceador de carga falhou ao estabelecer uma conexão com o destino antes que o tempo limite da conexão expirasse (10 segundos).
  • O balanceador de carga estabeleceu uma conexão com o destino, mas o alvo não respondeu antes que o período de tempo limite de inatividade tivesse decorrido.
  • A ACL da rede para a sub-rede não permitia tráfego dos destinos para os nós do balanceador de carga nas portas efêmeras (1024-65535).
  • O destino retorna um valor de cabeçalho de comprimento do conteúdo que é maior que o corpo da entidade. O balanceador de carga atingiu o tempo limite, aguardando os bytes faltantes.
  • O destino é uma função do AWS Lambda e o serviço não respondeu antes que o tempo limite da conexão expirasse.

Resolução

Verifique o tempo limite de inatividade dos balanceadores de carga e modifique, se necessário

Erros HTTP 504 do balanceador de carga podem ocorrer se a instância de backend não tiver respondido à solicitação dentro do período de tempo limite de inatividade configurado. Por padrão, o tempo limite de inatividade do Application Load Balancer é de 60 segundos.

Se as métricas do CloudWatch estiverem ativadas, verifique as métricas do CloudWatch para seu Application Load Balancer. A métrica HTTPCode_ELB_5XX indica o erro 504 originado do balanceador de carga. Se não houver nenhum datapoint métrico HTTPCode_ELB_504_Count, os erros 504 serão retornados pelos seus servidores de aplicação, não pelo balanceador de carga.

Verifique os valores máximo e médio da métrica TargetResponseTime do CloudWatch. O valor do tempo limite pode indicar o tempo decorrido depois que a solicitação do balanceador de carga foi recebida do destino.

Para resolver isso:

Modifique o tempo limite de inatividade do balanceador de carga para que a solicitação HTTP seja concluída dentro do período de tempo limite de inatividade.

-ou-

Modifique seu aplicativo para responder à solicitação HTTP mais rapidamente. Certifique-se de que o aplicativo não demore mais para responder do que o tempo limite de inatividade configurado.

(Opcional) Adicione os seguintes filtros personalizados nos logs de aplicativos dos servidores Web de backend para ajudar a determinar a causa dos tempos de resposta lentos:

Servidor Web Apache

a- Apache : %D in log format
b- Nginx: $request_time and $upstream_response_timein log format
c- IIS: “time-taken” in log format
d- Apache Tomcat Access logs: %D in log format

Certifique-se de que seu balanceador de carga permita tráfego com destinos registrados

Verifique se os grupos de segurança de rede associados ao balanceador de carga e aos destinos de backend permitem tráfego entre si em ambas as direções nas portas de tráfego e verificação de integridade. Verifique se a ACL da rede para a sub-rede permite o tráfego dos destinos para os nós do balanceador de carga nas portas efêmeras (1024-65535).

Observação: é uma prática recomendada usar as seguintes regras de grupo de segurança para o Application Load Balancer.

Se você revisar a métrica do CloudWatch TargetConnectionErrorCount com estatística de soma, provavelmente verá pontos de dados positivos. Por exemplo, o número de conexões que não foram estabelecidas com êxito entre o balanceador de carga e o destino.

Para obter mais informações, consulte Configurar a configuração de tempo limite ocioso para o balanceador de carga.

Certifique-se de que sua função Lambda responda antes que o tempo limite da conexão expire

Se o seu destino for uma função Lambda, verifique a duração da métrica de performance com estatísticas máximas para verificar a quantidade de tempo que o evento processa. Para obter mais informações, consulte Uso de métricas de performance.