Structure d'événement Lambda@Edge - Amazon CloudFront

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.

Structure d'événement Lambda@Edge

Les rubriques suivantes décrivent les objets d'événements de demande et de réponse CloudFront transmis à une fonction Lambda @Edge lorsqu'elle est déclenchée.

Sélection de l'origine dynamique

Vous pouvez utiliser le modèle de chemin dans un comportement de cache pour router les demandes vers une origine, en fonction du chemin et du nom de l'objet demandé, tels que images/*.jpg. En utilisant Lambda@Edge, vous pouvez également acheminer des demandes vers une origine en fonction d'autres caractéristiques, comme les valeurs contenues dans les en-têtes de la demande.

Cette sélection d'origine dynamique peut être utile de diverses façons. Par exemple, vous pouvez répartir les demandes entre des origines de différentes zones géographiques pour vous aider à réaliser un équilibrage de charge international. Ou vous pouvez acheminer de façon sélective des demandes vers différentes origines servant chacune une fonction donnée : gestion du robot, optimisation de la stratégie SEO, authentification, etc. Pour obtenir des exemples de code qui expliquent comment utiliser cette fonction, veuillez consulter Sélection d'origine dynamique basée sur le contenu – exemples.

Dans l'événement de demande CloudFront d'origine, l'originobjet de la structure d'événement contient des informations sur l'origine vers laquelle la demande serait acheminée, en fonction du modèle de chemin. Vous pouvez mettre à jour les valeurs de l'objet origin pour router une demande vers une autre origine. Quand vous mettez à jour l'objet origin, vous n'avez pas besoin de définir l'origine dans la distribution. Vous pouvez également remplacer un objet d'origine Amazon S3 par un objet d'origine personnalisée, et vice versa. Toutefois, vous ne pouvez spécifier qu'une seule origine par demande ; une origine personnalisée ou une origine Amazon S3, mais pas les deux.

Événements de demande

Les rubriques suivantes présentent la structure de l'objet transmis à une fonction Lambda pour les événements de demande d'affichage et d'origine. CloudFront Ces exemples montrent une demande GET sans corps. Après les exemples, vous trouverez la liste de tous les champs possibles dans les événements de demande d'utilisateur et d'origine.

Exemple de demande d'utilisateur

L'exemple suivant montre un objet d'événement de demande d'utilisateur.

{ "Records": [ { "cf": { "config": { "distributionDomainName": "d111111abcdef8.cloudfront.net", "distributionId": "EDFDVBD6EXAMPLE", "eventType": "viewer-request", "requestId": "4TyzHTaYWb1GX1qTfsHhEqV6HUDd_BzoBZnwfnvQc_1oF26ClkoUSEQ==" }, "request": { "clientIp": "203.0.113.178", "headers": { "host": [ { "key": "Host", "value": "d111111abcdef8.cloudfront.net" } ], "user-agent": [ { "key": "User-Agent", "value": "curl/7.66.0" } ], "accept": [ { "key": "accept", "value": "*/*" } ] }, "method": "GET", "querystring": "", "uri": "/" } } } ] }

Exemple de demande de l'origine

L'exemple suivant montre un objet d'événement de demande d'origine.

{ "Records": [ { "cf": { "config": { "distributionDomainName": "d111111abcdef8.cloudfront.net", "distributionId": "EDFDVBD6EXAMPLE", "eventType": "origin-request", "requestId": "4TyzHTaYWb1GX1qTfsHhEqV6HUDd_BzoBZnwfnvQc_1oF26ClkoUSEQ==" }, "request": { "clientIp": "203.0.113.178", "headers": { "x-forwarded-for": [ { "key": "X-Forwarded-For", "value": "203.0.113.178" } ], "user-agent": [ { "key": "User-Agent", "value": "Amazon CloudFront" } ], "via": [ { "key": "Via", "value": "2.0 2afae0d44e2540f472c0635ab62c232b.cloudfront.net (CloudFront)" } ], "host": [ { "key": "Host", "value": "example.org" } ], "cache-control": [ { "key": "Cache-Control", "value": "no-cache" } ] }, "method": "GET", "origin": { "custom": { "customHeaders": {}, "domainName": "example.org", "keepaliveTimeout": 5, "path": "", "port": 443, "protocol": "https", "readTimeout": 30, "sslProtocols": [ "TLSv1", "TLSv1.1", "TLSv1.2" ] } }, "querystring": "", "uri": "/" } } } ] }

Champs d'événement de demande

Les données d'objet d'événement de demande sont contenues dans deux sous-objets : config (Records.cf.config) et request (Records.cf.request). Les listes suivantes décrivent les champs de chaque sous-objet.

Champs de l’objet config

La liste suivante décrit les champs figurant dans l’objet config (Records.cf.config).

distributionDomainName (lecture seule)

Nom de domaine de la distribution qui est associée à la demande.

distributionID (lecture seule)

ID de la distribution qui est associée à la demande.

eventType (lecture seule)

Type de déclencheur associé à la demande : viewer-request ou origin-request.

requestId (lecture seule)

Chaîne cryptée qui identifie de manière unique une viewer-to-CloudFront demande. La valeur requestId apparaît également dans les journaux d'accès de CloudFront en tant que x-edge-request-id. Pour plus d’informations, consultez Journalisation standard (journaux d'accès) et Champs du fichier journal.

Champs de l'objet de demande

La liste suivante décrit les champs figurant dans l’objet request (Records.cf.request).

clientIp (lecture seule)

Adresse IP de l'utilisateur qui a émis la requête. Si l'utilisateur a utilisé un proxy HTTP ou un équilibreur de charge pour envoyer la demande, la valeur correspond à l'adresse IP du proxy ou de l'équilibreur de charge.

en-têtes (lecture/écriture)

En-têtes de la requête. Remarques :

  • Les clés figurant dans l’objet headers sont 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 objet d’en-tête (par exemple, headers["accept"] ou headers["host"]) est un tableau de paires clé-valeur. Pour un en-tête donné, le tableau contient une paire clé-valeur pour chaque valeur dans la demande.

  • key contient le nom sensible à la casse de l'en-tête tel qu'il apparaissait dans la requête HTTP ; par exemple, Host, User-Agent, X-Forwarded-For, etc.

  • value contient la valeur d'en-tête telle qu'elle apparaissait dans la requête HTTP.

  • Lorsque votre fonction Lambda ajoute ou modifie des en-têtes de demande et que vous n'incluez pas le champ key d'en-tête, Lambda@Edge insère automatiquement une clé (key) d'en-tête en utilisant le 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 automatiquement est formatée avec une majuscule initiale pour chaque partie, séparée par des tirets (-).

    Par exemple, vous pouvez ajouter un en-tête comme le suivant, sans clé (key) d’en-tête :

    "user-agent": [ { "value": "ExampleCustomUserAgent/1.X.0" } ]

    Dans cet exemple, Lambda@Edge insère automatiquement "key": "User-Agent".

Pour plus d’informations sur les restrictions applicables à l’utilisation d’en-têtes, consultez Restrictions sur les fonctions périphériques.

method (lecture seule)

Méthode HTTP de la demande.

querystring (lecture/écriture)

Chaîne de requête, le cas échéant, dans la demande. Si la demande n'inclut pas de chaîne de requête, l'objet d'événement inclut quand-même querystring avec une valeur vide. Pour plus d’informations sur les chaînes de requête, consultez Contenu du cache basé sur les paramètres de chaîne de requête.

uri (lecture/écriture)

Chemin d'accès relatif de l'objet demandé. Si votre fonction Lambda modifie la valeur uri, notez ce qui suit :

  • La nouvelle valeur uri doit commencer par une barre oblique (/).

  • Lorsqu'une fonction modifie la valeur uri, cela change l'objet que l'utilisateur demande.

  • Lorsqu'une fonction modifie la valeur uri, cela ne modifie pas le comportement de cache pour la demande ou l'origine vers laquelle la demande est envoyée.

body (lecture/écriture)

Corps de la requête HTTP. La structure body peut contenir les champs suivants :

inputTruncated (lecture seule)

Indicateur booléen qui indique si le corps a été tronqué par Lambda@Edge. Pour de plus amples informations, veuillez consulter Restrictions relatives au corps de la requête avec l'option Inclure le corps.

action (lecture/écriture)

L'action que vous avez l'intention de prendre avec le corps. Les options pour l'actionsont les suivantes :

  • read-only: Il s'agit de l'option par défaut. Au moment de renvoyer la réponse à partir de la fonction Lambda, si action est en lecture seule, Lambda@Edge ignore les modifications apportée à encoding ou à data.

  • replace: À préciser lorsque vous souhaitez remplacer le corps envoyé à l'origine.

encoding (lecture/écriture)

L'encodage pour le corps. Lorsque Lambda@Edge expose le corps à la fonction Lambda, il le convertit d'abord en base64-encoding. Si vous choisissez replace de action remplacer le corps, vous pouvez choisir d'utiliser base64 (par défaut) ou d'textencoder. Si vous spécifiez encoding en tant que base64, mais que le corps n'est pas valide, base64, CloudFront renvoie une erreur.

data (lecture/écriture)

Le contenu du corps de requête.

origin (lecture/écriture) (événements d'origine uniquement)

Origine vers laquelle envoyer la demande. La origin structure doit contenir exactement une origine, qui peut être une origine personnalisée ou une origine Amazon S3.

En fonction du type d'origine que vous spécifiez (origine personnalisée ou origine Amazon S3), vous devez spécifier les champs suivants dans votre demande :

customHeaders (lecture/écriture) (origines personnalisées et Amazon S3)

(Facultatif) Vous pouvez inclure des en-têtes personnalisés dans la demande en spécifiant un nom d'en-tête et une paire de valeurs pour chaque en-tête personnalisé. Vous ne pouvez pas ajouter des en-têtes non autorisés et un en-tête portant le même nom ne peut pas être présent dans Records.cf.request.headers. Les notes sur les en-têtes de demande s'appliquent également aux en-têtes personnalisés. Pour plus d’informations, consultez En-têtes personnalisés qui ne CloudFront peuvent pas être ajoutés aux demandes d'origine et Restrictions sur les fonctions périphériques.

domainName (lecture/écriture) (origines personnalisées et Amazon S3)

Nom de domaine de l'origine. Le nom de domaine ne peut pas être vide.

  • Pour les origines personnalisées – Spécifiez un nom de domaine DNS, tel que www.example.com. Le nom de domaine ne peut pas inclure un signe deux-points (:) et ne peut pas être une adresse IP. Le nom du domaine peut contenir jusqu'à 253 caractères.

  • Pour les origines Amazon S3 – Spécifiez le nom de domaine DNS du compartiment Amazon S3, tel que amzn-s3-demo-bucket.s3.eu-west-1.amazonaws.com. Il peut comporter jusqu'à 128 caractères, qui doivent tous être en minuscules.

path (lecture/écriture) (origines personnalisées et Amazon S3)

Chemin de répertoire à l'origine où la demande doit localiser le contenu. Ce chemin doit commencer par une barre oblique (/) mais ne doit pas se terminer par une barre oblique (par exemple, il ne doit pas se terminer par example-path/). Pour les origines personnalisées uniquement, le chemin doit être codé par URL et avoir une longueur maximale de 255 caractères.

keepaliveTimeout (lecture/écriture) (origines personnalisées uniquement)

Combien de temps, en secondes, cela CloudFront devrait essayer de maintenir la connexion à l'origine après avoir reçu le dernier paquet de réponse. La valeur doit être un nombre compris entre 1 et 60, bornes incluses.

port (lecture/écriture) (origines personnalisées uniquement)

Le port auquel vous CloudFront devez vous connecter à votre point d'origine personnalisé. Il doit s'agir du port 80, du port 443 ou d'un port compris entre 1 024 et 65 535.

protocol (lecture/écriture) (origines personnalisées uniquement)

Protocole de connexion à utiliser CloudFront lors de la connexion à votre point d'origine. La valeur peut être http ou https.

readTimeout (lecture/écriture) (origines personnalisées uniquement)

Combien de temps, en secondes, CloudFront doit attendre une réponse après avoir envoyé une demande à votre origine. Cela indique également le temps CloudFront d'attente après réception d'un paquet de réponse avant de recevoir le paquet suivant. La valeur doit être un nombre compris entre 4 et 60, bornes incluses.

Si votre cas d'utilisation prend plus de 60 secondes, vous pouvez demander un quota plus élevé pourResponse timeout per origin. Pour de plus amples informations, veuillez consulter Quotas généraux sur les distributions.

sslProtocols (lecture/écriture) (origines personnalisées uniquement)

Protocole SSL/TLS minimal CloudFront pouvant être utilisé lors de l'établissement d'une connexion HTTPS avec votre point d'origine. Il peut s'agir des valeurs suivantes : TLSv1.2, TLSv1.1, TLSv1 ou SSLv3.

authMethod (lecture/écriture) (origines Amazon S3 uniquement)

Si vous utilisez une identité d'accès à l'origine (OAI), définissez ce champ sur origin-access-identity. Si vous n'utilisez pas d'OAI, configurez-le sur none. Si vous définissez authMethod sur origin-access-identity, il existe plusieurs exigences :

  • Vous devez spécifier le paramètre region (voir le champ suivant).

  • Vous devez utiliser la même identité d'accès à l'origine lorsque vous changez l'origine Amazon S3 de la demande.

  • Vous ne pouvez pas utiliser d'identité d'accès à l'origine lorsque vous remplacez l'origine personnalisée de la demande par une origine Amazon S3.

Note

Ce champ ne prend pas en charge le contrôle d'accès à l'origine (OAC).

region (lecture/écriture) (origines Amazon S3 uniquement)

La AWS région de votre compartiment Amazon S3. Cette option n'est requise que lorsque vous définissez authMethod sur origin-access-identity.

Événements de réponse

Les rubriques suivantes présentent la structure de l'objet qui est CloudFront transmis à une fonction Lambda pour les événements de réponse du visualiseur et de l'origine. Après les exemples, vous trouverez la liste de tous les champs possibles dans les événements de réponse d'utilisateur et d'origine.

Exemple de réponse de l'origine

L'exemple suivant montre un objet d'événement de réponse de l'origine.

{ "Records": [ { "cf": { "config": { "distributionDomainName": "d111111abcdef8.cloudfront.net", "distributionId": "EDFDVBD6EXAMPLE", "eventType": "origin-response", "requestId": "4TyzHTaYWb1GX1qTfsHhEqV6HUDd_BzoBZnwfnvQc_1oF26ClkoUSEQ==" }, "request": { "clientIp": "203.0.113.178", "headers": { "x-forwarded-for": [ { "key": "X-Forwarded-For", "value": "203.0.113.178" } ], "user-agent": [ { "key": "User-Agent", "value": "Amazon CloudFront" } ], "via": [ { "key": "Via", "value": "2.0 8f22423015641505b8c857a37450d6c0.cloudfront.net (CloudFront)" } ], "host": [ { "key": "Host", "value": "example.org" } ], "cache-control": [ { "key": "Cache-Control", "value": "no-cache" } ] }, "method": "GET", "origin": { "custom": { "customHeaders": {}, "domainName": "example.org", "keepaliveTimeout": 5, "path": "", "port": 443, "protocol": "https", "readTimeout": 30, "sslProtocols": [ "TLSv1", "TLSv1.1", "TLSv1.2" ] } }, "querystring": "", "uri": "/" }, "response": { "headers": { "access-control-allow-credentials": [ { "key": "Access-Control-Allow-Credentials", "value": "true" } ], "access-control-allow-origin": [ { "key": "Access-Control-Allow-Origin", "value": "*" } ], "date": [ { "key": "Date", "value": "Mon, 13 Jan 2020 20:12:38 GMT" } ], "referrer-policy": [ { "key": "Referrer-Policy", "value": "no-referrer-when-downgrade" } ], "server": [ { "key": "Server", "value": "ExampleCustomOriginServer" } ], "x-content-type-options": [ { "key": "X-Content-Type-Options", "value": "nosniff" } ], "x-frame-options": [ { "key": "X-Frame-Options", "value": "DENY" } ], "x-xss-protection": [ { "key": "X-XSS-Protection", "value": "1; mode=block" } ], "content-type": [ { "key": "Content-Type", "value": "text/html; charset=utf-8" } ], "content-length": [ { "key": "Content-Length", "value": "9593" } ] }, "status": "200", "statusDescription": "OK" } } } ] }

Exemple de réponse de l'utilisateur

L'exemple suivant montre un objet d'événement de réponse de l'utilisateur.

{ "Records": [ { "cf": { "config": { "distributionDomainName": "d111111abcdef8.cloudfront.net", "distributionId": "EDFDVBD6EXAMPLE", "eventType": "viewer-response", "requestId": "4TyzHTaYWb1GX1qTfsHhEqV6HUDd_BzoBZnwfnvQc_1oF26ClkoUSEQ==" }, "request": { "clientIp": "203.0.113.178", "headers": { "host": [ { "key": "Host", "value": "d111111abcdef8.cloudfront.net" } ], "user-agent": [ { "key": "User-Agent", "value": "curl/7.66.0" } ], "accept": [ { "key": "accept", "value": "*/*" } ] }, "method": "GET", "querystring": "", "uri": "/" }, "response": { "headers": { "access-control-allow-credentials": [ { "key": "Access-Control-Allow-Credentials", "value": "true" } ], "access-control-allow-origin": [ { "key": "Access-Control-Allow-Origin", "value": "*" } ], "date": [ { "key": "Date", "value": "Mon, 13 Jan 2020 20:14:56 GMT" } ], "referrer-policy": [ { "key": "Referrer-Policy", "value": "no-referrer-when-downgrade" } ], "server": [ { "key": "Server", "value": "ExampleCustomOriginServer" } ], "x-content-type-options": [ { "key": "X-Content-Type-Options", "value": "nosniff" } ], "x-frame-options": [ { "key": "X-Frame-Options", "value": "DENY" } ], "x-xss-protection": [ { "key": "X-XSS-Protection", "value": "1; mode=block" } ], "age": [ { "key": "Age", "value": "2402" } ], "content-type": [ { "key": "Content-Type", "value": "text/html; charset=utf-8" } ], "content-length": [ { "key": "Content-Length", "value": "9593" } ] }, "status": "200", "statusDescription": "OK" } } } ] }

Champs d'événement de réponse

Les données d'objet d'événement de réponse sont contenues dans trois sous-objets : config (Records.cf.config), request (Records.cf.request) et response (Records.cf.response). Pour de plus amples informations sur les champs de l'objet de demande, veuillez consulter Champs de l'objet de demande. Les listes suivantes décrivent les champs figurant dans les sous-objets config et response.

Champs de l’objet config

La liste suivante décrit les champs figurant dans l’objet config (Records.cf.config).

distributionDomainName (lecture seule)

Nom de domaine de la distribution qui est associée à la réponse.

distributionID (lecture seule)

ID de la distribution qui est associée à la réponse.

eventType (lecture seule)

Type de déclencheur associé à la réponse : origin-response ou viewer-response.

requestId (lecture seule)

Chaîne cryptée qui identifie de manière unique la viewer-to-CloudFront demande à laquelle cette réponse est associée. La requestId valeur apparaît également dans les journaux CloudFront d'accès sous la formex-edge-request-id. Pour plus d’informations, consultez Journalisation standard (journaux d'accès) et Champs du fichier journal.

Champs de l'objet de réponse

La liste suivante décrit les champs figurant dans l’objet response (Records.cf.response). Pour obtenir des informations sur l'utilisation d'une fonction Lambda@Edge pour générer une réponse HTTP, veuillez consulter Générer des réponses HTTP dans les déclencheurs de requêtes.

headers (lecture/écriture)

En-têtes de la réponse. Remarques :

  • Les clés figurant dans l’objet headers sont 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 objet d’en-tête (par exemple, headers["content-type"] ou headers["content-length"]) 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.

  • keycontient le nom de l'en-tête distinguant majuscules et minuscules tel qu'il apparaît dans la réponse HTTP ; par exemple Content-Type Content-LengthCookie,,, etc.

  • value contient la valeur d'en-tête telle qu'elle apparaît dans la réponse HTTP.

  • Lorsque votre fonction Lambda ajoute ou modifie des en-têtes de réponse et que vous n'incluez pas le champ key d'en-tête, Lambda@Edge insère automatiquement une clé (key) d'en-tête en utilisant le 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 automatiquement est formatée avec une majuscule initiale pour chaque partie, séparée par des tirets (-).

    Par exemple, vous pouvez ajouter un en-tête comme le suivant, sans clé (key) d’en-tête :

    "content-type": [ { "value": "text/html;charset=UTF-8" } ]

    Dans cet exemple, Lambda@Edge insère automatiquement "key": "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

Code de statut HTTP de la réponse.

statusDescription

Description de l'état HTTP de la réponse.