Ir para o conteúdo

Como soluciono erros 504 que eu recebo quando uso um Application Load Balancer?

6 minuto de leitura
0

Quero solucionar o erro ELB_504 que recebo nos logs de acesso do meu Application Load Balancer ou nas métricas do Amazon CloudWatch. Ou, eu recebo um erro HTTP 504 quando me conecto ao meu serviço por meio de um Application Load Balancer.

Breve descrição

Um erro HTTP 504 ocorre quando um gateway ou proxy atinge o tempo limite. Os erros HTTP 504 do Application Load Balancer podem ocorrer pelos seguintes motivos:

  • O balanceador de carga falhou em estabelecer uma conexão com o destino antes que o tempo limite de conexão de 10 segundos expirasse.
  • O balanceador de carga encontrou um tempo limite de handshake SSL quando se conectou a um destino.
    Observação: Não é possível ajustar o tempo limite de 10 segundos do handshake SSL.
  • O balanceador de carga estabeleceu uma conexão com o destino, mas o destino não respondeu antes que o tempo limite de inatividade terminasse.
  • O destino retornou um valor de cabeçalho Content-Length maior que o corpo da entidade, e o balanceador de carga atingiu o tempo limite.
  • O tráfego intenso fez com que os destinos respondessem mais lentamente.
  • O destino é uma função do AWS Lambda e o serviço não respondeu antes do tempo limite de conexão expirar.

Resolução

Verifique se seu balanceador de carga permite tráfego com destinos registrados

Verifique a métrica TargetConnectionErrorCount do CloudWatch com a estatística Sum. Se você perceber pontos de dados positivos em vez de 0, haverá problemas de conexão entre o balanceador de carga e o destino.

Para resolver esses problemas, verifique os grupos de segurança de rede associados ao balanceador de carga e aos destinos de back-end. Certifique-se de que os grupos de segurança de rede permitam o tráfego entre o balanceador de carga e os destinos em ambas as direções nas portas de verificação de tráfego e integridade. Confirme se a lista de controle de acesso à rede (ACL de rede) da 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 regras específicas de grupo de segurança para seu Application Load Balancer.

Verifique as métricas do seu balanceador de carga

Para determinar por que seus destinos estão marcados como Não íntegros, verifique as métricas do CloudWatch para seu Application Load Balancer. Se não houver dados da métrica HTTPCode_ELB_504_Count, seus servidores da aplicação retornaram os erros 504, não o balanceador de carga. Verifique se o valor máximo da métrica TargetResponseTime frequentemente excede o valor do tempo limite, pois essa configuração pode causar erros 504.

Além disso, verifique as seguintes métricas de utilização de CPU e memória em seus destinos com base no tipo de recurso:

  • Para o Amazon Elastic Compute Cloud (Amazon EC2), verifique a métrica CPUUtilization. As instâncias do EC2 não enviam métricas de memória para o CloudWatch por padrão, mas é possível enviar uma métrica de memória personalizada.
  • Para tarefas do Amazon ECS, verifique as métricas CPUUtilization e MemoryUtilization. Se o valor de qualquer uma delas for 1 (100%), a tarefa deixará de responder.
  • Para funções do Lambda, verifique a métrica Duration. Se Duration durar mais do que o valor do tempo limite de inatividade do balanceador de carga, você receberá um erro de tempo limite do Gateway.

Aumente a disponibilidade de seus recursos

Se seus destinos tiverem uso intenso de CPU, eles podem deixar de responder.

Para resolver esse problema, aumente os seguintes recursos para seus destinos:

Atualize o código de sua aplicação para ser mais eficiente ao responder às solicitações HTTP. Certifique-se de que a aplicação não demore mais tempo para responder do que o tempo limite de inatividade configurado. Por padrão, o tempo limite de inatividade de um Application Load Balancer é de 60 segundos. Se necessário, aumente o tempo limite de inatividade do seu balanceador de carga.

Observação: É uma prática recomendada aumentar o valor do tempo limite de inatividade somente quando o destino tem um número grande de operações de computação para concluir. Caso contrário, é uma prática recomendada otimizar o uso de recursos nos destinos.

Escale seus destinos com base em sua demanda

Para escalar os destinos com base em sua demanda, execute as seguintes ações para sua configuração:

Observação: Quando você invoca uma função do Lambda, a função escala automaticamente.

Verifique suas dependências externas

Quando uma aplicação usa uma arquitetura de microsserviços, dependências externas, como bancos de dados ou APIs, afetam o tempo de resposta desejado.

Verifique se há problemas nas seguintes dependências externas comuns:

  • Para bancos de dados do Amazon Relational Database Service (Amazon RDS), verifique as métricas ReadLatency, WriteLatency e DatabaseConnections do CloudWatch.
  • Para filas do Amazon Simple Queue Service (Amazon SQS), verifique as métricas ApproximateAgeOfOldestMessage e NumberOfMessagesDelayed do CloudWatch.
  • Para buckets do Amazon Simple Storage Service (Amazon S3), verifique as métricas FirstByteLatency, TotalRequestLatency, 4xxErrors e 5xxErrors do CloudWatch.
  • Para os serviços de autenticação do Amazon Cognito, verifique a métrica TokenRefreshSuccesses do CloudWatch e verifique se há erros de ThrottlingException.

Para determinar a origem de um gargalo de desempenho, execute as seguintes ações:

Use o Compute Optimizer para evitar problemas futuros

Use o AWS Compute Optimizer para obter insights sobre o uso dos recursos do Amazon EC2, Amazon ECS e Lambda. O Compute Optimizer detecta quando o uso de recursos está muito alto, para ajudar você a evitar tempos limite. Ele também fornece as práticas recomendadas sobre como otimizar suas cargas de trabalho.

Informações relacionadas

HTTP 504: Tempo limite do gateway

Como soluciono problemas de alta latência no meu Application Load Balancer no Elastic Load Balancing?

Como soluciono problemas de autenticação no meu Application Load Balancer?

Como soluciono problemas de erros 504 retornados ao usar um Classic Load Balancer?