Trabajo con solicitudes y respuestas - Amazon CloudFront

Trabajo con solicitudes y respuestas

Para utilizar las solicitudes y respuestas de Lambda@Edge, consulte los temas siguientes:

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:

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 son text y base64. Si incluye body en el objeto response pero omite bodyEncoding, CloudFront trata el cuerpo como texto.

Si especifica bodyEncoding como base64 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"] or headers["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 u host.

  • 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:

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:

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.