Trabajo con solicitudes y respuestas
Para utilizar las solicitudes y respuestas de Lambda@Edge, consulte los temas siguientes:
Temas
Uso de funciones de Lambda@Edge con conmutación por error de origen
Puede utilizar las funciones de Lambda@Edge con distribuciones de CloudFront que ha configurado con grupos de origen, por ejemplo, para conmutación por error de origen que configure para ayudar a garantizar una alta disponibilidad. Para utilizar una función de Lambda con un grupo de origen, especifique la función en una solicitud de origen o un desencadenador de respuesta de origen para un grupo de origen al crear el comportamiento de la caché.
Para más información, consulte los siguientes temas:
-
Creación de grupos de origen: Creación de un grupo de origen
-
Cómo utilizar la conmutación por error de origen con Lambda@Edge: Utilizar la conmutación por error de origen con funciones de Lambda@Edge
Generación de respuestas HTTP en los desencadenadores de solicitud
Cuando CloudFront recibe una solicitud, es posible utilizar una función de Lambda para generar una respuesta HTTP que CloudFront devuelve directamente al lector sin enviarla al origen. La generación de respuestas HTTP reduce la carga en el origen, y normalmente también reduce la latencia para el espectador.
Entre las situaciones más comunes para generar respuestas HTTP se incluyen las siguientes:
-
Devolver una pequeña página web al lector
-
Devolver un código de estado HTTP 301 o 302 para redirigir al usuario a otra página web
-
Devolución de un código de estado HTTP 401 al espectador si el usuario no se ha autenticado
Una función de Lambda@Edge puede generar una respuesta HTTP cuando ocurren los siguientes eventos de CloudFront:
- Eventos de solicitud del espectador
-
Cuando un evento de solicitud del lector activa una función, CloudFront devuelve la respuesta al lector y no la almacena en caché.
- Eventos de solicitud al origen
-
Cuando un evento de solicitud al origen activa una función, CloudFront busca en la caché de borde una respuesta generada previamente por la función.
-
Si la respuesta está en la caché, la función no se ejecuta y CloudFront devuelve al lector la respuesta almacenada en la caché.
-
Si la respuesta no está en la caché, la función se ejecuta, CloudFront devuelve la respuesta al lector y también la almacena en la caché.
-
Para ver algunos ejemplos de código para generar respuestas HTTP, consulte Funciones de ejemplo de Lambda@Edge. También puede sustituir las respuestas HTTP en disparadores de respuesta. Para obtener más información, consulte Actualización de respuestas HTTP en desencadenadores de respuesta de origen.
Modelo de programación
En esta sección se describe el modelo de programación a seguir para usar Lambda@Edge con el fin de generar respuestas HTTP.
Objeto de respuesta
La respuesta que devuelva como parámetro result
del método callback
debe tener la siguiente estructura (tenga en cuenta que solo es obligatorio el campo status
).
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' };
El objeto de respuesta puede incluir los siguientes valores:
body
-
El cuerpo, si lo hay, que desea que CloudFront devuelva en la respuesta generada.
bodyEncoding
-
La codificación del valor especificado en
body
. Las únicas codificaciones válidas sontext
ybase64
. Si incluyebody
en el objetoresponse
pero omitebodyEncoding
, CloudFront trata el cuerpo como texto.Si especifica
bodyEncoding
comobase64
pero el cuerpo no tiene una codificación base64 válida, CloudFront devuelve un error. headers
-
Los encabezados que desea que devuelva CloudFront en la respuesta generada. 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 encabezado (por ejemplo,
headers["accept"]
orheaders["host"]
) es una matriz de pares clave-valor. Para un encabezado determinado, la matriz contiene un par de clave-valor para cada valor de la respuesta generada. -
key
(opcional) es el nombre del encabezado que diferencia mayúsculas de minúsculas tal como aparece en una solicitud HTTP; por ejemplo,accept
uhost
. -
Especifique
value
como un valor de encabezado. -
Si no incluye la parte de clave de encabezado del par de clave-valor, Lambda@Edge insertará automáticamente una clave de encabezado utilizando 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 añadir un encabezado como el siguiente, sin una clave de encabezado:
'content-type': [{ value: 'text/html;charset=UTF-8' }]
En este ejemplo, Lambda@Edge crea la siguiente clave de encabezado:
Content-Type
.
Para obtener más información acerca de restricciones de uso de encabezados, consulte Restricciones en funciones de borde.
-
status
-
El código de estado HTTP. Proporcione el código de estado como una cadena. CloudFront utiliza el código de estado proporcionado para lo siguiente:
-
Devolverlo en la respuesta
-
Almacenarlo en la caché de borde de CloudFront cuando la respuesta la generó una función activada por un evento de solicitud al origen
-
Inicie sesión en CloudFront Configuración y uso de registros estándar (registros de acceso)
Si el valor
status
no está comprendido entre 200 y 599, CloudFront devuelve un error al lector. -
statusDescription
-
La descripción que desea que CloudFront devuelva en la respuesta, y que acompañará al código de estado HTTP. No es obligatorio utilizar descripciones estándar, como
OK
en un código de estado HTTP 200.
Errores
Los siguientes son posibles errores de respuestas HTTP generadas.
La respuesta contiene un cuerpo y especifica un código de estado 204 (Sin contenido)
-
Cuando una solicitud del lector activa una función, CloudFront devuelve un código de estado HTTP 502 (Gateway incorrecta) al lector cuando se cumplen las dos condiciones siguientes:
-
El valor de
status
es 204 (Sin contenido) -
La respuesta incluye un valor para
body
Esto se debe a que Lambda@Edge impone la restricción opcional de RFC 2616 que establece que una respuesta
HTTP 204
no necesita contener cuerpo de mensaje. -
Restricciones en el tamaño de la respuesta generada
-
El tamaño máximo de una respuesta generada por una función de Lambda depende del evento que desencadenó la función:
-
Eventos de solicitud del lector: 40 KB
-
Eventos de solicitud al origen: 1 MB
Si la respuesta supera el tamaño permitido, CloudFront devuelve un código de estado HTTP 502 (Gateway incorrecta) al lector.
-
Campos obligatorios
El campo status
es obligatorio.
Todos los demás campos son opcionales.
Actualización de respuestas HTTP en desencadenadores de respuesta de origen
Cuando CloudFront recibe una respuesta HTTP desde el servidor de origen, si existe un desencadenador de respuesta del origen asociado al comportamiento de la caché, es posible modificar la respuesta HTTP para anular lo que ha devuelto el origen.
Entre las situaciones más comunes para actualizar respuestas HTTP se incluyen las siguientes:
-
Cambiar el estado para establecer un código de estado HTTP 200 y crear un cuerpo con contenido estático para devolverlo al espectador cuando un origen devuelva un código de estado de error (4xx o 5xx). Para ver el código de muestra, consulte Ejemplo: Uso de un desencadenador de respuesta de origen para actualizar el código de estado de error a 200.
-
Cambiar el estado para establecer un código de estado HTTP 301 o 302, con objeto de redirigir al usuario a otro sitio web cuando un origen devuelve un código de estado de error (4xx o 5xx). Para ver el código de muestra, consulte Ejemplo: Uso de un desencadenador de respuesta de origen para actualizar el código de estado de error a 302.
nota
La función debe devolver un valor de estado entre 200
y 599
(incluidos); de lo contrario, CloudFront devuelve un error al espectador.
También puede sustituir las respuestas HTTP en eventos de solicitud al origen y del espectador. Para obtener más información, consulte Generación de respuestas HTTP en los desencadenadores de solicitud.
Cuando trabaja con la respuesta HTTP, Lambda@Edge no expone el cuerpo que devuelve el servidor de origen al desencadenador de respuesta del origen. Puede generar un cuerpo con contenido estático estableciéndolo en el valor deseado, o eliminar el cuerpo dentro de la función estableciendo un valor vacío. Si no actualiza el campo de cuerpo de la función, se devolverá al espectador el cuerpo original devuelto por el servidor de origen.
Acceso al cuerpo de la solicitud con la opción Incluir cuerpo
A partir de ahora, puede hacer que Lambda@Edge exponga el cuerpo de una solicitud en los métodos HTTP que permiten la escritura (POST, PUT, DELETE, etc.) para que puede tener acceso a él en la función de Lambda. Puede elegir acceso de solo lectura o puede especificar que sustituirá el cuerpo.
Para habilitar esta opción, elija Incluir cuerpo al crear un desencadenador de CloudFront para la función que corresponde a un evento de solicitud al origen o del lector. Para obtener más información, consulte Adición de desencadenadores para una función de Lambda@Edge; para obtener información acerca de cómo utilizar Incluir cuerpo con su función, consulte Estructura de eventos de Lambda@Edge.
Entre los escenarios en los que es conveniente utilizar esta característica se incluyen los siguientes:
-
Procesamiento de formularios web, como formularios de tipo "póngase en contacto con nosotros", sin devolver los datos de entrada de los clientes a los servidores de origen.
-
Recopilación de datos de balizas web enviados por los navegadores de los espectadores y que se procesan en el borde.
Para ver el código de muestra, consulte Funciones de ejemplo de Lambda@Edge.
nota
Si el cuerpo de la solicitud es grande, Lambda@Edge lo trunca. Para obtener información detallada sobre el tamaño máximo y el truncamiento, consulte Restricciones para el cuerpo de la solicitud con la opción Incluir cuerpo.