Structure d'évènements CloudFront Functions
CloudFront Functions envoie un objet event à votre code de fonction en tant qu'entrée lorsque le service exécute la fonction. Lorsque vous testez une fonction, vous créez l'objet event et le transférez à votre fonction. Lorsque vous créez un objet event pour tester une fonction, vous pouvez omettre les champs distributionDomainName, distributionId et requestId de l'objet context. Assurez-vous que les noms des en-têtes sont en minuscule, ce qui est toujours le cas dans l'objet event que les fonctions CloudFront envoient à votre fonction en production.
La section suivante présente une vue d'ensemble de la structure de cet objet d'évènement.
{ "version": "1.0", "context": { <context object> }, "viewer": { <viewer object> }, "request": { <request object> }, "response": { <response object> } }
Pour plus d’informations, consultez les rubriques suivantes :
Rubriques
Champ Version
Le champ version contient une chaîne qui spécifie la version de l'objet d'évènement CloudFront Functions. La version actuelle est 1.0.
Objet Contexte
L'objet context contient des informations contextuelles sur l'évènement. Il inclut les champs suivants :
distributionDomainName-
Le nom de domaine CloudFront (par exemple d111111abcdef8.cloudfront.net) de la distribution standard associée à l’événement.
Le champ
distributionDomainNamen’apparaît que lorsque votre fonction est invoquée pour les distributions standard. endpoint-
Le Nom de domaine CloudFront (par exemple d111111abcdef8.cloudfront.net) du groupe de connexions associé à l’événement.
Le champ
endpointn’apparaît que lorsque votre fonction est invoquée pour les distributions multi-locataires. distributionId-
ID de la distribution (par exemple EDFDVBD6EXAMPLE) associée à l’événement.
eventType-
Le type d'évènement,
viewer-requestouviewer-response. requestId-
Une chaîne qui identifie de manière unique une requête CloudFront (et sa réponse associée).
Objet Utilisateur
L'objet viewer comporte un champ ip dont la valeur est l'adresse IP de l'utilisateur (client) qui a envoyé la requête. Si la requête utilisateur a été envoyée via un proxy HTTP ou un équilibreur de charge, la valeur correspond à l'adresse IP du proxy ou de l'équilibreur de charge.
Objet Requête
L'objet request contient une représentation d'une requête HTTP envoyée par l'utilisateur à CloudFront. Dans l'objet event transféré à votre fonction, l'objet request représente la demande réelle que CloudFront a reçue de l'utilisateur.
Si votre code de fonction renvoie un objet request à CloudFront, il doit utiliser cette même structure.
L'objet request comporte les champs suivants :
method-
Méthode HTTP de la demande. Si votre code de fonction renvoie une
request, il ne peut pas modifier ce champ. Il s'agit du seul champ en lecture seule de l'objetrequest. uri-
Chemin d’accès relatif de l’objet demandé.
Note
Si votre fonction modifie la valeur
uri, les règles suivantes s’appliquent :-
La nouvelle valeur
uridoit commencer par une barre oblique (/). -
Lorsqu'une fonction modifie la valeur
uri, elle change l'objet que l'utilisateur demande. -
Quand une fonction modifie la valeur
uri, elle ne modifie pas le comportement de cache pour la demande ni l'origine vers laquelle la demande d'origine est envoyée.
-
querystring-
Objet qui représente la chaîne de requête dans la requête. Si la demande n'inclut pas de chaîne de requête, l'objet
requestinclut néanmoins un objetquerystringvide.L'objet
querystringcomporte un champ pour chaque paramètre de chaîne de requête dans la requête. headers-
Objet qui représente les en-têtes HTTP dans la requête. Si la requête contient des en-têtes
Cookie, ces derniers ne font pas partie de l'objetheaders. Les cookies sont représentés séparément dans l'objetcookies.L'objet
headerscomporte un champ pour chaque en-tête de la requête. Les noms des en-têtes sont convertis en minuscules ASCII dans l’objet d’événement, et les noms des en-têtes doivent être en minuscules ASCII lorsqu’ils sont ajoutés par votre code de fonction. Lorsque les fonctions CloudFront reconvertissent l’objet d’événement en demande HTTP, la première lettre de chaque mot du nom d’en-tête est mise en majuscule, si c’est une lettre ASCII. Les fonctions CloudFront n’appliquent aucune modification aux symboles non ASCII présents dans les noms d’en-tête. Par exemple,TÈst-headerdeviendratÈst-headerà l’intérieur de la fonction. Le symbole non ASCIIÈest inchangé.Les mots sont séparés par un trait d’union (
-). Par exemple, si votre code de fonction ajoute un en-tête nomméexample-header-name, CloudFront le convertit enExample-Header-Namedans la requête HTTP. cookies-
Objet qui représente les cookies dans la requête (en-têtes
Cookie).L'objet
cookiescomporte un champ pour chaque cookie dans la requête.
Pour plus d'informations sur la structure des chaînes de requêtes, des en-têtes et des cookies, consultez Structure d'une chaîne de requête, d'un en-tête ou d'un cookie.
Pour un exemple d'objet event, consultez Exemple d'objet d'événement.
Objet Réponse
L'objet response contient une représentation d'une réponse HTTP envoyée par CloudFront à l'utilisateur. Dans l'objet event transmis à votre fonction, l'objet response représente la réponse réelle de CloudFront à une demande de visionnage.
Si votre code de fonction renvoie un objet response, il doit utiliser cette même structure.
L'objet response comporte les champs suivants :
statusCode-
Code de statut HTTP de la réponse. Cette valeur est un entier, pas une chaîne.
Votre fonction peut générer ou modifier le
statusCode. statusDescription-
Description de l’état HTTP de la réponse. Si votre code de fonction génère une réponse, ce champ est facultatif.
headers-
Objet qui représente les en-têtes HTTP dans la réponse. Si la réponse contient des en-têtes
Set-Cookie, ces derniers ne font pas partie de l'objetheaders. Les cookies sont représentés séparément dans l'objetcookies.L'objet
headerscomporte un champ pour chaque en-tête de la réponse. Les noms des en-têtes sont convertis en minuscules dans l'objet d'événement, et les noms des en-têtes doivent être en minuscules lorsqu'ils sont ajoutés par votre code de fonction. Lorsque CloudFront Functions reconvertit l'objet d'événement en réponse HTTP, la première lettre de chaque mot dans les noms des en-têtes est mise en majuscules. Les mots sont séparés par un trait d'union (-). Par exemple, si votre code de fonction ajoute un en-tête nomméexample-header-name, CloudFront le convertit enExample-Header-Namedans la réponse HTTP. cookies-
Objet qui représente les cookies dans la réponse (en-têtes
Set-Cookie).L'objet
cookiescomporte un champ pour chaque cookie dans la réponse. body-
L'ajout du champ
bodyest facultatif et il ne sera pas présent dans l'objetresponseà moins que vous ne le spécifiiez dans votre fonction. Votre fonction n'a pas accès au corps d'origine renvoyé par le cache ou l'origine de CloudFront. Si vous n'indiquez pas le champbodydans votre fonction de réponse de visionnage, le corps d'origine renvoyé par le cache ou l'origine CloudFront est retourné à l'utilisateur.Si vous souhaitez que CloudFront renvoie un corps personnalisé à l'utilisateur, spécifiez le contenu du corps dans le champ
dataet le codage du corps dans le champencoding. Vous pouvez spécifier le codage sous forme de texte brut ("encoding": "text") ou de contenu codé en Base64 ("encoding": "base64").Comme raccourci, vous pouvez également spécifier le contenu du corps directement dans le champ
body("body": "<specify the body content here>"). Dans ce cas, omettez les champsdataetencoding. CloudFront traite le corps comme du texte brut dans ce cas.encoding-
Codage du contenu de
body(champdata). Les seuls encodages valides sonttextetbase64.Si vous spécifiez
encodingenbase64, mais que le corps n’est pas valide en base64, CloudFront renvoie une erreur. data-
Contenu de
body.
Pour plus d'informations sur les codes de statut modifiés et le contenu du corps, consultez Code de statut et corps.
Pour plus d'informations sur la structure des en-têtes et des cookies, consultez Structure d'une chaîne de requête, d'un en-tête ou d'un cookie.
Pour un exemple d’objet response, consultez Exemple d'objet de réponse.
Code de statut et corps
Avec fonctions CloudFront, vous pouvez mettre à jour le code de statut de réponse d'utilisateur et remplacer ou supprimer le corps entier de la réponse. Parmi les scénarios courants de mise à jour de la réponse d'utilisateur après avoir évalué certains aspects de la réponse depuis le cache ou l'origine CloudFront, citons les suivants :
-
Modification du statut pour définir un code de statut HTTP 200 et création d'un contenu de corps statique à renvoyer à l'utilisateur.
-
Modification du statut pour définir un code de statut HTTP 301 ou 302 afin de rediriger l'utilisateur vers un autre site Web.
-
Décider de diffuser ou de supprimer le corps de la réponse d'utilisateur.
Note
Si l'origine renvoie une erreur HTTP supérieure ou égale à 400, la fonction CloudFront ne s'exécutera pas. Pour plus d’informations, consultez Restrictions sur toutes les fonctions périphériques.
Lorsque vous utilisez la réponse HTTP, les fonctions CloudFront n'ont pas accès au corps de la réponse. Vous pouvez remplacer le contenu du corps en lui attribuant la valeur souhaitée, ou supprimer le corps 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 cache ou l'origine CloudFront est retourné à l'utilisateur.
Astuce
Lorsque vous utilisez les fonctions CloudFront pour remplacer un corps, veillez à aligner les en-têtes correspondants, tels que content-encoding, content-type ou content-length, sur le nouveau contenu du corps.
Par exemple, si l'origine ou le cache CloudFront renvoie content-encoding:
gzip mais que la fonction de réponse d'utilisateur définit un corps en texte brut, la fonction doit également modifier les en-têtes content-encoding et content-type en conséquence.
Si votre fonction CloudFront est configurée pour renvoyer une erreur HTTP égale ou supérieure à 400, votre utilisateur ne verra pas la page d'erreur personnalisée que vous avez spécifiée pour le même code de statut.
Structure d'une chaîne de requête, d'un en-tête ou d'un cookie
Les chaînes de requête, les en-têtes et les cookies partagent la même structure. Les chaînes de requête peuvent apparaître dans les demandes. Les en-têtes apparaissent dans les demandes et les réponses. Les cookies apparaissent dans les demandes et les réponses.
Chaque chaîne de requête, en-tête ou cookie est un champ unique au sein de l'objet parent querystring, headers ou cookies. Le nom du champ est le nom de la chaîne de requête, de l'en-tête ou du cookie. Chaque champ comporte une propriété value avec la valeur de la chaîne de requête, de l'en-tête ou du cookie.
Table des matières
Valeurs de chaînes de requête ou objets de chaîne de requête
Une fonction peut renvoyer une valeur de chaîne de requête en plus d'un objet de chaîne de requête. La valeur de chaîne de requête peut être utilisée pour organiser les paramètres de chaîne de requête dans n'importe quel ordre personnalisé.
Exemple exemple
Pour modifier une chaîne de requête dans le code d’une fonction, utilisez un code analogue au suivant.
var request = event.request; request.querystring = 'ID=42&Exp=1619740800&TTL=1440&NoValue=&querymv=val1&querymv=val2,val3';
Considérations spéciales pour les en-têtes
Pour les en-têtes uniquement, les noms des en-têtes sont convertis en minuscules dans l'objet d'événement, et les noms des en-têtes doivent être en minuscules lorsqu'ils sont ajoutés par votre code de fonction. Lorsque CloudFront Functions reconvertit l'objet d'événement en requête ou réponse HTTP, la première lettre de chaque mot dans les noms des en-têtes est mise en majuscules. Les mots sont séparés par un trait d'union (-). Par exemple, si votre code de fonction ajoute un en-tête nommé example-header-name, CloudFront le convertit en Example-Header-Name dans la requête ou la réponse HTTP.
Exemple exemple
Examinez l’en-tête Host suivant dans une demande HTTP.
Host: video.example.com
Cet en-tête est représenté comme suit dans l'objet request :
"headers": { "host": { "value": "video.example.com" } }
Pour accéder à l'en-tête Host dans votre code de fonction, utilisez le code comme suit :
var request = event.request; var host = request.headers.host.value;
Pour ajouter ou modifier un en-tête dans votre code de fonction, utilisez le code suivant (ce code ajoute un en-tête nommé X-Custom-Header avec la valeur example value) :
var request = event.request; request.headers['x-custom-header'] = {value: 'example value'};
Dupliquer les chaînes de requêtes, les en-têtes et les cookies (tableau multiValue)
Une requête ou une réponse HTTP peut contenir plusieurs chaînes de requêtes, en-têtes ou cookies portant le même nom. Dans ce cas, les chaînes de requêtes, les en-têtes ou les cookies en double sont regroupés dans un champ de l'objet request ou response, mais ce champ comporte une propriété supplémentaire nommée multiValue. La propriété multiValue contient un tableau avec les valeurs de chacun des en-têtes, cookies ou chaînes de requêtes dupliqués.
Exemple exemple
Imaginons une requête HTTP qui inclut les en-têtes Accept suivants.
Accept: application/json Accept: application/xml Accept: text/html
Ces en-têtes sont représentés comme suit dans l’objet request.
"headers": { "accept": { "value": "application/json", "multiValue": [ { "value": "application/json" }, { "value": "application/xml" }, { "value": "text/html" } ] } }
Note
La première valeur d’en-tête (dans ce cas, application/json) est répétée dans les propriétés value et multiValue. Cela vous permet d'accéder à toutes les valeurs en faisant une boucle dans le tableau multiValue.
Si le code de votre fonction modifie une chaîne de requête, un en-tête ou un cookie qui comporte un tableau multiValue, Fonctions CloudFront utilise les règles suivantes pour appliquer les modifications :
-
Si le tableau
multiValueexiste et comporte des modifications, ces dernières sont appliquées. Le premier élément de la propriétévalueest ignoré. -
Sinon, toute modification apportée à la propriété
valueest appliquée, et les valeurs suivantes (si elles existent) restent inchangées.
La propriété multiValue est utilisée uniquement lorsque la requête ou la réponse HTTP contient des chaînes de requêtes, des en-têtes ou des cookies en double portant le même nom, comme indiqué dans l'exemple précédent. Toutefois, s'il existe plusieurs valeurs dans un seul en-tête, cookie ou chaîne de requête, la propriété multiValue n'est pas utilisée.
Exemple exemple
Prenons l’exemple d’une demande avec un en-tête Accept contenant trois valeurs.
Accept: application/json, application/xml, text/html
Cet en-tête est représenté comme suit dans l’objet request.
"headers": { "accept": { "value": "application/json, application/xml, text/html" } }
Attributs de cookies
Dans un en-tête Set-Cookie d'une réponse HTTP, l'en-tête contient la paire nom-valeur du cookie et éventuellement un ensemble d'attributs séparés par des points-virgules.
Exemple exemple
Set-Cookie: cookie1=val1; Secure; Path=/; Domain=example.com; Expires=Wed, 05 Apr 2021 07:28:00 GMT
Dans l'objet response, ces attributs sont représentés dans la propriété attributes du champ cookie. Par exemple, l'en-tête Set-Cookie précédent est représenté comme suit :
"cookie1": { "value": "val1", "attributes": "Secure; Path=/; Domain=example.com; Expires=Wed, 05 Apr 2021 07:28:00 GMT" }
Exemple d'objet de réponse
L'exemple suivant montre un objet response (la sortie d'une fonction de réponse d'utilisateur) dans lequel le corps a été remplacé par une fonction de réponse d'utilisateur.
{ "response": { "statusCode": 200, "statusDescription": "OK", "headers": { "date": { "value": "Mon, 04 Apr 2021 18:57:56 GMT" }, "server": { "value": "gunicorn/19.9.0" }, "access-control-allow-origin": { "value": "*" }, "access-control-allow-credentials": { "value": "true" }, "content-type": { "value": "text/html" }, "content-length": { "value": "86" } }, "cookies": { "ID": { "value": "id1234", "attributes": "Expires=Wed, 05 Apr 2021 07:28:00 GMT" }, "Cookie1": { "value": "val1", "attributes": "Secure; Path=/; Domain=example.com; Expires=Wed, 05 Apr 2021 07:28:00 GMT", "multiValue": [ { "value": "val1", "attributes": "Secure; Path=/; Domain=example.com; Expires=Wed, 05 Apr 2021 07:28:00 GMT" }, { "value": "val2", "attributes": "Path=/cat; Domain=example.com; Expires=Wed, 10 Jan 2021 07:28:00 GMT" } ] } }, // Adding the body field is optional and it will not be present in the response object // unless you specify it in your function. // Your function does not have access to the original body returned by the CloudFront // cache or origin. // If you don't specify the body field in your viewer response function, the original // body returned by the CloudFront cache or origin is returned to viewer. "body": { "encoding": "text", "data": "<!DOCTYPE html><html><body><p>Here is your custom content.</p></body></html>" } } }
Exemple d'objet d'événement
L'exemple suivant illustre un objet event complet. Il s’agit d’un exemple d’invocation pour une distribution standard, et non pour une distribution multi-locataires. Pour les distributions multi-locataires, le champ endpoint est utilisé à la place de distributionDomainName. La valeur de endpoint correspond au nom de domaine CloudFront (par exemple, d111111abcdef8.cloudfront.net) du groupe de connexions associé à l’événement.
Note
L'objet event représente l'entrée de votre fonction. Votre fonction renvoie uniquement l'objet request ou response, et non l'objet event complet.
{ "version": "1.0", "context": { "distributionDomainName": "d111111abcdef8.cloudfront.net", "distributionId": "EDFDVBD6EXAMPLE", "eventType": "viewer-response", "requestId": "EXAMPLEntjQpEXAMPLE_SG5Z-EXAMPLEPmPfEXAMPLEu3EqEXAMPLE==" }, "viewer": {"ip": "198.51.100.11"}, "request": { "method": "GET", "uri": "/media/index.mpd", "querystring": { "ID": {"value": "42"}, "Exp": {"value": "1619740800"}, "TTL": {"value": "1440"}, "NoValue": {"value": ""}, "querymv": { "value": "val1", "multiValue": [ {"value": "val1"}, {"value": "val2,val3"} ] } }, "headers": { "host": {"value": "video.example.com"}, "user-agent": {"value": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0"}, "accept": { "value": "application/json", "multiValue": [ {"value": "application/json"}, {"value": "application/xml"}, {"value": "text/html"} ] }, "accept-language": {"value": "en-GB,en;q=0.5"}, "accept-encoding": {"value": "gzip, deflate, br"}, "origin": {"value": "https://website.example.com"}, "referer": {"value": "https://website.example.com/videos/12345678?action=play"}, "cloudfront-viewer-country": {"value": "GB"} }, "cookies": { "Cookie1": {"value": "value1"}, "Cookie2": {"value": "value2"}, "cookie_consent": {"value": "true"}, "cookiemv": { "value": "value3", "multiValue": [ {"value": "value3"}, {"value": "value4"} ] } } }, "response": { "statusCode": 200, "statusDescription": "OK", "headers": { "date": {"value": "Mon, 04 Apr 2021 18:57:56 GMT"}, "server": {"value": "gunicorn/19.9.0"}, "access-control-allow-origin": {"value": "*"}, "access-control-allow-credentials": {"value": "true"}, "content-type": {"value": "application/json"}, "content-length": {"value": "701"} }, "cookies": { "ID": { "value": "id1234", "attributes": "Expires=Wed, 05 Apr 2021 07:28:00 GMT" }, "Cookie1": { "value": "val1", "attributes": "Secure; Path=/; Domain=example.com; Expires=Wed, 05 Apr 2021 07:28:00 GMT", "multiValue": [ { "value": "val1", "attributes": "Secure; Path=/; Domain=example.com; Expires=Wed, 05 Apr 2021 07:28:00 GMT" }, { "value": "val2", "attributes": "Path=/cat; Domain=example.com; Expires=Wed, 10 Jan 2021 07:28:00 GMT" } ] } } } }