Fonctions Lambda en tant que cibles - Elastic Load Balancing

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Fonctions Lambda en tant que cibles

Vous pouvez enregistrer vos fonctions Lambda en tant que cibles et configurer une règle de l'écouteur pour acheminer les demandes vers le groupe cible de votre fonction Lambda. Lorsque l'équilibreur de charge transmet la demande à un groupe cible avec une fonction Lambda en tant que cible, il appelle votre fonction Lambda et transmet le contenu de la demande à la fonction Lambda, au format JSON.

Limites
  • La fonction Lambda et le groupe cible doivent être dans le même compte et dans la même région.

  • La taille maximale du corps de demande que vous pouvez envoyer à une fonction Lambda est de 1 Mo. Pour connaître les limites de taille associées, consultez Limites d'en-tête HTTP.

  • La taille maximale de la réponse JSON que la fonction Lambda peut envoyer est de 1 Mo.

  • WebSockets ne sont pas pris en charge. Les demandes de mise à niveau sont rejetées avec un code HTTP 400.

  • Les zones Locales ne sont pas prises en charge.

  • Les poids cibles automatiques (ATW) ne sont pas pris en charge.

Pour une démonstration, consultez Cible Lambda sur Application Load Balancer.

Préparation de la fonction Lambda

La recommandation suivante doit être suivie si vous utiliser votre fonction Lambda avec un Application Load Balancer.

Autorisations pour invoquer la fonction Lambda

Si vous créez le groupe cible et que vous enregistrez la fonction Lambda à l'aide d' AWS Management Console, la console ajoute les autorisations requises à la stratégie de fonction Lambda en votre nom. Sinon, après avoir créé le groupe cible et enregistré la fonction à l'aide de AWS CLI, vous devez utiliser la commande add permission pour autoriser Elastic Load Balancing à appeler votre fonction Lambda. Nous vous recommandons d'utiliser les clés de condition aws:SourceAccount et aws:SourceArn pour restreindre l'invocation des fonctions au groupe cible spécifié. Pour de plus amples informations, veuillez consulter Le problème du député confus dans le Guide de l'utilisateur IAM,

aws lambda add-permission \ --function-name lambda-function-arn-with-alias-name \ --statement-id elb1 \ --principal elasticloadbalancing.amazonaws.com \ --action lambda:InvokeFunction \ --source-arn target-group-arn \ --source-account target-group-account-id
Gestion des versions de fonction Lambda

Vous pouvez enregistrer une seule fonction Lambda par groupe cible. Pour pouvoir modifier votre fonction Lambda et pour que l'équilibreur de charge appelle toujours la version actuelle de la fonction Lambda, créez un alias de fonction et incluez l'alias dans l'ARN de la fonction lorsque vous enregistrez la fonction Lambda auprès de l'équilibreur de charge. Pour plus d'informations, consultez Gestions des versions et alias des fonctions AWS Lambda et Déplacement du trafic à l'aide des alias dans le Guide du développeur AWS Lambda .

Délai d'expiration de la fonction

L'équilibreur de charge attend que votre fonction Lambda réponde ou expire. Nous vous recommandons de configurer le délai d'expiration de la fonction Lambda en fonction du temps d'exécution prévu. Pour plus d'informations sur la valeur de délai d'expiration par défaut et sur la façon de modifier ce paramètre, consultez Configuration de base d'une fonction AWS Lambda. Pour plus d'informations sur la valeur de délai d'expiration maximale que vous pouvez configurer, consultez Limites AWS Lambda.

Création d'un groupe cible pour la fonction Lambda

Créez un groupe cible, qui sert à acheminer les demandes. Si le contenu de la demande correspond à une règle de l'écouteur avec une action pour la réacheminer à ce groupe cible, l'équilibreur de charge appelle la fonction Lambda enregistrée.

Pour créer un groupe cible et enregistrer la fonction Lambda à l'aide de la console
  1. Ouvrez la console Amazon EC2 à l'adresse https://console.aws.amazon.com/ec2/.

  2. Dans le panneau de navigation, sous Load Balancing (Répartition de charge), choisissez Target Groups (Groupes cibles).

  3. Sélectionnez Créer un groupe cible.

  4. Pour Choisir un type de cible, sélectionnez Fonction Lambda.

  5. Pour Target group name, tapez le nom du groupe cible.

  6. (Facultatif) Pour activer les surveillances de l'état, sélectionnez Activer dans la section Surveillances de l'état.

  7. (Facultatif) Ajoutez une ou plusieurs balises comme suit :

    1. Développez la section identification.

    2. Choisissez Ajouter une balise.

    3. Saisissez la clé d'identification et la valeur de l'identification.

  8. Choisissez Suivant.

  9. Spécifiez une seule fonction Lambda ou omettez cette étape et spécifiez une fonction Lambda ultérieurement.

  10. Sélectionnez Créer un groupe cible.

Pour créer un groupe cible et enregistrer la fonction Lambda à l'aide de l' AWS CLI

Utilisez les commandes create-target-group et register-targets.

Réception d'événements depuis l'équilibreur de charge

L'équilibreur de charge prend en charge l'invocation Lambda pour les demandes via HTTP et HTTPS. L'équilibreur de charge envoie un événement au format JSON. L'équilibreur de charge ajoute les en-têtes suivants à chaque demande : X-Amzn-Trace-Id, X-Forwarded-For, X-Forwarded-Port et X-Forwarded-Proto.

Si l'en-tête content-encoding est présent, l'équilibreur de charge encode en Base64 le corps et définit isBase64Encoded sur true.

Si l'en-tête content-encoding n'est pas présent, le codage Base64 dépend du type de contenu. Pour les types suivants, l'équilibreur de charge envoie le corps en l'état et définit isBase64Encoded sur false : texte/*, application/json, application/javascript et application/xml. Dans le cas contraire, l'équilibreur de charge encode en Base64 le corps et définit isBase64Encoded sur true.

Voici un exemple d'événement.

{ "requestContext": { "elb": { "targetGroupArn": "arn:aws:elasticloadbalancing:region:123456789012:targetgroup/my-target-group/6d0ecf831eec9f09" } }, "httpMethod": "GET", "path": "/", "queryStringParameters": {parameters}, "headers": { "accept": "text/html,application/xhtml+xml", "accept-language": "en-US,en;q=0.8", "content-type": "text/plain", "cookie": "cookies", "host": "lambda-846800462-us-east-2.elb.amazonaws.com", "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6)", "x-amzn-trace-id": "Root=1-5bdb40ca-556d8b0c50dc66f0511bf520", "x-forwarded-for": "72.21.198.66", "x-forwarded-port": "443", "x-forwarded-proto": "https" }, "isBase64Encoded": false, "body": "request_body" }

Réponse à l'équilibreur de charge

La réponse de votre fonction Lambda doit inclure le statut d'encodage en Base64, le code de statut et des en-têtes. Vous pouvez omettre le corps.

Pour inclure un contenu binaire dans le corps de la réponse, vous devez encoder le contenu en Base64 et définir isBase64Encoded sur true. L'équilibreur de charge décode le contenu pour récupérer le contenu binaire et l'envoie au client dans le corps de la réponse HTTP.

L'équilibreur de charge ne respecte pas hop-by-hop les en-têtes tels Connection que ou. Transfer-Encoding Vous pouvez omettre l'en-tête Content-Length parce que l'équilibreur de charge le calcule avant d'envoyer des réponses aux clients.

Voici un exemple de réponse d'une fonction Lambda basée sur nodejs.

{ "isBase64Encoded": false, "statusCode": 200, "statusDescription": "200 OK", "headers": { "Set-cookie": "cookies", "Content-Type": "application/json" }, "body": "Hello from Lambda (optional)" }

Pour les modèles de fonction Lambda qui fonctionnent avec Application Load Balancers, consultez application-load-balancer-serverless-app sur GitHub. Vous pouvez également ouvrir la Console Lambda, sélectionner Applications, Créer une application, et sélectionner l'un des éléments suivants : AWS Serverless Application Repository

  • ALB-Lambda - Cible - S3 UploadFileto

  • ALB-Lambda-Cible- BinaryResponse

  • ALB-Lambda - Target - IP WhatisMy

En-têtes à valeurs multiples

Si des demandes d'un client ou des réponses d'une fonction Lambda contiennent des en-têtes à valeurs multiples ou comportent le même en-tête plusieurs fois, ou des paramètres de requête à valeurs multiples pour la même clé, vous pouvez activer la prise en charge de la syntaxe des en-têtes à valeurs multiples. Une fois les en-têtes à valeurs multiples activés, les en-têtes et les paramètres de requête échangés entre l'équilibreur de charge et la fonction Lambda utilisent des tableaux au lieu de chaînes. Si vous n'activez pas la syntaxe des en-tête à valeurs multiples et si un en-tête ou un paramètre de requête comprend plusieurs valeurs, l'équilibreur de charge utilise la dernière valeur qu'il reçoit.

Demandes avec des en-têtes à valeurs multiples

Les noms des champs utilisés pour les en-têtes et les paramètres des chaînes de requête diffèrent selon que vous activez ou non les en-têtes à valeurs multiples pour le groupe cible.

L'exemple de demande suivant comporte deux paramètres de requête avec la même clé :

http://www.example.com?&myKey=val1&myKey=val2

Avec le format par défaut, l'équilibreur de charge utilise la dernière valeur envoyée par le client et vous envoie un événement qui comprend des paramètres de chaînes de requête avec queryStringParameters. Par exemple :

"queryStringParameters": { "myKey": "val2"},

Si vous activez des en-têtes à valeurs multiples, l'équilibreur de charge utilise les deux valeurs de clé envoyées par le client et vous envoie un événement qui comprend des paramètres de chaînes de requête avec multiValueQueryStringParameters Par exemple :

"multiValueQueryStringParameters": { "myKey": ["val1", "val2"] },

De la même, supposons que le client envoie une demande avec deux cookies dans l'en-tête :

"cookie": "name1=value1", "cookie": "name2=value2",

Avec le format par défaut, l'équilibreur de charge utilise le dernier cookie envoyé par le client et vous envoie un événement qui comprend des en-têtes avec headers. Par exemple :

"headers": { "cookie": "name2=value2", ... },

Si vous activez des en-têtes à valeurs multiples, l'équilibreur de charge utilise les deux cookies envoyés par le client et vous envoie un événement qui comprend des en-têtes avec multiValueHeaders. Par exemple :

"multiValueHeaders": { "cookie": ["name1=value1", "name2=value2"], ... },

Si les paramètres de requête sont encodés en URL, l'équilibreur de charge ne les décode pas. Vous devez les décoder dans votre fonction Lambda.

Réponses avec des en-têtes à valeurs multiples

Les noms des champs utilisés pour les en-têtes diffèrent selon que vous activez ou non les en-têtes à valeurs multiples pour le groupe cible. Vous devez utiliser multiValueHeaders si vous avez activé des en-têtes à valeurs multiples et headers dans les autres cas.

Avec le format par défaut, vous pouvez spécifier un seul cookie :

{ "headers": { "Set-cookie": "cookie-name=cookie-value;Domain=myweb.com;Secure;HttpOnly", "Content-Type": "application/json" }, }

Si vous activez des en-têtes à valeurs multiples, vous devez spécifier plusieurs cookies, comme suit :

{ "multiValueHeaders": { "Set-cookie": ["cookie-name=cookie-value;Domain=myweb.com;Secure;HttpOnly","cookie-name=cookie-value;Expires=May 8, 2019"], "Content-Type": ["application/json"] }, }

L'équilibreur de charge peut envoyer les en-têtes au client dans un ordre différent de celui spécifié dans la charge utile de la réponse Lambda. Par conséquent, ne comptez pas sur le renvoi des en-têtes dans un ordre précis.

Activation des en-têtes à valeurs multiples

Vous pouvez activer ou désactiver les en-têtes à valeurs multiples pour un groupe cible avec le type de cible lambda.

Pour activer les en-têtes à valeurs multiples à l'aide de la console
  1. Ouvrez la console Amazon EC2 à l'adresse https://console.aws.amazon.com/ec2/.

  2. Dans le panneau de navigation, sous Load Balancing (Répartition de charge), choisissez Target Groups (Groupes cibles).

  3. Sélectionnez le nom du groupe cible pour afficher sa page de détails.

  4. Dans l'onglet Détails du groupe, dans la section Attributs, choisissez Modifier.

  5. Sélectionnez ou désactivez les En-têtes à valeurs multiples.

  6. Sélectionnez Enregistrer les modifications.

Pour activer les en-têtes à valeurs multiples à l'aide du AWS CLI

Utilisez la commande modify-target-group-attributes avec l'attribut lambda.multi_value_headers.enabled.

Activation des surveillances de l'état

Par défaut, les vérifications de l'état sont désactivées pour les groupes cibles de type lambda. Vous pouvez activer les surveillances de l'état afin d'implémenter le basculement DNS avec Amazon Route 53. La fonction Lambda peut vérifier l'état d'un service en aval avant de répondre à la demande de vérification de l'état. Si la réponse de la fonction Lambda indique un échec de surveillance de l'état, cet échec est transmis à Route 53. Vous pouvez configurer Route 53 pour basculer vers une pile d'applications de secours.

Les surveillances de l'état vous sont facturées comme pour toute invocation d'une fonction Lambda.

Voici le format de l'événement de vérification de l'état envoyé à votre fonction Lambda. Pour vérifier si un événement est un événement de vérification de l'état, consultez la valeur du champ de l'agent utilisateur. L'agent utilisateur pour les vérifications de l'état est ELB-HealthChecker/2.0.

{ "requestContext": { "elb": { "targetGroupArn": "arn:aws:elasticloadbalancing:region:123456789012:targetgroup/my-target-group/6d0ecf831eec9f09" } }, "httpMethod": "GET", "path": "/", "queryStringParameters": {}, "headers": { "user-agent": "ELB-HealthChecker/2.0" }, "body": "", "isBase64Encoded": false }
Pour activer les contrôles de santé d'un groupe cible à l'aide de la console
  1. Ouvrez la console Amazon EC2 à l'adresse https://console.aws.amazon.com/ec2/.

  2. Dans le panneau de navigation, sous Load Balancing (Répartition de charge), choisissez Target Groups (Groupes cibles).

  3. Sélectionnez le nom du groupe cible pour afficher sa page de détails.

  4. Dans l'onglet Détails du groupe, dans la section Paramètres de surveillance de l'état, choisissez Modifier.

  5. Pour Surveillances de l'état, sélectionnez Activer.

  6. Sélectionnez Enregistrer les modifications.

Pour activer les bilans de santé d'un groupe cible à l'aide du AWS CLI

Utilisez la commande modify-target-group avec l' option --health-check-enabled.

Annulation de l'enregistrement de la fonction Lambda

Si vous n'avez plus besoin d'envoyer le trafic vers votre fonction Lambda, vous pouvez annuler son enregistrement. Lorsque vous annulez l'enregistrement d'une fonction Lambda, les demandes en cours échouent avec des erreurs HTTP 5XX.

Pour remplacer une fonction Lambda, nous vous recommandons de créer un nouveau groupe cible, d'enregistrer la nouvelle fonction auprès du nouveau groupe cible et de mettre à jour les règles d'écouteur pour utiliser le nouveau groupe cible au lieu du groupe existant.

Pour désenregistrer la fonction Lambda à l'aide de la console
  1. Ouvrez la console Amazon EC2 à l'adresse https://console.aws.amazon.com/ec2/.

  2. Dans le panneau de navigation, sous Load Balancing (Répartition de charge), choisissez Target Groups (Groupes cibles).

  3. Sélectionnez le nom du groupe cible pour afficher sa page de détails.

  4. Dans l'onglet Cibles, choisissez Deregister (Annuler l'enregistrement).

  5. Lorsque vous êtes invité à confirmer l'opération, choisissez Annuler l'enregistrement.

Pour annuler l'enregistrement de la fonction Lambda à l'aide du AWS CLI

Utilisez la commande deregister-targets.