Estructura de eventos de Lambda@Edge
En los temas siguientes se describen los objetos de evento de solicitud y respuesta que CloudFront pasa a una función de Lambda@Edge cuando se activa.
Selección dinámica del origen
Puede utilizar el patrón de ruta de un comportamiento de la caché para enviar las solicitudes a un origen, en función de la ruta y el nombre del objeto solicitado, como images/*.jpg
. Lambda@Edge también le permite direccionar las solicitudes a un origen en función de otras características, como los valores de los encabezados de solicitudes.
Esta selección dinámica del origen puede resultar útil en varios casos. Por ejemplo, puede distribuir solicitudes entre orígenes de diferentes zonas geográficas para facilitar el balanceo de carga global. También puede direccionar solicitudes selectivamente a varios orígenes, cada uno de ellos con un propósito distinto: control de bots, optimización SEO, autenticación, etc. Para obtener ejemplos de código que muestran cómo utilizar esta característica, consulte Selección de origen dinámico basada en contenido: ejemplos.
En el evento de solicitud de origen de CloudFront, el objeto origin
de la estructura de eventos contiene información sobre el origen al que se enviaría la solicitud, en función del patrón de ruta. Puede actualizar los valores del objeto origin
para enviar una solicitud a otro origen. Al actualizar el objeto de origin
, no es necesario definir el origen en la distribución. También puede reemplazar un objeto de origen de Amazon S3 por un objeto de origen personalizado y viceversa. Sin embargo, solo se puede especificar un único origen por solicitud, ya sea un origen personalizado o un origen de Amazon S3, pero no ambos.
Eventos de solicitud
En los temas siguientes se muestra la estructura del objeto que CloudFront pasa a una función de Lambda para los eventos de solicitud de lector y de origen. Estos ejemplos muestran una solicitud GET
sin cuerpo. Después de los ejemplos, se muestra una lista de todos los campos posibles en eventos de solicitud de lector y de origen.
Ejemplo de solicitud de lector
En el ejemplo siguiente se muestra un objeto de evento de solicitud de lector.
{ "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": "/" } } } ] }
Ejemplo de solicitud de origen
En el ejemplo siguiente se muestra un objeto de evento de solicitud de origen.
{ "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": "/" } } } ] }
Campos de eventos de solicitud
Los datos del objeto de evento de solicitud se incluyen en dos subobjetos: config
(Records.cf.config
) y request
(Records.cf.request
). En las listas siguientes se describen los campos de cada subobjeto.
Campos del objeto config
En la siguiente lista se describen los campos del objeto config
(Records.cf.config
).
distributionDomainName
(solo lectura)-
El nombre de dominio de la distribución asociada a la solicitud.
distributionID
(solo lectura)-
El ID de la distribución asociada a la solicitud.
eventType
(solo lectura)-
El tipo de desencadenador asociado a la solicitud:
viewer-request
uorigin-request
. requestId
(solo lectura)-
Una cadena cifrada que identifica de forma inequívoca una solicitud de lector a CloudFront. El valor
requestId
también aparece en los registros de acceso de CloudFront comox-edge-request-id
. Para obtener más información, consulte Configuración y uso de registros estándar (registros de acceso) y Campos de archivo de registro estándar.
Campos del objeto de solicitud
En la siguiente lista se describen los campos del objeto request
(Records.cf.request
).
clientIp
(solo lectura)-
La dirección IP del espectador que ha realizado la solicitud. Si el espectador utiliza un proxy HTTP o un equilibrador de carga para enviar la solicitud, el valor es la dirección IP del proxy o del equilibrador de carga.
- headers (lectura y escritura)
-
Los encabezados de la solicitud. Tenga en cuenta lo siguiente:
-
Las claves del objeto
headers
son nombres de encabezado HTTP estándar en minúsculas. El uso de claves en minúsculas le proporciona acceso a los valores del encabezado sin diferenciar mayúsculas de minúsculas. -
Cada objeto header (por ejemplo,
headers["accept"]
oheaders["host"]
) es una matriz de pares de clave-valor. Para un encabezado determinado, la matriz contiene un par de clave-valor para cada valor de la solicitud. -
key
contiene el nombre con distinción de mayúsculas y minúsculas del encabezado tal como aparecía en la solicitud HTTP; por ejemploHost
,User-Agent
,X-Forwarded-For
, etc. -
value
contiene el valor del encabezado tal como aparecía en la solicitud HTTP. -
Cuando la función Lambda agrega o modifica encabezados de solicitud y no incluye el campo
key
del encabezado, Lambda@Edge inserta automáticamente un encabezadokey
usando el nombre de encabezado que proporcione. Independientemente de cómo haya formateado el nombre del encabezado, la clave de encabezado que se inserta automáticamente se formatea con mayúscula inicial para cada parte, separada por guiones (-).Por ejemplo, puede agregar un encabezado como el siguiente, sin la clave de encabezado
key
:"user-agent": [ { "value": "ExampleCustomUserAgent/1.X.0" } ]
En este ejemplo, Lambda @Edge inserta automáticamente
"key": "User-Agent"
.
Para obtener más información acerca de restricciones de uso de encabezados, consulte Restricciones en funciones de borde.
-
method
(solo lectura)-
El método HTTP de la solicitud.
querystring
(lectura y escritura)-
La cadena de consulta, si hay alguna, de la solicitud. Si la solicitud no incluye una cadena de consulta, el objeto del evento incluye igualmente
querystring
con un valor vacío. Para obtener más información acerca de cadenas de consulta, consulte Almacenamiento en caché de contenido en función de parámetros de cadenas de consulta. uri
(lectura y escritura)-
La ruta relativa del objeto solicitado. Si su función de Lambda modifica el valor
uri
, tenga en cuenta lo siguiente:-
El nuevo valor
uri
debe comenzar con una barra diagonal (/). -
Si una función cambia el valor de
uri
, se cambia el objeto que el lector solicita. -
Si una función cambia el valor de
uri
, no cambia el comportamiento de la caché de la solicitud ni del origen al que se envía la solicitud.
-
body
(lectura y escritura)-
El cuerpo de la solicitud HTTP. La estructura
body
puede contener los siguientes campos:inputTruncated
(solo lectura)-
Un indicador booleano que indica si Lambda@Edge truncó el cuerpo. Para obtener más información, consulte Restricciones para el cuerpo de la solicitud con la opción Incluir cuerpo.
action
(lectura y escritura)-
La acción que va a realizar con el cuerpo. Las opciones de
action
son las siguientes:-
read-only:
Esta es la opción predeterminada. Cuando se devuelve la respuesta de la función de Lambda, siaction
es solo lectura, Lambda@Edge omite los cambios realizados enencoding
odata
. -
replace:
Especifique este valor cuando desee reemplazar el cuerpo enviado al origen.
-
encoding
(lectura y escritura)-
La codificación del cuerpo. Cuando Lambda@Edge expone el cuerpo a la función de Lambda, primero lo convierte a base64-encoding. Si elige
replace
enaction
para reemplazar el cuerpo, puede elegir usar la codificaciónbase64
otext
(el valor predeterminado). Si especificaencoding
comobase64
pero el cuerpo no tiene una codificación base64 válida, CloudFront devuelve un error. data
(lectura y escritura)-
El contenido del cuerpo de la solicitud.
origin
(lectura y escritura) (solo eventos de origen)-
El origen al que se envía la solicitud. La estructura
origin
debe contener exactamente un origen, que puede ser un origen personalizado o un origen de Amazon S3. La estructura de origen puede contener los siguientes campos:customHeaders
(lectura/escritura) (orígenes personalizados y de Amazon S3)-
Si desea incluir encabezados personalizados con la solicitud, especifique un nombre de encabezado y un par de valores para cada uno de ellos. No puede agregar encabezados que no estén permitidos y un encabezado con el mismo nombre no puede estar presente en
Records.cf.request.headers
. Las notas sobre encabezados de solicitud también se aplican a los encabezados personalizados. Para obtener más información, consulte Encabezados personalizados que CloudFront no puede agregar a solicitudes de origen y Restricciones en funciones de borde. domainName
(lectura/escritura) (orígenes personalizados y de Amazon S3)-
El nombre de dominio del origen. El nombre de dominio no puede estar vacío.
-
Para orígenes personalizados: especifique un nombre de dominio DNS, como
www.example.com
. El nombre de dominio no puede incluir dos puntos (:) y no puede ser una dirección IP. El nombre de dominio puede tener una longitud de hasta 253 caracteres. -
Para orígenes de Amazon S3: especifique el nombre de dominio DNS del bucket de Amazon S3, como
amzn-s3-demo-bucket.s3.eu-west-1.amazonaws.com
. El nombre puede tener una longitud de hasta 128 caracteres y debe escribirse en letras minúsculas.
-
path
(lectura/escritura) (orígenes personalizados y de Amazon S3)-
La ruta de directorio del servidor donde la solicitud debería encontrar el contenido. La ruta debe comenzar con una barra diagonal (/), pero no debe terminar con una (por ejemplo, no debería terminar con
example-path/
). Solo para los orígenes personalizados: la ruta debe estar codificada como una URL y tener una longitud máxima de 255 caracteres. keepaliveTimeout
(lectura y escritura) (solo orígenes personalizados)-
El periodo de tiempo, en segundos, que CloudFront debería intentar mantener la conexión con el origen después de recibir el último paquete de la respuesta. El valor debe ser un número comprendido entre 1 y 60, ambos inclusive.
port
(lectura y escritura) (solo orígenes personalizados)-
El puerto al que CloudFront debe conectarse en el origen personalizado. Este valor debe ser 80, 443 o un número comprendido entre 1024 y 65535, ambos inclusive.
protocol
(lectura y escritura) (solo orígenes personalizados)-
El protocolo de conexión que CloudFront debe usar al conectarse a su origen. El valor puede ser
http
ohttps
. readTimeout
(lectura y escritura) (solo orígenes personalizados)-
El tiempo, en segundos, que CloudFront debe esperar una respuesta después de enviar una solicitud a su origen. También especifica cuánto tiempo debe esperar CloudFront después de recibir un paquete de una respuesta antes de recibir el siguiente paquete. El valor debe ser un número comprendido entre 4 y 60, ambos inclusive.
Si su caso de uso requiere más de 60 segundos, puede solicitar una cuota superior para
Response timeout per origin
. Para obtener más información, consulte Cuotas generales de distribuciones. sslProtocols
(lectura y escritura) (solo orígenes personalizados)-
El protocolo SSL/TLS mínimo que CloudFront puede utilizar al establecer una conexión HTTPS con su origen. Los valores pueden ser alguno de los siguientes:
TLSv1.2
,TLSv1.1
,TLSv1
oSSLv3
. authMethod
(lectura/escritura) (solo orígenes de Amazon S3)-
Si utiliza una identidad de acceso de origen (OAI), establezca este campo a
origin-access-identity
. Si no usa una OAI, establézcala anone
. Si estableceauthMethod
enorigin-access-identity
, se aplican varios requisitos:-
Debe especificar el elemento
region
(consulte el siguiente campo). -
Debe utilizar la misma OAI cuando cambie la solicitud de un origen de Amazon S3 a otro.
-
No se puede utilizar una OAI cuando se cambia la solicitud de un origen personalizado a un origen de Amazon S3.
nota
Este campo no admite el control de acceso de origen (OAC).
-
region
(lectura/escritura) (solo orígenes de Amazon S3)-
La región de AWS de su bucket de Amazon S3. Esto solo es necesario cuando se establece
authMethod
enorigin-access-identity
.
Eventos de respuesta
En los temas siguientes se muestra la estructura del objeto que CloudFront pasa a una función Lambda para los eventos de respuesta de lector y de origen. Después de los ejemplos, se muestra una lista de todos los campos posibles en eventos de respuesta de lector y de origen.
Respuesta de origen de ejemplo
En el ejemplo siguiente se muestra un objeto de evento de respuesta de origen.
{ "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" } } } ] }
Respuesta de lector de ejemplo
En el ejemplo siguiente se muestra un objeto de evento de respuesta de lector.
{ "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" } } } ] }
Campos del evento de respuesta
Los datos del objeto de evento de respuesta se incluyen en tres subobjetos: config
(Records.cf.config
), request
(Records.cf.request
) y response
(Records.cf.response
). Para obtener más información acerca de los campos del objeto de solicitud, consulte Campos del objeto de solicitud. En las listas siguientes se describen los campos de los subobjetos response
y config
.
Campos del objeto config
En la siguiente lista se describen los campos del objeto config
(Records.cf.config
).
distributionDomainName
(solo lectura)-
El nombre de dominio de la distribución asociada a la respuesta.
distributionID
(solo lectura)-
El ID de la distribución asociada a la respuesta.
eventType
(solo lectura)-
El tipo de desencadenador asociado a la respuesta:
origin-response
oviewer-response
. requestId
(solo lectura)-
Una cadena cifrada que identifica de forma inequívoca la solicitud del lector a CloudFront a la que está asociada esta respuesta. El valor
requestId
también aparece en los registros de acceso de CloudFront comox-edge-request-id
. Para obtener más información, consulte Configuración y uso de registros estándar (registros de acceso) y Campos de archivo de registro estándar.
Campos del objeto de respuesta
En la siguiente lista se describen los campos del objeto response
(Records.cf.response
). Para obtener información sobre el uso de una función de Lambda @Edge para generar una respuesta HTTP, consulte Generación de respuestas HTTP en los desencadenadores de solicitud.
headers
(lectura y escritura)-
Los encabezados de la respuesta. Tenga en cuenta lo siguiente:
-
Las claves del objeto
headers
son nombres de encabezado HTTP estándar en minúsculas. El uso de claves en minúsculas le proporciona acceso a los valores del encabezado sin diferenciar mayúsculas de minúsculas. -
Cada objeto header (por ejemplo,
headers["content-type"]
oheaders["content-length"]
) es una matriz de pares de clave-valor. Para un encabezado determinado, la matriz contiene un par de clave-valor para cada valor de la respuesta. -
key
contiene el nombre con distinción de mayúsculas y minúsculas del encabezado tal como aparece en la respuesta HTTP; por ejemploContent-Type
,Content-Length
,Cookie
, etc. -
value
contiene el valor del encabezado tal como aparece en la respuesta HTTP. -
Cuando la función Lambda agrega o modifica encabezados de respuesta y no incluye el campo
key
del encabezado, Lambda@Edge inserta automáticamente un encabezadokey
usando el nombre de encabezado que proporcione. Independientemente de cómo haya formateado el nombre del encabezado, la clave de encabezado que se inserta automáticamente se formatea con mayúscula inicial para cada parte, separada por guiones (-).Por ejemplo, puede agregar un encabezado como el siguiente, sin la clave de encabezado
key
:"content-type": [ { "value": "text/html;charset=UTF-8" } ]
En este ejemplo, Lambda @Edge inserta automáticamente
"key": "Content-Type"
.
Para obtener más información acerca de restricciones de uso de encabezados, consulte Restricciones en funciones de borde.
-
status
-
Código de estado HTTP de la respuesta.
statusDescription
-
La descripción del estado HTTP de la respuesta.