Comment résoudre les erreurs 504 qui s'affichent lorsque j'utilise un Application Load Balancer ?

Dernière mise à jour : 25/04/2022

Des messages d'erreur HTTP 504 s'affichent dans les journaux d'accès d'Application Load Balancer, dans les métriques Amazon CloudWatch ou lorsque je me connecte à mon service par le biais d'un Application Load Balancer. Comment puis-je résoudre ce problème ?

Brève description

Une erreur HTTP 504 est un code d'état HTTP indiquant l'expiration d'une passerelle ou d'un proxy.

Des erreurs HTTP 504 liées à un Application Load Balancer peuvent survenir si :

  • Votre équilibreur de charge n'a pas pu établir de connexion à la cible avant l'expiration du délai de connexion (10 secondes).
  • L'équilibreur de charge a établi une connexion avec la cible, mais la cible n'a pas répondu avant l'expiration du délai d'inactivité.
  • La liste ACL réseau pour le sous-réseau n'autorisait pas le trafic depuis les cibles vers les nœuds de l'équilibreur de charge sur les ports éphémères (1024-65535).
  • La cible renvoie une valeur d'en-tête Content-Length supérieure au corps de l'entité. L'équilibreur de charge a expiré en attendant les octets manquants.
  • La cible est une fonction AWS Lambda et le service n'a pas répondu avant l'expiration du délai de connexion.

Solution

Vérifiez le délai d'inactivité de vos équilibreurs de charge et modifiez-le si nécessaire.

Des erreurs HTTP 504 liées à un équilibreur de charge peuvent se produire si l'instance backend n'a pas répondu à la requête au cours du délai d'inactivité configuré. Par défaut, le délai d'inactivité d'un Application Load Balancer est de 60 secondes.

Si les métriques CloudWatch sont activées, vérifiez les métriques CloudWatch pour votre Application Load Balancer. La métrique HTTPCode_ELB_5XX indique que l'erreur 504 provient de l'équilibreur de charge. S'il n'existe aucun point de données de métrique HTTPCode_ELB_504_Count, les erreurs 504 sont renvoyées par vos serveurs d'applications et non par l'équilibreur de charge.

Vérifiez les valeurs maximales et moyennes de la métrique CloudWatch TargetResponseTime. La valeur de délai d'expiration peut indiquer le temps écoulé après que la requête de l'équilibreur de charge a été reçue par la cible.

Pour résoudre ce problème :

Modifiez le délai d'inactivité de votre équilibreur de charge pour que la requête HTTP se termine au cours de celui-ci.

-ou-

Modifiez votre application de manière à ce qu'elle réponde plus rapidement à la requête HTTP. Assurez-vous que l'application ne met pas plus de temps à répondre que le délai d'inactivité configuré.

(Facultatif) Ajoutez les filtres personnalisés suivants dans les journaux d'application des serveurs Web backend afin de déterminer la cause des temps de réponse élevés :

Serveur 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

Assurez-vous que votre équilibreur de charge autorise le trafic avec des cibles enregistrées.

Vérifiez que les groupes de sécurité réseau associés à l'équilibreur de charge et aux cibles backend autorisent le trafic dans les deux directions sur les ports de trafic et de surveillance de l'état. Assurez-vous que la liste ACL réseau pour le sous-réseau autorise le trafic depuis les cibles vers les nœuds d'équilibreur de charge sur les ports éphémères (1024-65535).

Remarque : c'est une bonne pratique d'utiliser ces règles de groupe de sécurité pour votre Application Load Balancer.

Si vous consultez la métrique CloudWatch TargetConnectionErrorCount avec statistique de somme, vous êtes susceptible de voir des points de données positifs. Par exemple, le nombre de connexions qui n'ont pas été établies correctement entre l'équilibreur de charge et la cible.

Pour plus d'informations, veuillez consulter la section Configurer le paramètre de délai d'inactivité pour votre équilibreur de charge.

Assurez-vous que votre fonction Lambda répond avant l'expiration du délai de connexion.

Si votre cible est une fonction Lambda, vérifiez la durée de la métrique de performances avec des statistiques maximales afin de connaître la durée pendant laquelle l'événement est traité. Pour plus d'informations, veuillez consulter la section Utilisation des métriques de performances.