Tutorial: Usar un trigger Amazon S3 para invocar una función Lambda - AWS Lambda

Tutorial: Usar un trigger Amazon S3 para invocar una función Lambda

En este tutorial, se utiliza la consola con el fin de crear una función de Lambda y configurar un trigger para Amazon Simple Storage Service (Amazon S3). El trigger invoca la función cada vez que se agrega un objeto al bucket Amazon S3.

Recomendamos que complete este tutorial basado en la consola antes de continuar con el tutorial para crear imágenes en miniatura.

Requisitos previos

Para usar Lambda y otros AWS servicios, necesita una cuenta AWS. Si no dispone de una cuenta, visite aws.amazon.com y, a continuación, elija Create an AWS Account (Crear una cuenta de AWS). Para obtener instrucciones, consulte ¿Cómo puedo crear y activar una AWS cuenta nueva?

En este tutorial, se le presuponen algunos conocimientos sobre las operaciones básicas de Lambda y la consola de Lambda. Si aún no lo ha hecho, siga las instrucciones que se indican en Introducción a Lambda para crear la primera función Lambda.

Crear un bucket y cargar un objeto de muestra.

Cree un bucket Amazon S3 y cargue un archivo de prueba al nuevo bucket. La función de Lambda recupera información sobre este archivo cuando se prueba la función desde la consola.

Para crear un bucket de Amazon S3 con la consola

  1. Abra la consola de Amazon S3.

  2. Elija Create bucket (Crear bucket).

  3. En Configuración general, haga lo siguiente:

    1. En Nombre del bucket, escriba un nombre único.

    2. En AWS Región, seleccione una región. Tenga en cuenta que debe crear la Lambda función en la misma región.

  4. Elija Create bucket (Crear bucket).

Luego de crear el bucket, Amazon S3 abre la página deBuckets, que muestra una lista de todos los buckets de la cuenta en la región actual.

Para cargar un objeto de prueba mediante la consola Amazon S3

  1. En la página Buckets de la consola Amazon S3, elija el nombre del bucket que ha creado.

  2. En la pestaña Objetos, elija Cargar.

  3. Arrastre un archivo de prueba desde el equipo local a la página Cargar .

  4. Seleccione Upload.

Creación de la función de Lambda

Utilice un proyecto de función para crear la función Lambda. Un proyecto proporciona una función de ejemplo que demuestra cómo utilizar Lambda con otros servicios AWS. Además, un proyecto incluye código de ejemplo y ajustes preestablecidos de configuración de funciones para un determinado tiempo de ejecución. Para este tutorial, puede elegir el proyecto para el tiempo de ejecución Node.js o Python.

Para crear una función Lambda a partir de un proyecto en la consola:

  1. Abra la Página de funciones en la consola de Lambda.

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

  3. En la página Create function (Crear función), seleccione Use a blueprint (Utilizar un proyecto).

  4. En Blueprints (Proyectos), escriba s3 en el cuadro de búsqueda.

  5. En los resultados de búsqueda, realice una de las acciones siguientes:

    • Para una función Node.js, elija s3-get-object.

    • Para una función de Python, elija s3-get-object-python.

  6. Elija Configure (Configurar).

  7. Bajo Basic information (Información básica), haga lo siguiente:

    1. En Function name (Nombre de función), introduzca my-s3-function.

    2. Para Execution Role (Rol de ejecución), elija Create a new role from AWS policy templates (Crear un rol a partir de plantillas de políticas AWS).

    3. En Nombre del rol, introduzca my-s3-function-role.

  8. En el trigger de S3, elija el bucket de S3 que creó anteriormente.

    Cuando configura un trigger de S3 mediante la Lambda consola, esta modifica la política basada en recursos de la función, para permitir que Amazon S3 invoque la función.

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

Revisar el código de la función

La función Lambda recupera el nombre del bucket S3 de origen y el nombre de clave del objeto cargado desde el parámetro de evento que recibe. La función utiliza la API Amazon S3 getObject para recuperar el tipo de contenido del objeto.

Mientras visualiza la función en la Lambda consola, puede revisar el código de la función en la pestaña Code (Código), en Code source (Fuente de código). El código tiene el siguiente aspecto:

Node.js

ejemplo index.js

console.log('Loading function'); const aws = require('aws-sdk'); const s3 = new aws.S3({ apiVersion: '2006-03-01' }); exports.handler = async (event, context) => { //console.log('Received event:', JSON.stringify(event, null, 2)); // Get the object from the event and show its content type const bucket = event.Records[0].s3.bucket.name; const key = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, ' ')); const params = { Bucket: bucket, Key: key, }; try { const { ContentType } = await s3.getObject(params).promise(); console.log('CONTENT TYPE:', ContentType); return ContentType; } catch (err) { console.log(err); const message = `Error getting object ${key} from bucket ${bucket}. Make sure they exist and your bucket is in the same region as this function.`; console.log(message); throw new Error(message); } };
Python

ejemplo lambda_function.py

import json import urllib.parse import boto3 print('Loading function') s3 = boto3.client('s3') def lambda_handler(event, context): #print("Received event: " + json.dumps(event, indent=2)) # Get the object from the event and show its content type bucket = event['Records'][0]['s3']['bucket']['name'] key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'], encoding='utf-8') try: response = s3.get_object(Bucket=bucket, Key=key) print("CONTENT TYPE: " + response['ContentType']) return response['ContentType'] except Exception as e: print(e) print('Error getting object {} from bucket {}. Make sure they exist and your bucket is in the same region as this function.'.format(key, bucket)) raise e

Probar en la consola

Invoque la función Lambda de forma manual con los datos del evento Amazon S3 de muestra.

Para probar la función de Lambda con la consola:

  1. En la pestaña Código, en Origen de código, elija la flecha situada junto a Pruebay, a continuación, elija Configure test events (Configurar eventos de prueba) de la lista desplegable.

  2. En la ventana Configurar eventos de prueba, haga lo siguiente:

    1. Elija Create new test event.

    2. Para la Plantilla de eventos, elija Amazon S3 Put (s3-put).

    3. En Nombre del evento, escriba un nombre para el evento de prueba. Por ejemplo, mys3testevent.

    4. En el evento de prueba JSON, reemplace el nombre del bucket S3 (example-bucket) y la clave de objeto (test/key) por el nombre del bucket y el nombre del archivo de prueba. El evento de prueba debe ser similar al siguiente:

      { "Records": [ { "eventVersion": "2.0", "eventSource": "aws:s3", "awsRegion": "us-west-2", "eventTime": "1970-01-01T00:00:00.000Z", "eventName": "ObjectCreated:Put", "userIdentity": { "principalId": "EXAMPLE" }, "requestParameters": { "sourceIPAddress": "127.0.0.1" }, "responseElements": { "x-amz-request-id": "EXAMPLE123456789", "x-amz-id-2": "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH" }, "s3": { "s3SchemaVersion": "1.0", "configurationId": "testConfigRule", "bucket": { "name": "my-s3-bucket", "ownerIdentity": { "principalId": "EXAMPLE" }, "arn": "arn:aws:s3:::example-bucket" }, "object": { "key": "HappyFace.jpg", "size": 1024, "eTag": "0123456789abcdef0123456789abcdef", "sequencer": "0A1B2C3D4E5F678901" } } } ] }
    5. Seleccione Create (Crear).

  3. Para invocar la función con el evento de prueba, en Fuente de código, elija Prueba.

    La ficha Execution results (Resultados de ejecución) muestra la respuesta, los registros de funciones y el ID de solicitud, de forma similar a la siguiente:

    Response "image/jpeg" Function Logs START RequestId: 12b3cae7-5f4e-415e-93e6-416b8f8b66e6 Version: $LATEST 2021-02-18T21:40:59.280Z 12b3cae7-5f4e-415e-93e6-416b8f8b66e6 INFO INPUT BUCKET AND KEY: { Bucket: 'my-s3-bucket', Key: 'HappyFace.jpg' } 2021-02-18T21:41:00.215Z 12b3cae7-5f4e-415e-93e6-416b8f8b66e6 INFO CONTENT TYPE: image/jpeg END RequestId: 12b3cae7-5f4e-415e-93e6-416b8f8b66e6 REPORT RequestId: 12b3cae7-5f4e-415e-93e6-416b8f8b66e6 Duration: 976.25 ms Billed Duration: 977 ms Memory Size: 128 MB Max Memory Used: 90 MB Init Duration: 430.47 ms Request ID 12b3cae7-5f4e-415e-93e6-416b8f8b66e6

Prueba con el trigger de S3

Invoque la función cuando cargue un archivo en el bucket Amazon S3 de origen.

Para probar la función Lambda use el trigger de S3.

  1. En la página Buckets de la consola Amazon S3, elija el nombre del bucket de origen que creó anteriormente.

  2. En la página Cargar, cargue algunos archivos de imagen .jpg o .png en el bucket.

  3. Abra la Página de funciones en la consola de Lambda.

  4. Elija el nombre de la función (my-s3-function).

  5. Elija la pestaña Monitor y, a continuación, compruebe que la función se ejecutó una vez para cada archivo que cargó.

  6. (Opcional) Para ver los registros en la consola CloudWatch, elija Ver registros en CloudWatch. Elija una secuencia de registro para ver la salida de registros de una de las invocaciones de función.

Limpiar los recursos

Ahora puede eliminar los recursos que creó para este tutorial, a menos que desee conservarlos. Si elimina los recursos de AWS que ya no utiliza, evitará gastos innecesarios en su cuenta de AWS.

Para eliminar la función de Lambda

  1. Abra la Página de Funciones de la consola de Lambda.

  2. Seleccione la función que ha creado.

  3. Elija Actions (Acciones), Delete (Eliminar).

  4. Elija Eliminar.

Para eliminar la política IAM:

  1. Abra la página de políticas de la consolaAWS Identity and Access Management (IAM).

  2. Seleccione la política que Lambda creó para usted. El nombre de la política comienza con AWSLambdas3ExecutionRole-.

  3. Elija Policy actions (Acciones de política), Delete (Eliminar).

  4. Elija Eliminar.

Para eliminar el rol de ejecución

  1. Abra la Página de Roles de la consola de IAM.

  2. Seleccione el rol de ejecución que ha creado.

  3. Elija Delete role (Eliminar rol).

  4. Elija Sí, eliminar.

Para eliminar el bucket de S3

  1. Abra la consola de Amazon S3.

  2. Seleccione el bucket que ha creado.

  3. Elija Eliminar.

  4. Escriba el nombre del bucket en el cuadro de texto.

  5. Elija Confirm.

Pasos siguientes

Pruebe con el tutorial más avanzado. En este tutorial, el trigger de S3 invoca una función a fin de crear una imagen en miniatura para cada archivo de imagen que se carga en el bucket de S3. Este tutorial requiere un nivel moderado de conocimiento y dominio de AWS y Lambda. Utilice AWS Command Line Interface (AWS CLI) para crear recursos y cree un paquete de implementación de archivo de archivos.zip para la función y sus dependencias.