¿Cómo soluciono los errores 504 que se muestran cuando utilizo un Application Load Balancer?

Última actualización: 25-04-2022

Encontré errores HTTP 504 en los registros de acceso de un Application Load Balancer, las métricas de Amazon CloudWatch o al conectarme a mi servicio a través de un Application Load Balancer. ¿Cómo soluciono este problema?

Descripción corta

Un error HTTP 504 es un código de estado HTTP que indica que se agotó el tiempo de espera de una puerta de enlace o un proxy.

Se pueden producir errores HTTP 504 en un Application Load Balancer en los siguientes casos:

  • El equilibrador de carga no pudo establecer una conexión con el destino antes de que expirara el tiempo de espera de la conexión (10 segundos).
  • El equilibrador de carga estableció una conexión con el destino, pero este no respondió antes de que transcurriera el periodo de tiempo de espera de inactividad.
  • La ACL de red para la subred no permitía el tráfico de los destinos a los nodos del equilibrador de carga en los puertos efímeros (1024-65535).
  • El destino devuelve un valor del encabezado Content-Length que es mayor que el cuerpo de la entidad. El equilibrador de carga agotó el tiempo de espera de los bytes faltantes.
  • El destino es una función de AWS Lambda y el servicio no respondió antes de que expirara el tiempo de espera de la conexión.

Resolución

Compruebe el tiempo de espera de inactividad de sus equilibradores de carga y realice modificaciones si es necesario

Se pueden producir errores HTTP 504 de un equilibrador de carga si la instancia de backend no respondió a la solicitud dentro del periodo de tiempo de espera de inactividad configurado. De forma predeterminada, el tiempo de espera de inactividad de un Application Load Balancer es de 60 segundos.

Si las métricas de CloudWatch están habilitadas, compruebe las métricas de CloudWatch para su Application Load Balancer. La métrica HTTPCode_ELB_5XX indica el error 504 que se originó en el equilibrador de carga. Si no hay puntos de datos de métricas HTTPCode_ELB_504_Count, sus servidores de aplicaciones serán quienes muestren los errores 504, no el equilibrador de carga.

Compruebe los valores máximo y promedio de la métrica de CloudWatch TargetResponseTime. El valor de tiempo de espera puede indicar el tiempo que transcurrió desde que se recibió la solicitud del equilibrador de carga del destino.

Para resolver esto, haga lo siguiente:

Modifique el tiempo de espera de inactividad de su equilibrador de carga para que la solicitud HTTP se complete dentro del periodo de tiempo de espera de inactividad.

De forma alternativa, haga lo siguiente:

Modifique su aplicación para que responda a la solicitud HTTP más rápido. Asegúrese de que al responder la aplicación no exceda el tiempo de espera de inactividad configurado.

(Opcional) Agregue los siguientes filtros personalizados en los registros de aplicaciones de los servidores web backend para ayudar a determinar por qué los tiempos de respuesta son 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

Asegúrese de que el equilibrador de carga permita el tráfico con destinos registrados

Verifique que los grupos de seguridad de red asociados con el equilibrador de carga y los destinos de backend permitan el tráfico entre sí en ambas direcciones en los puertos de tráfico y de comprobación de estado. Asegúrese de que la ACL de red para la subred permita el tráfico desde los destinos a los nodos del equilibrador de carga en los puertos efímeros (1024-65535).

Nota: Es una práctica recomendada usar las siguientes reglas de grupos de seguridad para su Application Load Balancer.

Si revisa la métrica de CloudWatch TargetConnectionErrorCount con la estadística sum, es probable que vea puntos de datos positivos. Por ejemplo, el número de conexiones que no se establecieron correctamente entre el equilibrador de carga y el destino.

Para obtener más información, consulte Cómo establecer la configuración del tiempo de espera de inactividad del equilibrador de carga.

Asegúrese de que la función Lambda responda antes de que expire el tiempo de espera de la conexión

Si el destino es una función de Lambda, compruebe la duración de la métrica de rendimiento con las estadísticas máximas para verificar la cantidad de tiempo que se procesa ese evento. Para obtener más información, consulte Cómo usar métricas de rendimiento.