5 votes

L'ALB ne propage pas correctement les en-têtes de réponse

J'ai une cible lambda derrière un ALB. Mon lambda est un lambda python.

def handler(event, context):
response = {
    "statusCode": 200,
    "statusDescription": "200 OK",
    "isBase64Encoded": False,
    "headers": {
        "Content-Type": "text/html; charset=utf-8"
    }
}

Cependant, lorsque j'utilise mon url avec curl, je reçois un message de type

< HTTP/1.1 200 OK
< Server: awselb/2.0
< Date: Sat, 06 Apr 2019 04:46:50 GMT
< Content-Type: application/octet-stream
< Content-Length: 0
< Connection: keep-alive

Nota Content-Type est un flux d'octets, ce qui incite les navigateurs à télécharger la réponse sous forme de fichier au lieu de l'afficher. J'ai essayé d'ajouter des en-têtes supplémentaires "Foo":"Bar" à la réponse et ils n'apparaissent pas dans la réponse curl. ALB semble manger mes en-têtes fournis par lambda. Comment puis-je résoudre ce problème ?

4voto

RaGe Points 12716

Il s'avère que j'avais activé les en-têtes multivaleurs pour mon groupe cible. Avec ce paramètre activé, mon lambda doit retourner une réponse avec le champ multiValueHeaders au lieu de headers . Mon code lambda devait donc être :

def handler(event, context):
response = {
    "statusCode": 200,
    "statusDescription": "200 OK",
    "isBase64Encoded": False,
    "multiValueHeaders": {
        "Content-Type": ["text/html; charset=utf-8"]
    }
}

Plus d'informations sur le blog de publication d'AWS .

0voto

Aress Support Points 1103

AWS Application Load Balancer transforme tous les en-têtes de réponse en minuscules, vous devez donc vérifier soigneusement vos en-têtes. Malheureusement, vous ne pouvez pas changer ou modifier les en-têtes manipulés par l'ALB. Vous pouvez consulter le lien ci-dessous pour les en-têtes HTTP :

https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/x-forwarded-headers.html

Pour le suivi des requêtes pour votre équilibreur de charge d'application :

https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-request-tracing.html

Vous devez également vérifier les limitations de l'équilibreur de charge :

  • L'équilibreur de charge met à jour l'en-tête lorsqu'il reçoit une requête entrante, et non lorsqu'il reçoit une réponse.

  • Si les en-têtes HTTP sont supérieurs à 7 Ko, l'équilibreur de charge réécrit l'en-tête X-Amzn-Trace-Id avec un champ Root.

  • Avec les WebSockets, vous ne pouvez effectuer un suivi que jusqu'à ce que la demande de mise à niveau aboutisse.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X