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.
Utiliser les fonctions Lambda comme cibles d'un Application Load Balancer
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.
L'équilibreur de charge invoque directement la fonction Lambda au lieu d'utiliser une connexion réseau. Par conséquent, les règles sortantes des groupes de sécurité Network Load Balancer ne sont pas requises.
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.
Table des matières
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-idelb1
\ --principal elasticloadbalancing.amazonaws.com \ --action lambda:InvokeFunction \ --source-arntarget-group-arn
\ --source-accounttarget-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 AWS Lambda la section Alias de fonction dans le Guide du AWS Lambda développeur.
Délai d’expiration des fonctions
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 du délai d'expiration par défaut et sur la manière de la modifier, voir Configurer le délai d'expiration de la fonction Lambda. Pour plus d'informations sur le délai d'expiration maximal que vous pouvez configurer, consultez la section AWS Lambda Quotas.
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.
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 tel quel et le définit isBase64Encoded
sur false
: text/*,. application/json, application/javascript, and 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 fonctions Lambda qui fonctionnent avec les équilibreurs de charge d'application, voir application-load-balancer-serverless-app
-
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.
Table des matières
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
.
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
}
Enregistrez la fonction Lambda
Vous pouvez enregistrer une seule fonction Lambda auprès de chaque groupe cible. 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 du récepteur pour utiliser le nouveau groupe cible.
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 du récepteur pour utiliser le nouveau groupe cible.