En este tutorial, se crea y configura una función de Lambda para cambiar el tamaño de las imágenes agregadas a un bucket de Amazon Simple Storage Service (Amazon S3). Al agregar un archivo de imagen al bucket, Amazon S3 invoca la función de Lambda. A continuación, la función crea una versión en miniatura de la imagen y la envía a otro bucket de Amazon S3.

Para completar este tutorial, lleve a cabo los siguientes pasos:
-
Cree buckets de origen y destino de Amazon S3 y cargue una imagen de muestra.
-
Cree una función de Lambda que cambie el tamaño de una imagen y genere una miniatura en un bucket de Amazon S3.
-
Configure un desencadenador de Lambda que invoque la función cuando se carguen objetos en el bucket de origen.
-
Pruebe la función, primero con un evento ficticio y, a continuación, cargando una imagen al bucket de origen.
Al completar estos pasos, aprenderá a utilizar Lambda para llevar a cabo una tarea de procesamiento de archivos en objetos agregados a un bucket de Amazon S3. Puede completar esta tarea mediante la AWS Command Line Interface (AWS CLI) o la AWS Management Console.
Si busca un ejemplo más sencillo para aprender a configurar un desencadenador de Amazon S3 para Lambda, puede probar el Tutorial: Uso de un desencadenador de Amazon S3 para invocar una función de Lambda.
Temas
Requisitos previos
Si desea utilizar la AWS CLI para completar el tutorial, instale la versión más reciente de la AWS Command Line Interface.
Para el código de la función de Lambda, puede utilizar Python o Node.js. Instale las herramientas de soporte de lenguajes y un administrador de paquetes para el lenguaje que desee utilizar.
Si aún no ha instalado AWS Command Line Interface, siga los pasos que se indican en Instalación o actualización de la versión más reciente de AWS CLI para instalarlo.
El tutorial requiere un intérprete de comandos o un terminal de línea de comando para ejecutar los comandos. En Linux y macOS, use su administrador de intérprete de comandos y paquetes preferido.
nota
En Windows, algunos comandos de la CLI de Bash que se utilizan habitualmente con Lambda (por ejemplo, zip
) no son compatibles con los terminales integrados del sistema operativo. Para obtener una versión de Ubuntu y Bash integrada con Windows, instale el subsistema de Windows para Linux
Crear dos buckets de Amazon S3

Primero, cree dos buckets de Amazon S3. El primer bucket es el bucket de origen al que subirá las imágenes. Lambda utiliza el segundo bucket para guardar las miniaturas redimensionadas cuando se invoca la función.
Para crear buckets de Amazon S3 (consola)
-
Abra la consola de Amazon S3
y seleccione la página Buckets de uso general. -
Seleccione la Región de AWS más cercana a su ubicación geográfica. Puede cambiar la región por medio de la lista desplegable de la parte superior de la pantalla. Más adelante en el tutorial, debe crear la función de Lambda en la misma región.
-
Elija Crear bucket.
-
En Configuración general, haga lo siguiente:
-
En Tipo de bucket, asegúrese de que Uso general está seleccionado.
-
Para el nombre del bucket, ingrese un nombre único a nivel mundial que cumpla las reglas de nomenclatura de bucket de Amazon S3. Los nombres de bucket pueden contener únicamente letras minúsculas, números, puntos (.) y guiones (-).
-
-
Deje el resto de las opciones con sus valores predeterminados y seleccione Crear bucket.
-
Repita los pasos 1 a 5 para crear el bucket de destino. En Nombre del bucket, introduzca
, dondeamzn-s3-demo-source-bucket-resized
es el nombre del bucket de origen que acaba de crear.amzn-s3-demo-source-bucket
Cargar una imagen de prueba al bucket de origen

Más adelante en el tutorial, probará la función de Lambda al invocarla mediante la AWS CLI o la consola de Lambda. Para confirmar que la función se ejecuta correctamente, el bucket de origen debe contener una imagen de prueba. Esta imagen puede ser cualquier archivo JPG o PNG que elija.
Para cargar una imagen de prueba al bucket de origen (consola)
-
En la consola de Amazon S3, abra la página Buckets
. -
Seleccione el bucket de origen que creó en el paso anterior.
-
Seleccione Cargar.
-
Elija Agregar archivos y utilice el selector de archivos para elegir el objeto que desea cargar.
-
Elija Abrir y, a continuación, Cargar.
Creación de una política de permisos

El primer paso para crear la función de Lambda es crear una política de permisos. Esta política concede a la función los permisos que necesita para acceder a otros recursos de AWS. En este tutorial, la política concede permisos de lectura y escritura a Lambda para los buckets de Amazon S3 y permite que escriba en los Registros de Amazon CloudWatch.
Para crear la política (consola)
-
Abra la página de Policies (Políticas)
de la consola AWS Identity and Access Management (IAM). -
Seleccione Crear política.
-
Elija la pestaña JSON y pegue la siguiente política personalizada en el editor JSON.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:PutLogEvents", "logs:CreateLogGroup", "logs:CreateLogStream" ], "Resource": "arn:aws:logs:*:*:*" }, { "Effect": "Allow", "Action": [ "s3:GetObject" ], "Resource": "arn:aws:s3:::*/*" }, { "Effect": "Allow", "Action": [ "s3:PutObject" ], "Resource": "arn:aws:s3:::*/*" } ] }
-
Elija Siguiente.
-
En Detalles de política, para el Nombre de la política, ingrese
.LambdaS3Policy
-
Seleccione Crear política.
Creación de un rol de ejecución

Un rol de ejecución es un rol de IAM que concede a la función de Lambda permiso para acceder a servicios y recursos de Servicios de AWS. Para conceder a la función acceso de lectura y escritura a un bucket de Amazon S3, debe adjuntar la política de permisos que creó en el paso anterior.
Para crear un rol de ejecución y adjuntar la política de permisos (consola)
-
Abra la página Roles
en la consola (IAM). -
Elija Creación de rol.
-
En Tipo de entidad de confianza, seleccione el Servicio de AWS; en Caso de uso, seleccione Lambda.
-
Elija Siguiente.
-
Agregue la política de permisos que creó en el paso anterior de la siguiente manera:
-
En el cuadro de búsqueda de políticas, escriba
.LambdaS3Policy
-
En los resultados de búsqueda, seleccione la casilla de verificación para
LambdaS3Policy
. -
Elija Siguiente.
-
-
En Detalles del rol, para el Nombre del rol, ingrese
.LambdaS3Role
-
Elija Creación de rol.
Crear el paquete de despliegue de la función

Para crear una función, debe crear un paquete de despliegue que contenga el código y las dependencias de la función. Para esta función CreateThumbnail
, el código de la función utiliza una biblioteca independiente para cambiar el tamaño de la imagen. Siga las instrucciones del lenguaje elegido para crear un paquete de despliegue que contenga la biblioteca requerida.
Para crear el paquete de despliegue (Node.js)
-
Cree un directorio llamado
lambda-s3
para el código y las dependencias de la función y desplácese hasta él.mkdir lambda-s3 cd lambda-s3
-
Cree un nuevo proyecto de Node.js con
npm
. Para aceptar las opciones predeterminadas proporcionadas en la experiencia interactiva, oprimaEnter
.npm init
-
Guarde el siguiente código de función en un archivo llamado
index.mjs
. Asegúrese de reemplazarus-east-1
por la Región de AWS en la que creó sus propios buckets de origen y destino.// dependencies import { S3Client, GetObjectCommand, PutObjectCommand } from '@aws-sdk/client-s3'; import { Readable } from 'stream'; import sharp from 'sharp'; import util from 'util'; // create S3 client const s3 = new S3Client({region:
'us-east-1'
}); // define the handler function export const handler = async (event, context) => { // Read options from the event parameter and get the source bucket console.log("Reading options from event:\n", util.inspect(event, {depth: 5})); const srcBucket = event.Records[0].s3.bucket.name; // Object key may have spaces or unicode non-ASCII characters const srcKey = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, " ")); const dstBucket = srcBucket + "-resized"; const dstKey = "resized-" + srcKey; // Infer the image type from the file suffix const typeMatch = srcKey.match(/\.([^.]*)$/); if (!typeMatch) { console.log("Could not determine the image type."); return; } // Check that the image type is supported const imageType = typeMatch[1].toLowerCase(); if (imageType != "jpg" && imageType != "png") { console.log(`Unsupported image type: ${imageType}`); return; } // Get the image from the source bucket. GetObjectCommand returns a stream. try { const params = { Bucket: srcBucket, Key: srcKey }; var response = await s3.send(new GetObjectCommand(params)); var stream = response.Body; // Convert stream to buffer to pass to sharp resize function. if (stream instanceof Readable) { var content_buffer = Buffer.concat(await stream.toArray()); } else { throw new Error('Unknown object stream type'); } } catch (error) { console.log(error); return; } // set thumbnail width. Resize will set the height automatically to maintain aspect ratio. const width = 200; // Use the sharp module to resize the image and save in a buffer. try { var output_buffer = await sharp(content_buffer).resize(width).toBuffer(); } catch (error) { console.log(error); return; } // Upload the thumbnail image to the destination bucket try { const destparams = { Bucket: dstBucket, Key: dstKey, Body: output_buffer, ContentType: "image" }; const putResult = await s3.send(new PutObjectCommand(destparams)); } catch (error) { console.log(error); return; } console.log('Successfully resized ' + srcBucket + '/' + srcKey + ' and uploaded to ' + dstBucket + '/' + dstKey); }; -
En el directorio
lambda-s3
, instale la biblioteca sharp con npm. Tenga en cuenta que la última versión de sharp (0.33) no es compatible con Lambda. Instale la versión 0.32.6 para completar este tutorial.npm install sharp@0.32.6
El comando npm
install
crea un directorionode_modules
para los módulos. Después de este paso, la estructura de directorios debería tener el siguiente aspecto.lambda-s3 |- index.mjs |- node_modules | |- base64js | |- bl | |- buffer ... |- package-lock.json |- package.json
-
Cree un paquete de despliegue .zip que contenga el código y las dependencias de la función. En Linux o macOS, ejecute el siguiente comando.
zip -r function.zip .
En Windows, utilice la utilidad de compresión que prefiera para crear un archivo .zip. Asegúrese de que los archivos
index.mjs
,package.json
,package-lock.json
y el directorionode_modules
estén todos en la raíz del archivo .zip.
Crear la función de Lambda

También puede crear la función de Lambda con la AWS CLI o la consola de Lambda. Siga las instrucciones del lenguaje elegido para crear la función.
Para crear la función (consola)
Para crear una función de Lambda con la consola, primero debe crear una función básica que contenga el código “Hola, mundo”. A continuación, reemplace este código por su propio código de función mediante la carga del archivo .zip o JAR que creó en el paso anterior.
-
Abra la página de Funciones
en la consola de Lambda. -
Asegúrese de trabajar en la misma Región de AWS en la que creó el bucket de Amazon S3. Puede cambiar la región por medio de la lista desplegable de la parte superior de la pantalla.
-
Elija Crear función.
-
Elija Author from scratch (Crear desde cero).
-
Bajo Basic information (Información básica), haga lo siguiente:
-
En Function name (Nombre de la función), introduzca
.CreateThumbnail
-
En Tiempo de ejecución, elija Node.js 22.x o Python 3.12, según el lenguaje que elija para la función.
-
En Arquitectura, elija x86_64.
-
-
En la pestaña Cambiar rol de ejecución predeterminado, haga lo siguiente:
-
Amplíe la pestaña y, a continuación, elija Utilizar un rol existente.
-
Seleccione el
LambdaS3Role
que creó anteriormente.
-
-
Seleccione Creación de función.
Para cargar el código de la función (consola)
-
En el panel Código fuente, elija Cargar desde.
-
Elija un archivo .zip.
-
Seleccione Cargar.
-
En el selector de archivos, seleccione un archivo .zip y luego elija Abrir.
-
Seleccione Guardar.
Configurar Amazon S3 para invocar una función

Para que la función de Lambda se ejecute cuando carga una imagen al bucket de origen, debe configurar un desencadenador para la función. Puede configurar el desencadenador de Amazon S3 mediante la consola o la AWS CLI.
importante
Este procedimiento configura el bucket de Amazon S3 para invocar la función cada vez que se crea un objeto en el bucket. Asegúrese de configurar esto solo en el bucket de origen. Si la función de Lambda crea objetos en el mismo bucket que la invoca, la función se puede invocar de forma continua en un bucle
Para configurar el desencadenador de Amazon S3 (consola)
-
Abra la página Funciones
de la consola de Lambda y elija la función ( CreateThumbnail
). -
Elija Add trigger (Añadir disparador).
-
Seleccione S3.
-
En Bucket, seleccione el bucket de origen.
-
En Tipos de eventos, seleccione Todos los eventos de creación de objetos.
-
En Invocación recursiva, marque la casilla de verificación para confirmar que no se recomienda utilizar el mismo bucket de Amazon S3 para la entrada y la salida. Puede obtener más información sobre los patrones de invocación recursiva en Lambda en Patrones recursivos que provocan funciones de Lambda descontroladas
en Serverless Land. -
Elija Agregar.
Al crear un desencadenador mediante la consola de Lambda, Lambda crea automáticamente una política basada en recursos para conceder permiso al servicio que seleccione para invocar la función.
Probar la función de Lambda con un evento de prueba

Antes de probar toda la configuración al agregar un archivo de imagen al bucket de origen de Amazon S3, debe comprobar que la función de Lambda funciona correctamente al invocarla con un evento ficticio. Un evento en Lambda es un documento con formato JSON que contiene datos para que una función los procese. Cuando Amazon S3 invoca la función, el evento enviado a la función contiene información como el nombre del bucket, el ARN del bucket y la clave del objeto.
Para probar la función de Lambda con un evento ficticio (consola)
-
Abra la página Funciones
de la consola de Lambda y elija la función ( CreateThumbnail
). -
Elija la pestaña Prueba.
-
Para crear el evento de prueba, en el panel Evento de prueba, haga lo siguiente:
-
En Acción del evento de prueba, seleccione Crear nuevo evento.
-
En Nombre del evento, escriba
myTestEvent
. -
En Plantilla, seleccione S3 Put.
-
Reemplace los valores de los siguientes parámetros por sus propios valores.
-
En
awsRegion
, reemplaceus-east-1
por la Región de AWS en la que creó el bucket de Amazon S3. -
En
name
, reemplaceamzn-s3-demo-bucket
por el nombre del bucket de origen de Amazon S3. -
En
key
, reemplacetest%2Fkey
por el nombre del objeto de prueba que cargó al bucket de origen en el paso Cargar una imagen de prueba al bucket de origen.
{ "Records": [ { "eventVersion": "2.0", "eventSource": "aws:s3", "awsRegion":
"us-east-1"
, "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":"amzn-s3-demo-bucket"
, "ownerIdentity": { "principalId": "EXAMPLE" }, "arn": "arn:aws:s3:::amzn-s3-demo-bucket" }, "object": { "key":"test%2Fkey"
, "size": 1024, "eTag": "0123456789abcdef0123456789abcdef", "sequencer": "0A1B2C3D4E5F678901" } } } ] } -
-
Seleccione Guardar.
-
-
En el panel Evento de prueba, seleccione Prueba.
-
Para comprobar que la función creó una versión redimensionada de la imagen y la almacenó en el bucket de Amazon S3 de destino, haga lo siguiente:
-
En la consola de Amazon S3, abra la página Buckets
. -
Elija el bucket de destino y confirme que el archivo redimensionado aparezca en el panel Objetos.
-
Probar la función con el desencadenador de Amazon S3

Ahora que confirmó que la función de Lambda se ejecuta correctamente, puede probar toda la configuración al agregar un archivo de imagen al bucket de origen de Amazon S3. Al agregar la imagen al bucket de origen, la función de Lambda se debe invocar automáticamente. La función crea una versión redimensionada del archivo y la almacena en el bucket de destino.
Para probar la función de Lambda mediante el desencadenador de Amazon S3 (consola)
-
Para cargar una imagen en el bucket de Amazon S3, haga lo siguiente:
-
Abra la página Buckets
de la consola de Amazon S3 y elija el bucket de origen. -
Seleccione Cargar.
-
Elija Agregar archivos y utilice el selector de archivos para elegir el archivo de imagen que desea cargar. El objeto de imagen puede ser cualquier archivo .jpg o .png.
-
Elija Abrir y, a continuación, Cargar.
-
-
Compruebe que Lambda haya guardado una versión redimensionada del archivo de imagen en el bucket de destino, de la siguiente manera:
-
Vuelva a la página Buckets
de la consola de Amazon S3 y elija el bucket de destino. -
En el panel Objetos, debería ver dos archivos de imagen redimensionados, uno de cada prueba de la función de Lambda. Para descargar la imagen redimensionada, selecciona el archivo y luego elija Descargar.
-
Eliminación de sus recursos
A menos que desee conservar los recursos que creó para este tutorial, puede eliminarlos ahora. Si elimina los recursos de AWS que ya no utiliza, evitará gastos innecesarios en su Cuenta de AWS.
Cómo eliminar la función de Lambda
-
Abra la página de Funciones
en la consola de Lambda. -
Seleccione la función que ha creado.
-
Elija Acciones, Eliminar.
-
Escriba
confirm
en el campo de entrada de texto y elija Delete (Eliminar).
Para eliminar la política que creó
-
Abra la página de Policies (Políticas)
de la consola de IAM. -
Seleccione la política que creó (AWSLambdas3Policy).
-
Elija Policy actions (Acciones de política), Delete (Eliminar).
-
Elija Delete (Eliminar).
Cómo eliminar el rol de ejecución
-
Abra la página Roles
en la consola de IAM. -
Seleccione el rol de ejecución que creó.
-
Elija Eliminar.
-
Si desea continuar, escriba el nombre del rol en el campo de entrada de texto y elija Delete (Eliminar).
Para eliminar el bucket de S3
-
Abra la consola de Amazon S3
. -
Seleccione el bucket que ha creado.
-
Elija Eliminar.
-
Introduzca el nombre del bucket en el campo de entrada de texto.
-
Elija Delete bucket (Eliminar bucket).