Utilisation des demandes et des réponses
Pour utiliser les demandes et réponses Lambda@Edge, consultez les rubriques suivantes :
Rubriques
Utilisation des fonctions Lambda@Edge avec le basculement d’origine
Vous pouvez utiliser les fonctions Lambda@Edge avec les distributions CloudFront que vous avez configurées avec les groupes d'origine, par exemple, pour le basculement d'origine que vous configurez pour assurer une haute disponibilité. Pour utiliser une fonction Lambda avec un groupe d'origine, spécifiez la fonction dans une requête d'origine ou un déclencheur de réponse de l'origine pour un groupe d'origine lorsque vous créez le comportement de cache.
Pour plus d’informations, consultez les ressources suivantes :
-
Création d’un groupe d’origines : Création d’un groupe d’origine
-
Comment fonctionne le basculement d'origine avec Lambda@Edge: Utilisation du basculement d'origine avec les fonctions Lambda@Edge
Génération de réponses HTTP dans les déclencheurs de demande
Lorsque CloudFront reçoit une demande, vous pouvez utiliser une fonction Lambda pour générer une réponse HTTP que CloudFront renvoie directement à l'utilisateur sans transmettre la réponse à l'origine. La génération de réponses HTTP réduit la charge sur le serveur d'origine, et aussi généralement la latence pour l'utilisateur.
Les scénarios courants pour générer des réponses HTTP sont les suivants :
-
Renvoi d'une petite page web à l'utilisateur
-
Renvoi d'un code de statut HTTP 301 ou 302 pour rediriger l'utilisateur vers une autre page web
-
Renvoi d'un code de statut HTTP 401 lorsque l'utilisateur ne s'est pas authentifié
Une fonction Lambda@Edge peut générer une réponse HTTP lorsque les événements CloudFront suivants se produisent :
- Événements de demande utilisateur
-
Lorsqu'une fonction est déclenchée par un événement de demande utilisateur, CloudFront lui renvoie la réponse et ne la met pas en cache.
- Événements de demande à l'origine
-
Lorsqu'une fonction est déclenchée par un événement de demande à l'origine, CloudFront vérifie dans le cache périphérique si une réponse a déjà été générée par la fonction.
-
Si la réponse se trouve dans le cache, la fonction n'est pas exécutée et CloudFront renvoie la réponse du cache à l'utilisateur.
-
Si la réponse ne se trouve pas dans le cache, la fonction est exécutée et CloudFront renvoie la réponse à l'utilisateur et la met dans le cache.
-
Pour voir un exemple de code permettant de générer des réponses HTTP, consultez Exemples de fonctions Lambda@Edge. Vous pouvez également remplacer les réponses HTTP dans les déclencheurs de réponse. Pour plus d’informations, consultez Mise à jour des réponses HTTP dans des déclencheurs de réponse de l’origine.
Modèle de programmation
Cette section décrit le modèle de programmation permettant d'utiliser Lambda@Edge pour générer des réponses HTTP.
Objet Réponse
La réponse que vous renvoyez en tant que paramètre result de la méthode callback doit avoir la structure suivante (notez que seul le champ status est requis).
const response = { body: 'content', bodyEncoding: 'text' | 'base64', headers: { 'header name in lowercase': [{ key: 'header name in standard case', value: 'header value' }], ... }, status: 'HTTP status code (string)', statusDescription: 'status description' };
L'objet de réponse peut inclure les valeurs suivantes :
body-
Corps, s'il existe, que vous souhaitez que CloudFront renvoie dans la réponse générée.
bodyEncoding-
Encodage de la valeur que vous avez spécifiée dans
body. Les seuls encodages valides sonttextetbase64. Si vous incluezbodydans l'objetresponse, mais omettezbodyEncoding, CloudFront traite le corps comme du texte.Si vous spécifiez
bodyEncodingenbase64, mais que le corps n'est pas valide en base64, CloudFront renvoie une erreur. headers-
En-têtes que vous voulez que CloudFront renvoie dans la réponse générée. Remarques :
-
Les clés figurant dans l’objet
headerssont les versions en minuscules des noms d’en-têtes HTTP standard. L'utilisation des minuscules vous permet d'accéder aux valeurs des en-têtes sans tenir compte de la casse. -
Chaque en-tête (par exemple,
headers["accept"]ouheaders["host"]) est un tableau de paires clé-valeur. Pour un en-tête donné, le tableau contient une paire clé-valeur pour chaque valeur de la réponse générée. -
key(facultatif) est le nom de l'en-tête sensible à la casse tel qu'il s'affiche dans une demande HTTP, par exemple,acceptouhost. -
Indiquez
valuecomme valeur d'en-tête. -
Si vous n'incluez pas la partie clé d'en-tête de la paire clé-valeur, Lambda@Edge insère automatiquement une clé d'en-tête à l'aide du nom d'en-tête que vous fournissez. Quelle que soit la manière dont vous avez formaté le nom d'en-tête, la clé d'en-tête qui est insérée est formatée automatiquement avec une majuscule initiale pour les différentes parties séparées par des tirets (-).
Par exemple, vous pouvez ajouter un en-tête comme suit, sans clé d'en-tête :
'content-type': [{ value: 'text/html;charset=UTF-8' }]Dans cet exemple, Lambda@Edge crée la clé d'en-tête suivante :
Content-Type.
Pour plus d’informations sur les restrictions applicables à l’utilisation d’en-têtes, consultez Restrictions sur les fonctions périphériques.
-
status-
Codes d'état HTTP. Indiquez le code d'état sous forme de chaîne. CloudFront utilise le code d'état fourni pour les éléments suivants :
-
Renvoi dans la réponse
-
Mise en cache dans le cache périphérique de CloudFront, lorsque la réponse a été générée par une fonction déclenchée par un événement de demande à l'origine
-
Connexion à CloudFront Journalisation standard (journaux d’accès)
Si la valeur
statusn'est pas comprise entre 200 et 599, CloudFront renvoie une erreur à l'utilisateur. -
statusDescription-
Description que vous souhaitez que CloudFront renvoie dans la réponse avec le code de statut HTTP. Vous n'avez pas besoin d'utiliser de descriptions standard, telles que
OKpour un code de statut HTTP 200.
Erreurs
Voici des erreurs possibles pour les réponses HTTP générées.
La réponse contient un corps et un code de statut HTTP 204 (Pas de contenu-
Lorsqu'une fonction est déclenchée par une demande utilisateur, CloudFront renvoie un code de statut HTTP 502 (Passerelle incorrecte) à l'utilisateur lorsque les deux conditions suivantes sont réunies :
-
La valeur du code
statusest 204 (Pas de contenu) -
La réponse inclut une valeur pour
body
Cela vient du fait que Lambda@Edge impose la restriction facultative incluse dans la RFC 2616, qui stipule qu'une réponse
HTTP 204n'a pas besoin d'inclure de corps de message. -
Restrictions concernant la taille de la réponse générée-
La taille maximale d'une réponse générée par une fonction Lambda dépend de l'événement qui a déclenché la fonction :
-
Événements de demande utilisateur – 40 Ko
-
Événements de demande à l'origine – 1 Mo
Si la réponse est supérieure à la taille autorisée, CloudFront renvoie un code de statut HTTP 502 (Passerelle incorrecte) à l'utilisateur.
-
Champs obligatoires
Le champ status est obligatoire.
Tous les autres champs sont facultatifs.
Mise à jour des réponses HTTP dans des déclencheurs de réponse de l’origine
Lorsque CloudFront reçoit une réponse HTTP du serveur d'origine, si un déclencheur de réponse de l'origine est associé au comportement du cache, vous pouvez modifier la réponse HTTP pour remplacer celle renvoyée par l'origine.
Les scénarios courants pour mettre à jour des réponses HTTP sont les suivants :
-
Modification du statut sur HTTP 200 et création d'un contenu de corps statique à renvoyer à l'utilisateur lorsqu'une origine renvoie un code de statut d'erreur (4xx ou 5xx). Pour un exemple de code, consultez Exemple : utilisation d’un déclencheur de réponse de l’origine pour mettre à jour le code de statut d’erreur sur 200.
-
Modification du statut pour définir un code de statut HTTP 301 ou HTTP 302, afin de rediriger l'utilisateur vers un autre site web lorsqu'une origine renvoie un code de statut d'erreur (4xx ou 5xx). Pour un exemple de code, consultez Exemple : utilisation d’un déclencheur de réponse de l’origine pour mettre à jour le code de statut d’erreur sur 302.
Note
La fonction doit renvoyer une valeur de statut comprise entre 200 et 599 (limites incluses), sinon CloudFront renvoie une erreur à l'utilisateur.
Vous pouvez également remplacer les réponses HTTP dans les événements de requête utilisateur et à l'origine. Pour plus d’informations, consultez Génération de réponses HTTP dans les déclencheurs de demande.
Lorsque vous utilisez la réponse HTTP, Lambda@Edge n'expose pas le corps renvoyé par le serveur d'origine au déclencheur de réponse de l'origine. Vous pouvez générer un corps de contenu statique en lui attribuant la valeur souhaitée, ou supprimer le corps à l'intérieur de la fonction en définissant une valeur vide. Si vous n'actualisez pas le champ du corps dans votre fonction, le corps d'origine renvoyé par le serveur d'origine est renvoyé à l'utilisateur.
Accès au corps de requête en choisissant l’option Inclure le corps
Vous pouvez décider que Lambda@Edge expose le corps dans une demande pour des méthodes HTTP accessibles en écriture (POST, PUT, DELETE, etc.) afin que vous puissiez y accéder dans vos fonctions Lambda. Vous pouvez choisir un accès en lecture seule ou vous pouvez préciser que vous remplacerez le corps.
Pour activer cette option, choisissez Include Body (Inclure le corps) lorsque vous créez un déclencheur CloudFront pour votre fonction qui correspond à un pour un événement de demande utilisateur ou de demande d'origine. Pour plus d’informations, consultez Ajout de déclencheurs pour une fonction Lambda@Edge, ou pour en savoir plus sur l’utilisation de Include Body (Inclure le corps) avec votre fonction, consultez Structure d'événement Lambda@Edge.
Les scénarios lorsque vous êtes susceptibles de vouloir utiliser cette fonction incluent les éléments suivants :
-
Traitement des formulaires Web, comme « Contactez-nous », sans renvoyer les données saisies par le client aux serveurs d'origine.
-
Collecte des données de balise web envoyées par les navigateurs des utilisateurs et traitement de ces données en périphérie.
Pour un exemple de code, consultez Exemples de fonctions Lambda@Edge.
Note
Si le corps de la demande est grand, Lambda@Edge le tronque. Pour plus d’informations sur la taille maximale et la troncature, consultez Restrictions relatives au corps de la requête avec l'option Inclure le corps.