Tutorial: Creación de una función de Lambda@Edge sencilla - Amazon CloudFront

Tutorial: Creación de una función de Lambda@Edge sencilla

En este tutorial, se muestra cómo comenzar a utilizar Lambda@Edge; para ello, se le ayuda a crear y agregar una función de Node.js de ejemplo que se ejecuta en CloudFront. En el ejemplo que se muestra, se añaden encabezados HTTP de seguridad a una respuesta, lo que puede mejorar la seguridad y privacidad de un sitio web. No necesita un sitio web para este tutorial. En él, simplemente agregamos encabezados de seguridad a una respuesta cuando CloudFront recupera un archivo.

En este ejemplo se describen los pasos para crear y configurar una función Lambda@Edge. Seguirá pasos similares y elegirá entre las mismas opciones cuando cree su propia solución de Lambda@Edge.

Paso 1: Inscribirse en una cuenta de AWS

Si aún no lo ha hecho, regístrese en Amazon Web Services en http://aws.amazon.com. Elija Sign Up Now (Inscríbase ahora) e introduzca la información que se le pida.

Paso 2: Crear una distribución de CloudFront.

Antes de crear la función de Lambda@Edge de ejemplo, debe tener un entorno de CloudFront con el que trabajar que incluya un origen para distribuir contenido.

¿Es la primera vez que utiliza CloudFront? CloudFront entrega el contenido a través de una red mundial de ubicaciones de borde. Cuando se configura una función de Lambda con CloudFront, la función puede personalizar el contenido más cercano a los lectores, lo que mejora el rendimiento. Si no está familiarizado con CloudFront, antes de realizar el tutorial, dedique unos minutos a leer una breve información general y a aprender algo acerca de cómo CloudFront almacena el contenido en caché y lo distribuye.

En este ejemplo, creará una distribución de CloudFront que utilice un bucket de Amazon S3 como origen de la distribución. Si ya dispone de un entorno, puede omitir este paso.

Para crear una distribución de CloudFront con un origen de Amazon S3

  1. Cree un bucket de Amazon S3 con un archivo o dos, como, por ejemplo, archivos de imágenes para usarlos como contenido de muestra. Puede seguir los pasos que se detallan en Cargar su contenido en Amazon S3. Asegúrese de que establece permisos para conceder acceso de lectura público a los objetos del bucket.

  2. Cree una distribución de CloudFront y agregue el bucket de S3 como un origen, siguiendo los pasos que se describen Crear una distribución web de CloudFront. Si ya tiene una distribución, solo es necesario que añada el bucket como origen para esa distribución.

    sugerencia

    Tome nota del ID de distribución. Más adelante en este tutorial, al agregar un desencadenador de CloudFront para la función, debe elegir el ID de la distribución en una lista desplegable, por ejemplo, E653W22221KDDL.

Paso 3: Crear una función

En este paso, se crea una función de Lambda, a partir de una plantilla de proyecto que se proporciona en la consola de Lambda. La función agrega código para actualizar los encabezados de seguridad de su distribución de CloudFront.

¿Es la primera vez que utiliza Lambda o Lambda@Edge? Lambda @Edge le permite utilizar los desencadenadores de CloudFront para invocar una función de Lambda. Cuando asocia una distribución de CloudFront con una función de Lambda, CloudFront intercepta solicitudes y respuestas en ubicaciones de borde de CloudFront y ejecuta la función. Las funciones de Lambda pueden mejorar la seguridad o personalizar la información según la ubicación de los lectores, para mejorar el rendimiento. La función que se crea en este tutorial actualiza los encabezados de seguridad de una respuesta de CloudFront.

Existen varios pasos que se deben dar al crear una función de Lambda. En este tutorial, se parte de una plantilla de proyecto para crear la función y, a continuación, se actualiza la función con código que establece los encabezados de seguridad. Por último, tendrá que agregar e implementar un desencadenador de CloudFront para que ejecute la función.

Para crear una función Lambda, realice el siguiente procedimiento:

  1. Inicie sesión en la consola de administración de AWS y abra la consola de AWS Lambda en https://console.aws.amazon.com/lambda/.

    importante

    Asegúrese de que está en la región US-East-1 (Norte de Virginia) (us-east-1). Debe estar en esta región para crear funciones de Lambda@Edge.

  2. Elija Create function (Crear función).

  3. En la página Create function (Crear función), elija Use a blueprint (Usar un proyecto) y, a continuación, filtre los proyectos de CloudFront especificando cloudfront en el campo de búsqueda. Se muestra Keyword : cloudfront (Palabra clave: cloudfront) y aparecen todos los proyectos etiquetados para CloudFront.

    nota

    Los proyectos de CloudFront solo están disponibles en la región US-East-1 (N. Virginia) EE. UU. Este (Norte de Virginia) (us-east-1).

  4. Elija el proyecto cloudfront-modify-response-header como la plantilla para su función.

  5. Escriba la siguiente información sobre su función:

    Nombre

    Escriba un nombre para la función.

    Rol de ejecución

    Elija cómo se deben establecer los permisos para la función. Para utilizar la plantilla de política de permisos de Lambda @Edge básica recomendada, elija Create a new role from AWS policy templates (Crear un nuevo rol a partir de plantillas de política de AWS).

    Role name (Nombre de rol)

    Escriba un nombre para el rol que crea la plantilla de política.

    Policy templates (Plantillas de política)

    Lambda agrega automáticamente la plantilla de política Basic Edge Lambda permissions (Permisos básicos de Edge Lambda), ya que eligió un proyecto de CloudFront como base de la función. Esta plantilla de política agrega permisos de rol de ejecución que permiten a CloudFront ejecutar su función de Lambda en ubicaciones de CloudFront en todo el mundo. Para obtener más información, consulte Configuración de permisos y roles de IAM para Lambda@Edge.

  6. Elija Create function (Crear función). Lambda crea la función, y en la página siguiente verá la configuración de su función.

  7. En la sección Designer (Diseñador) de la página, elija el nombre de la función, como se muestra en la siguiente imagen. En este ejemplo, el nombre de la función es ExampleFunction.

    
								Página de funciones Lambda de la consola de Lambda en la que se muestra la sección del diseñador con el nombre de la función seleccionado.
  8. Desplácese hacia abajo hasta la sección Function code (Código de función) de la página, como se muestra en la siguiente imagen.

    
								Página de funciones Lambda de la consola de Lambda en la que se muestra la sección de código de función.

    Reemplace el código de la plantilla por una función que modifique los encabezados de seguridad que devuelve el origen. Por ejemplo, puede utilizar código similar al siguiente:

    'use strict'; exports.handler = (event, context, callback) => { //Get contents of response const response = event.Records[0].cf.response; const headers = response.headers; //Set new headers headers['strict-transport-security'] = [{key: 'Strict-Transport-Security', value: 'max-age= 63072000; includeSubdomains; preload'}]; headers['content-security-policy'] = [{key: 'Content-Security-Policy', value: "default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'"}]; headers['x-content-type-options'] = [{key: 'X-Content-Type-Options', value: 'nosniff'}]; headers['x-frame-options'] = [{key: 'X-Frame-Options', value: 'DENY'}]; headers['x-xss-protection'] = [{key: 'X-XSS-Protection', value: '1; mode=block'}]; headers['referrer-policy'] = [{key: 'Referrer-Policy', value: 'same-origin'}]; //Return modified response callback(null, response); };
  9. Elija Save (Guardar) para guardar el código actualizado.

Continúe con la siguiente sección para agregar un desencadenador de CloudFront para ejecutar la función.

Paso 4: Agregue un desencadenador de CloudFront para ejecutar la función

Ahora que tiene una función de Lambda para actualizar los encabezados de seguridad, configure el desencadenador de CloudFront para ejecutar la función que va a agregar los encabezados a cualquier respuesta que CloudFront reciba desde el origen de la distribución.

Para configurar el desencadenador CloudFront para su función

  1. En la sección Designer (Diseñador) de la página, elija CloudFront, como se muestra en la siguiente imagen.

    
								Página de funciones Lambda de la consola de Lambda en la que se muestra la sección de diseñador con CloudFront seleccionado.
  2. Desplácese hacia abajo hasta la sección Configure triggers (Configurar desencadenadores) de la página y, a continuación, elija Deploy to Lambda@Edge (Implementar en Lambda@Edge).

  3. En la página Deploy to Lambda@Edge (Implementar en Lambda@Edge), en Configure CloudFront trigger (Configurar desencadenador de CloudFront), escriba lo siguiente:

    Distribución

    El ID de distribución de CloudFront que se debe asociar a la función. En la lista desplegable, elija el ID de distribución.

    Cache behavior (Comportamiento de la caché)

    El comportamiento de la caché que se debe utilizar con el disparador. En este ejemplo, deje el valor establecido en * es decir, el comportamiento de caché predeterminado de la distribución. Para obtener más información, consulte Configuración del comportamiento de la caché en el tema Valores que deben especificarse al crear o actualizar una distribución.

    Evento CloudFront

    El desencadenador que especifica cuándo se ejecutará la función. Queremos que la función de encabezados de seguridad se ejecute siempre que CloudFront devuelva una respuesta desde el origen. Por lo tanto, en la lista desplegable, elija Origin response (Respuesta de origen). Para obtener más información, consulte Adición de disparadores para una función de Lambda@Edge.

  4. En Confirm deploy to Lambda@Edge (Confirmar implementación en Lambda@Edge), seleccione la casilla para confirmar que el desencadenador se implementará y ejecutará la función en todas las ubicaciones de AWS.

  5. Elija Deploy (Implementar) para agregar el desencadenador y replicar la función a ubicaciones de AWS en todo el mundo. A continuación, si es necesario, cierre la página Deploy to Lambda@Edge (Implementar en Lambda@Edge).

  6. Espere a que la función se replique. Esta operación suele tardar varios minutos.

    Para comprobar si la replicación ha terminado, vaya a la consola de CloudFront y consulte la distribución. Espere a que el estado de la distribución cambie de In Progress (En curso) a Deployed (Implementada), lo que significa que la función se ha replicado. Para comprobar que la función es correcta, realice los pasos de la siguiente sección.

Paso 5: Verificar que la función se ejecuta

Ahora que ha creado la función de Lambda y que ha configurado un desencadenador para que la ejecute en una distribución de CloudFront, asegúrese de que la función se comporta según lo previsto. En este ejemplo, comprobamos los encabezados HTTP que devuelve CloudFront, para asegurarnos de que se agregan los encabezados de seguridad.

Para verificar que la función de Lambda@Edge añade los encabezados de seguridad

  1. En un navegador, escriba la dirección URL de un archivo de su bucket de S3. Por ejemplo, puede utilizar una URL similar a http://d111111abcdef8.cloudfront.net/image.jpg.

    Para obtener más información sobre el nombre de dominio de CloudFront que se debe utilizar en la URL del archivo, consulte Personalización del formato de URL para archivos en CloudFront.

  2. Abra la barra de herramientas para desarrolladores web del navegador. Por ejemplo, en la ventana del navegador Chrome, abra el menú contextual (haga clic con el botón derecho) y, a continuación, elija Inspect (Inspeccionar).

  3. Elija la pestaña Network (Red).

  4. Vuelva a cargar la página para ver la imagen y, a continuación, elija una solicitud HTTP en el panel izquierdo. Verá que los encabezados HTTP se muestran en un panel independiente.

  5. Examine la lista de encabezados HTTP para verificar que incluye los encabezados de seguridad esperados. Por ejemplo, es posible que vea encabezados similares a los que se muestran en la siguiente captura de pantalla.

    
								Lista de encabezados HTTP con los encabezados de seguridad esperados resaltados.

Si los encabezados de seguridad se incluyen en la lista de encabezados, ¡estupendo! Significa que ha creado correctamente su primera función de Lambda@Edge. Si CloudFront devuelve algún error o hay otros problemas, continúe con el paso siguiente para solucionar los problemas.

Paso 6: Solucionar problemas

Si CloudFront devuelve errores o no agrega los encabezados de seguridad según lo previsto, puede investigar la ejecución de la función consultando los CloudWatch Logs. Asegúrese de utilizar los registros almacenados en la ubicación de AWS más cercana a la ubicación en que se ejecuta la función.

Por ejemplo, si ve el archivo desde Londres, pruebe a cambiar la región en la consola de CloudWatch a UE (Londres).

Para examinar los registros de CloudWatch para su función de Lambda@Edge

  1. Inicie sesión en la consola de administración de AWS y abra la consola de CloudWatch en https://console.aws.amazon.com/cloudwatch/

  2. Cambie Región (Región) a la ubicación que se muestra al ver el archivo en el navegador. Aquí es donde se está ejecutando la función.

  3. En el panel izquierdo, elija Logs para ver los logs de la distribución.

Para obtener más información, consulte Monitoreo de CloudFront con Amazon CloudWatch.

Paso 7: Eliminar los recursos del ejemplo

Si ha creado un bucket de Amazon S3 y una distribución de CloudFront solo para este tutorial, elimine los recursos de AWS asignados para que no se le apliquen cargos. Después de eliminar los recursos de AWS, el contenido que haya agregado dejará de estar disponible.

Tareas

Eliminación del bucket de S3

Antes de eliminar su bucket de Amazon S3, asegúrese de que la función de registro esté desactivada para el bucket. De lo contrario, AWS seguirá escribiendo registros en su bucket mientras lo elimina.

Para deshabilitar el registro en el bucket

  1. Abra la consola de Amazon S3 en https://console.aws.amazon.com/s3.

  2. Seleccione el bucket y, luego, seleccione Properties (Propiedades).

  3. En Properties (Propiedades), elija Logging (Registro).

  4. Elimine la selección del recuadro Enabled (Habilitado).

  5. Seleccione Save.

Ahora ya puede eliminar el bucket. Para obtener más información, consulte ¿Cómo elimino un bucket de S3? en la Guía del usuario de la consola de Amazon Simple Storage Service.

Eliminar la distribución de CloudFront

Antes de eliminar una distribución de CloudFront, debe desactivarla. Una distribución deshabilitada ya no es funcional y no acumula cargos. Puede habilitar una distribución deshabilitada en cualquier momento. Después de eliminar una distribución deshabilitada, esta deja de estar disponible.

Para desactivar y eliminar una distribución de CloudFront

  1. Abra la consola de CloudFront en https://console.aws.amazon.com/cloudfront/.

  2. Seleccione la distribución que desea deshabilitar y elija Disable (Deshabilitar).

  3. Cuando se le indique que confirme, seleccione Yes, Disable (Sí, deshabilitar).

  4. Seleccione la distribución desactivada y después Delete (Eliminar).

  5. Cuando se le indique que confirme, seleccione Yes, Delete.

Más recursos de aprendizaje

Ahora que tiene una idea básica de cómo funcionan las funciones de Lambda@Edge, puede obtener más información leyendo los temas siguientes: