Struttura dell'evento Lambda@Edge
Negli argomenti seguenti vengono descritti gli oggetti evento richiesta e risposta che CloudFront passa a una funzione Lambda@Edge al momento dell'attivazione.
Selezione origine dinamica
Puoi utilizzare il modello di percorso in un comportamento cache per instradare richieste a un'origine, in base al percorso e al nome dell'oggetto richiesto, ad esempio images/*.jpg. Utilizzando Lambda@Edge, puoi anche instradare richieste a un'origine in base ad altre caratteristiche, ad esempio i valori nelle intestazioni di richiesta.
La selezione dinamica dell'origine può risultare utile in vari modi. Ad esempio, puoi distribuire richieste in più origini di aree geografiche differenti per facilitare il bilanciamento del carico globale. Oppure puoi instradare richieste in modo selettivo a diverse origini, ognuna delle quali svolge una funzione particolare: gestione di bot, ottimizzazione di SEO, autenticazione e così via. Per codici di esempio che illustrano come utilizzare questa funzionalità, consulta Esempi di selezione dinamica dell'origine in funzione del contenuto.
Nell'evento di richiesta origine di CloudFront, l'oggetto origin nella struttura dell'evento contiene informazioni sull'origine a cui la richiesta sarebbe instradata, in base al modello di percorso. Puoi aggiornare i valori nell'oggetto origin dell'origine per instradare una richiesta un'altra origine. Quando si aggiorna l'oggetto origin, non è necessario definire l'origine nella distribuzione. È inoltre possibile sostituire un oggetto di origine Amazon S3 con un oggetto di origine personalizzato e viceversa. Tuttavia, è possibile specificare solo una singola origine per richiesta; un'origine personalizzata o un'origine Amazon S3, ma non entrambe.
Richiedi Eventi
Negli argomenti seguenti viene illustrata la struttura dell'oggetto che CloudFront passa a una funzione Lambda per gli eventi di richiesta di visualizzazione e origine. Questi esempi mostrano una richiesta GET senza corpo. Dopo gli esempi è riportato un elenco di tutti i possibili campi negli eventi di richiesta di visualizzazione e origine.
Richiesta visualizzatore di esempio
L'esempio seguente mostra un oggetto evento richiesta visualizzatore.
{ "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": "/" } } } ] }
Esempio di richiesta di origine
L'esempio seguente mostra un oggetto evento richiesta 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, "responseCompletionTimeout": 30, "sslProtocols": [ "TLSv1", "TLSv1.1", "TLSv1.2" ] } }, "querystring": "", "uri": "/" } } } ] }
Richiedi campi evento
I dati dell'oggetto evento di richiesta sono contenuti in due sottooggetti: config (Records.cf.config) e request (Records.cf.request). I seguenti elenchi descrivono i campi di ciascun oggetto secondario.
Campi nell'oggetto config
Nella seguente lista sono descritti i campi nell’oggetto config (Records.cf.config).
distributionDomainName(solo lettura)-
Il nome di dominio della distribuzione associata alla richiesta.
distributionID(solo lettura)-
L'ID della distribuzione associata alla richiesta.
eventType(solo lettura)-
Il tipo di trigger associato alla richiesta:
viewer-requestoorigin-request. requestId(solo lettura)-
Una stringa crittografata che identifica in modo univoco una richiesta visualizzatore a CloudFront. Il valore
requestIdviene visualizzato anche nei registri di accesso CloudFront comex-edge-request-id. Per ulteriori informazioni, consulta Registrazione di log standard (log di accesso) e Campi di file di log.
Campi nell'oggetto richiesta
Nella seguente lista sono descritti i campi nell’oggetto request (Records.cf.request).
clientIp(solo lettura)-
L'indirizzo IP del visualizzatore che ha effettuato la richiesta. Se il visualizzatore ha utilizzato un proxy HTTP o un sistema di bilanciamento del carico per inviare la richiesta, il valore è l'indirizzo IP del proxy o del sistema di bilanciamento del carico.
- intestazioni (lettura/scrittura)
-
Le intestazioni nella richiesta. Tieni presente quanto segue:
-
Le chiavi nell'oggetto
headerssono versioni in minuscolo di nomi di intestazione HTTP standard. L'utilizzo di chiavi in minuscolo fornisce accesso ai valori delle intestazioni senza distinzione tra maiuscole e minuscole. -
Ogni intestazione (ad esempio,
headers["accept"]oheaders["host"]) è una matrice di coppie chiave-valore. Per una determinata intestazione, la matrice contiene una coppia chiave-valore per ogni valore nella risposta generata. -
keycontiene il nome con distinzione tra maiuscole e minuscole dell’intestazione come appare nella richiesta HTTP; ad esempioHost,User-Agent,X-Forwarded-For,Cookiee così via. -
valuecontiene il valore dell'intestazione come è apparso nella richiesta HTTP. -
Quando la funzione Lambda aggiunge o modifica le intestazioni di richiesta e non si include il campo di intestazione
key, Lambda @Edge inserisce automaticamente un'intestazionekeyutilizzando il nome dell'intestazione fornito. Indipendentemente dalla formattazione del nome dell'intestazione, la chiave dell'intestazione automaticamente inserita sarà formattata con iniziale maiuscola per tutte le parti, separate da trattini (-).Ad esempio, è possibile aggiungere un'intestazione come quella seguente, senza una chiave dell'intestazione
key:"user-agent": [ { "value": "ExampleCustomUserAgent/1.X.0" } ]In questo esempio, Lambda @Edge inserisce automaticamente
"key": "User-Agent".
Per informazioni sulle restrizioni di utilizzo delle intestazioni, consulta Restrizioni sulle funzioni edge.
-
method(solo lettura)-
Metodo HTTP nella richiesta.
querystring(lettura/scrittura)-
La stringa di query, se presente, nella richiesta. Se la richiesta non include una stringa di query, l’oggetto evento include comunque
querystringcon un valore vuoto. Per ulteriori informazioni sulle stringhe di query, vedi Memorizzazione nella cache di contenuti basati su parametri delle stringhe di query. uri(lettura/scrittura)-
Il percorso relativo dell'oggetto richiesto. Se la funzione Lambda modifica il valore
uri, annotare quanto segue:-
Il nuovo valore
urideve iniziare con una barra (/). -
Se una funzione modifica il valore
uri, l'oggetto richiesto dal visualizzatore viene modificato. -
Se una funzione modifica il valore
uri, il comportamento della cache per la richiesta o l'origine a cui la richiesta viene inoltrata non viene modificato.
-
body(lettura/scrittura)-
Il corpo della richiesta HTTP. La struttura
bodypuò contenere i seguenti campi:inputTruncated(solo lettura)-
Un flag booleano che indica se l'organismo è stato troncato da Lambda@Edge. Per ulteriori informazioni, consulta Restrizioni sul corpo della richiesta con l'opzione Includi corpo.
action(lettura/scrittura)-
L'operazione che si desidera richiedere con il corpo. Le opzioni per
actionsono le seguenti:-
read-only:Questa è l'impostazione predefinita. Quando viene restituita la risposta dalla funzione Lambda, seactionè di sola lettura, Lambda@Edge ignora tutte le modifiche aencodingodata. -
replace:specificare questo quando si desidera sostituire il corpo inviato all'origine.
-
encoding(lettura/scrittura)-
La codifica per il corpo. Quando Lambda@Edge espone il corpo alla funzione Lambda, converte per prima cosa il corpo nella codifica base64-encoding. Se scegli
replaceperactionper sostituire il corpo, è possibile decidere se utilizzare la codificabase64(questa è l'impostazione predefinita) otext. Se specifichiencodingcomebase64, ma il corpo non è valido base64, CloudFront restituisce un errore. data(lettura/scrittura)-
I contenuti del corpo della richiesta.
origin( lettura/scrittura) (solo eventi di origine)-
L'origine a cui inviare la richiesta. La struttura
origindeve contenere esattamente un’origine, che può essere un’origine personalizzata o un’origine Amazon S3.A seconda del tipo di origine specificato (origini personalizzate o Amazon S3), è necessario specificare i seguenti campi nella richiesta:
customHeaders( lettura/scrittura) (origini personalizzate e Amazon S3)-
(Facoltativo) Puoi includere intestazioni personalizzate con la richiesta specificando un nome di intestazione e una coppia di valori per ogni intestazione personalizzata. Non è possibile aggiungere intestazioni che non sono consentite e in
Records.cf.request.headersun'intestazione con lo stesso nome non può essere presente. Le note sulle intestazioni di richiesta si applicano anche alle intestazioni personalizzate. Per ulteriori informazioni, consulta Intestazioni personalizzate che CloudFront non può aggiungere alle richieste di origine e Restrizioni sulle funzioni edge. domainName( lettura/scrittura) (origini personalizzate e Amazon S3)-
Il nome di dominio dell'origine. Il nome di dominio non può essere vuoto.
-
Per origini personalizzate - specificare un nome di dominio DNS, ad esempio
www.example.com. Il nome di dominio non può includere due punti (:) e non può essere un indirizzo IP. Il nome di dominio può contenere fino a 253 caratteri. -
Per origini Amazon S3: specificare il nome di dominio DNS del bucket Amazon S3, ad esempio
amzn-s3-demo-bucket.s3.eu-west-1.amazonaws.com. Il nome può contenere fino a 128 caratteri e deve essere tutto in minuscolo.
-
path( lettura/scrittura) (origini personalizzate e Amazon S3)-
Il percorso di directory sul server di origine in cui la richiesta deve trovare il contenuto. Il percorso può iniziare con una barra (/) ma non può terminare con una barra (ad esempio, non può terminare con
example-path/). Solo per le origini personalizzate, il percorso deve essere codificato con URL e avere una lunghezza massima di 255 caratteri. keepaliveTimeout(lettura/scrittura) (solo origini personalizzate)-
Il periodo di tempo, in secondi, durante il quale CloudFront deve cercare di mantenere la connessione all'origine dopo la ricezione dell'ultimo pacchetto di una risposta. Il valore deve essere un numero compreso tra 1 e 120, inclusi.
port(lettura/scrittura) (solo origini personalizzate)-
La porta a cui CloudFront dovrebbe connettersi all'origine personalizzata. La porta deve essere 80, 443 oppure un numero nell'intervallo 1024-65535, inclusi.
protocol(lettura/scrittura) (solo origini personalizzate)-
Il protocollo di connessione che CloudFront deve utilizzare quando ci si connette all'origine. Il valore può essere
httpohttps. readTimeout( lettura/scrittura) (origini personalizzate e Amazon S3)-
Quanto tempo, in secondi, CloudFront dovrebbe attendere una risposta dopo aver inviato una richiesta alla tua origine. Questo specifica anche quanto tempo CloudFront deve attendere dopo aver ricevuto un pacchetto di una risposta prima di ricevere il pacchetto successivo. Il valore deve essere un numero compreso tra 1 e 120, inclusi.
Se hai bisogno di una quota maggiore, consulta Timeout di risposta per origine.
responseCompletionTimeout( lettura/scrittura) (origini personalizzate e Amazon S3)-
Il tempo (in secondi) durante il quale una richiesta da CloudFront all’origine può rimanere aperta in attesa di una risposta. Se entro questo tempo non viene ricevuta una risposta completa dall’origine, CloudFront interrompe la connessione.
Il valore per
responseCompletionTimeoutdeve essere maggiore o uguale al valore perreadTimeout. Se imposti questo valore su 0, rimuove qualsiasi valore precedente impostato e torna al valore predefinito. Puoi anche ottenere lo stesso risultato eliminando il camporesponseCompletionTimeoutdalla richiesta evento. sslProtocols(lettura/scrittura) (solo origini personalizzate)-
Il protocollo SSL/TLS minimo che CloudFront può utilizzare quando si stabilisce una connessione HTTPS con l'origine. I valori possono essere uno dei seguenti:
TLSv1.2,TLSv1.1,TLSv1oSSLv3. authMethod( lettura/scrittura) (solo origini Amazon S3)-
Se stai usando un’identità di accesso origine (OAI), imposta questo campo su
origin-access-identity. Se non stai usando una OAI, impostalo sunone. Se si impostaauthMethodsuorigin-access-identity, ci sono diversi requisiti:-
È necessario specificare
region(vedere il seguente campo). -
È necessario utilizzare lo stesso OAI quando si modifica la richiesta da un'origine Amazon S3 a un'altra.
-
Non è possibile utilizzare una OAI quando si modifica la richiesta da un'origine personalizzata a un'origine Amazon S3.
Nota
Questo campo non supporta il controllo dell'accesso all'origine (OAC).
-
region( lettura/scrittura) (solo origini Amazon S3)-
La regione AWS del tuo bucket Amazon S3. Questo è necessario solo quando si imposta
authMethodsuorigin-access-identity.
Eventi di risposta
Negli argomenti seguenti viene illustrata la struttura dell'oggetto che CloudFront passa a una funzione Lambda per gli eventi di risposta del visualizzatore e dell'origine. Dopo gli esempi c'è un elenco di tutti i campi possibili in eventi di risposta del visualizzatore e origine.
Argomenti
Esempio di risposta all'origine
L'esempio seguente mostra un oggetto evento risposta 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, "responseCompletionTimeout": 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" } } } ] }
Risposta del visualizzatore di esempio
Nell'esempio seguente viene illustrato un oggetto evento risposta visualizzatore.
{ "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" } } } ] }
Campi eventi di risposta
I dati dell'oggetto evento risposta sono contenuti in tre sottooggetti: config 8Records.cf.config), request (Records.cf.request) e response (Records.cf.response). Per ulteriori informazioni sui campi dell'oggetto richiesta, vedere Campi nell'oggetto richiesta. Gli elenchi seguenti descrivono i campi nei sottooggetti config e response.
Campi nell'oggetto config
Nella seguente lista sono descritti i campi nell’oggetto config (Records.cf.config).
distributionDomainName(solo lettura)-
Il nome di dominio della distribuzione associata alla risposta.
distributionID(solo lettura)-
L'ID della distribuzione associata alla risposta.
eventType(solo lettura)-
Il tipo di trigger associato alla risposta:
origin-responseoviewer-response. requestId(solo lettura)-
Una stringa crittografata che identifichi in modo univoco la richiesta visualizzatore-a-CloudFront a cui questa risposta è associata. Il valore
requestIdviene visualizzato anche nei registri di accesso CloudFront comex-edge-request-id. Per ulteriori informazioni, consulta Registrazione di log standard (log di accesso) e Campi di file di log.
Campi nell'oggetto risposta
Nella seguente lista sono descritti i campi nell’oggetto response (Records.cf.response). Per informazioni sull'utilizzo di una funzione Lambda @Edge per generare una risposta HTTP, vedere Generazione di risposte HTTP in trigger di richiesta.
headers(lettura/scrittura)-
Le intestazioni nella risposta. Tieni presente quanto segue:
-
Le chiavi nell'oggetto
headerssono versioni in minuscolo di nomi di intestazione HTTP standard. L'utilizzo di chiavi in minuscolo fornisce accesso ai valori delle intestazioni senza distinzione tra maiuscole e minuscole. -
Ogni intestazione (ad esempio,
headers["content-type"]oheaders["content-length"]) è una matrice di coppie chiave-valore. Per una determinata intestazione, la matrice contiene una coppia chiave-valore per ogni valore nella risposta generata. -
keycontiene il nome con distinzione tra maiuscole e minuscole dell’intestazione come appare nella risposta HTTP; ad esempioContent-Type,Content-Length,Cookiee così via. -
valuecontiene il valore dell'intestazione come appare nella risposta HTTP. -
Quando la funzione Lambda aggiunge o modifica le intestazioni di risposta e non si include il campo di intestazione
key, Lambda @Edge inserisce automaticamente un'intestazionekeyutilizzando il nome dell'intestazione fornito. Indipendentemente dalla formattazione del nome dell'intestazione, la chiave dell'intestazione automaticamente inserita sarà formattata con iniziale maiuscola per tutte le parti, separate da trattini (-).Ad esempio, è possibile aggiungere un'intestazione come quella seguente, senza una chiave dell'intestazione
key:"content-type": [ { "value": "text/html;charset=UTF-8" } ]In questo esempio, Lambda @Edge inserisce automaticamente
"key": "Content-Type".
Per informazioni sulle restrizioni di utilizzo delle intestazioni, consulta Restrizioni sulle funzioni edge.
-
status-
Il codice di stato HTTP per la risposta.
statusDescription-
Descrizione dello stato HTTP della risposta.