Je dispose d'un Classic Load Balancer avec une permanence des sessions selon la durée ou contrôlée par application. L'équilibreur de charge est configuré pour acheminer les sessions HTTP ou HTTPS vers la même instance enregistrée, mais les demandes du client sont acheminées vers des instances enregistrées distinctes. Comment résoudre les problèmes liés à la permanence de la session d'Elastic Load Balancing (ELB) ?

Par défaut, un Classic Load Balancer achemine chaque demande vers l'instance enregistrée avec le moins de requêtes en attente. L'utilisation de sessions permanentes (affinité des sessions) configure un équilibreur de charge de façon à lier les sessions des utilisateurs à une instance spécifique : ainsi, toutes les requêtes provenant d'un utilisateur pendant une session sont envoyées à la même instance. Une session permanente peut échouer si :

1.    L'instance enregistrée n'insère pas de cookie d'application.

2.    Le client ne renvoie pas les cookies dans l'en-tête de demande.

3.    Les cookies insérés par une instance enregistrée n'ont pas le format adéquat.

4.    La période d'expiration spécifiée lors de l'utilisation d'une session permanente selon la durée est dépassée.

5.    La requête HTTP ou HTTPS passe par plus d'un équilibreur de charge avec la permanence activée.

Remarque : la fonction de permanence de l'équilibreur de charge est uniquement prise en charge avec les écouteurs HTTP ou HTTPS.

Permanence des sessions contrôlées par application

1.    Recherchez des erreurs HTTP avec votre Classic Load Balancer. Pour en savoir plus, consultez Dépanner un Classic Load Balancer : erreurs HTTP.

2.    Exécutez une commande semblable à la suivante pour le nom du DNS de l'équilibreur de charge. Cherchez ces deux cookies dans la réponse :

  • Un cookie d'application est inséré par votre application en cours d'exécution sur une instance backend.
  • Un cookie AWSELB est inséré par l'équilibreur de charge.

Remarque : avant d'exécuter cette commande, assurez-vous de remplacer le nom du DNS par le nom de votre équilibreur de charge.

[ec2-user@ip-172-31-22-85 ~]$ curl -vko /dev/null internal-TESTELB-1430759361.eu-central-1.elb.amazonaws.com

Remarque : l'utilitaire curl est natif pour Linux, mais peut-être installé sur Windows.

Voici un exemple de réponse à la commande :

...

< Set-Cookie: PHPSESSID=k0qu6t4e35i4lgmsk78mj9k4a4; path=/
< Set-Cookie: 
AWSELB=438DC7A50C516D797550CF7DE2A7DBA19D6816D5E6FB20329CD6AEF2B40030B12FF2839757A60E2330136A2182D27D049FB9D887FBFE9E80FB0724130FB3A86A4B0BAC296FDEB9E943EC9272FF52F5A8AEF373DF33;PATH=/

...

Remarque : si la réponse n'inclut pas de cookie AWSELB, aucune permanence n'est établie entre le client et l'instance backend.

3.    Vérifiez que l'instance enregistrée insère un cookie d'application en envoyant une requête HTTP directement à l'IP de l'instance enregistrée, par le biais d'une commande semblable à la suivante :

[ec2-user@ip-172-31-22-85 ~]$ curl -vko /dev/null 172.31.30.168

La commande renvoie une réponse semblable à l'exemple suivant :

...

< Set-Cookie: PHPSESSID=5pq74110nuir60kpapj04mglg4; path=/

...

4.    Vérifiez que le nom du cookie généré par l'instance enregistrée est le même que le nom du cookie configuré sur l'équilibreur de charge.

5.    Si les instances enregistrées insèrent un cookie d'application dans leurs réponses et que l'équilibreur de charge insère un cookie AWSELB, assurez-vous que le client envoie ces deux cookies dans des requêtes consécutives. Si le client n'inclut pas le cookie d'application ou AWSELB, la permanence ne fonctionne pas. Afin de vérifier que le client envoie les cookies d'application et AWSELB, réalisez une capture de paquet sur le client ou utilisez les outils de débogage Web du navigateur pour récupérer les informations du cookie dans l'en-tête de la requête.

6.    Si vous souhaitez savoir vers quelle instance backend l'équilibreur de charge a acheminé la requête, vous pouvez configurer l'instance backend de façon à afficher l'ID d'instance grâce aux Métadonnées d'instance en exécutant un script semblable à ce qui suit :

<?php $instance_id =file_get_contents('http://169.254.169.254/latest/meta-data/instance-id');
echo "instance id = " . $instance_id . "\\xA";
?> 

7.    Examinez votre journal d'accès ELB pour vérifier si les requêtes provenant du même utilisateur ont été acheminées vers des instances enregistrées distinctes. Pour en savoir plus sur l'examen des journaux d'accès ELB, consultez Journaux d'accès de votre Classic Load Balancer.

8.    Vérifiez que le cookie inséré par l'application dispose d'un format adéquat pour HTTP.

9.    Si votre requête passe par plusieurs équilibreurs de charge, vérifiez que la permanence n'est activée que pour un seul d'entre eux. Si plusieurs équilibreurs de charge insèrent un cookie, le cookie d'origine est remplacé et la permanence échoue.

Permanence de session basée sur la durée

1.    Exécutez une commande semblable à la suivante pour le nom du DNS de l'équilibreur de charge afin de vérifier la présence d'un cookie AWSELB dans la réponse :

[ec2-user@ip-172-31-22-85 ~]$ curl -vko /dev/null internal-TESTELB-1430759361.eu-central-1.elb.amazonaws.com

La commande renvoie une réponse semblable à l'exemple suivant :

...

< Set-Cookie: 
AWSELB=438DC7A50C516D797550CF7DE2A7DBA19D6816D5E6FB20329CD6AEF2B40030B12FF2839757A60E2330136A2182D27D049FB9D887FBFE9E80FB0724130FB3A86A4B0BAC296FDEB9E943EC9272FF52F5A8AEF373DF33;PATH=/

...

Remarque : si la réponse n'inclut pas de cookie AWSELB, aucune permanence n'est établie entre le client et l'instance backend.

2.    Si l'équilibreur de charge insère un cookie AWSELB, assurez-vous que le client envoie ce cookie dans les requêtes ultérieures. Si le client n'inclut pas le cookie AWSELB, la permanence ne fonctionne pas. Afin de vérifier que le client envoie le cookie AWSELB, réalisez une capture de paquet sur le client ou utilisez les outils de débogage Web du navigateur pour récupérer les informations du cookie dans l'en-tête de la requête.

3.    Vérifiez la durée configurée pour l'équilibreur de charge. Si la période d'expiration du cookie est dépassée, les sessions clients ne sont plus permanentes pour l'instance enregistrée, jusqu'à l'émission d'un nouveau cookie par l'équilibreur de charge.

4.    Si votre requête passe par plusieurs équilibreurs de charge, vérifiez que la permanence n'est activée que pour un seul d'entre eux. Si plusieurs équilibreurs de charge insèrent un cookie, le cookie d'origine est remplacé et la permanence échoue.  


Cette page vous a-t-elle été utile ? Oui | Non

Retour au Centre de connaissances AWS Support

Vous avez besoin d'aide ? Consultez le site du Centre AWS Support

Date de publication : 30/03/2018