Tutorial: Uso de un desencadenador de Amazon S3 para crear imágenes en miniatura - AWS Lambda

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Tutorial: Uso de un desencadenador de Amazon S3 para crear imágenes en miniatura

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.


      Diagrama que muestra el flujo de datos entre un bucket de Amazon S3, una función de Lambda y otro bucket de Amazon S3

Para completar este tutorial, lleve a cabo los siguientes pasos:

  1. Cree buckets de origen y destino de Amazon S3 y cargue una imagen de muestra.

  2. Cree una función de Lambda que cambie el tamaño de una imagen y genere una miniatura en un bucket de Amazon S3.

  3. Configure un desencadenador de Lambda que invoque la función cuando se carguen objetos en el bucket de origen.

  4. 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.

Requisitos previos

Si no dispone de una Cuenta de AWS, siga estos pasos para crear una.

Cómo registrarse para una Cuenta de AWS
  1. Abra https://portal.aws.amazon.com/billing/signup.

  2. Siga las instrucciones que se le indiquen.

    Parte del procedimiento de registro consiste en recibir una llamada telefónica e indicar un código de verificación en el teclado del teléfono.

    Al registrarse en una Cuenta de AWS, se crea un Usuario raíz de la cuenta de AWS. El usuario raíz tendrá acceso a todos los Servicios de AWS y recursos de esa cuenta. Como práctica recomendada de seguridad, asigne acceso administrativo a un usuario administrativo y utilice únicamente el usuario raíz para realizar tareas que requieran acceso de usuario raíz.

AWS le enviará un correo electrónico de confirmación después de completar el proceso de registro. Puede ver la actividad de la cuenta y administrar la cuenta en cualquier momento entrando en https://aws.amazon.com/ y seleccionando Mi cuenta.

Después de registrarse para obtener una Cuenta de AWS, proteja su Usuario raíz de la cuenta de AWS, habilite AWS IAM Identity Center y cree un usuario administrativo para no utilizar el usuario raíz en las tareas cotidianas.

Protección de su Usuario raíz de la cuenta de AWS
  1. Inicie sesión en AWS Management Console como propietario de cuenta eligiendo Usuario raíz e introduzca el correo electrónico de su Cuenta de AWS. En la siguiente página, escriba su contraseña.

    Para obtener ayuda para iniciar sesión con el usuario raíz, consulte Iniciar sesión como usuario raíz en la Guía del usuario de AWS Sign-In.

  2. Active la autenticación multifactor (MFA) para el usuario raíz.

    Para obtener instrucciones, consulte Habilitar un dispositivo MFA virtual para el usuario raíz Cuenta de AWS (consola) en la Guía del usuario de IAM.

Creación de un usuario administrativo
  1. Activar IAM Identity Center

    Para conocer las instrucciones, consulte Habilitar AWS IAM Identity Center en la Guía del usuario de AWS IAM Identity Center.

  2. En IAM Identity Center, otorga acceso administrativo a un usuario administrativo.

    Para ver un tutorial sobre el uso de Directorio de IAM Identity Center como origen de identidad, consulte Configurar el acceso de los usuarios con la configuración predeterminada de Directorio de IAM Identity Center en la Guía del usuario de AWS IAM Identity Center.

Cómo iniciar sesión como usuario administrativo
  • Para iniciar sesión con el usuario del Centro de identidades de IAM, utilice la URL de inicio de sesión que se envió a la dirección de correo electrónico cuando creó el usuario del IAM Identity Center.

    Para obtener ayuda para iniciar sesión con un usuario del IAM Identity Center, consulte Iniciar sesión en el portal de acceso de AWS en la Guía del usuario de AWS Sign-In.

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.

Crear dos buckets de Amazon S3


        Diagrama de flujo de trabajo del tutorial que muestra que se encuentra creando el bucket en el paso del bucket 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.

AWS Management Console
Para crear buckets de Amazon S3 (consola)
  1. En la consola de Amazon S3, abra la página Buckets.

  2. Elija Crear bucket.

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

    1. 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 (-).

    2. Para Región de AWS, elija la Región de AWS más cercana a su ubicación geográfica. Más adelante en el tutorial, debe crear la función de Lambda en la misma Región de AWS, por lo que debe anotar la región que eligió.

  4. Deje el resto de las opciones con sus valores predeterminados y seleccione Crear bucket.

  5. Repita los pasos 1 a 4 para crear el bucket de destino. En Nombre del bucket, introduzca SOURCEBUCKET-resized, donde SOURCEBUCKET es el nombre del bucket de origen que acaba de crear.

AWS CLI
Para crear buckets de Amazon S3 (AWS CLI)
  1. Ejecute el siguiente comando de la CLI para crear el bucket de origen. El nombre que elija para el bucket debe ser globalmente único y seguir las reglas de nomenclatura de buckets de Amazon S3. Los nombres pueden contener únicamente letras minúsculas, números, puntos (.) y guiones (-). Para region y LocationConstraint, elija la Región de AWS más cercana a su ubicación geográfica.

    aws s3api create-bucket --bucket SOURCEBUCKET --region us-west-2 \ --create-bucket-configuration LocationConstraint=us-west-2

    Más adelante en el tutorial, debe crear la función de Lambda en la misma Región de AWS que la del bucket de origen, por lo que debe anotar la región que eligió.

  2. Ejecute el siguiente comando para crear el bucket de destino. Para el nombre del bucket, debe utilizar SOURCEBUCKET-resized, donde SOURCEBUCKET es el nombre del bucket de origen que creó en el paso 1. Para region y LocationConstraint, elija la misma Región de AWS que usó para crear el bucket de origen.

    aws s3api create-bucket --bucket SOURCEBUCKET-resized --region us-west-2 \ --create-bucket-configuration LocationConstraint=us-west-2

Cargar una imagen de prueba al bucket de origen


        Diagrama de flujo de trabajo del tutorial que muestra que se encuentra cargando un objeto de prueba en el paso del bucket de Amazon S3

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.

AWS Management Console
Para cargar una imagen de prueba al bucket de origen (consola)
  1. En la consola de Amazon S3, abra la página Buckets.

  2. Seleccione el bucket de origen que creó en el paso anterior.

  3. Seleccione Cargar.

  4. Elija Agregar archivos y utilice el selector de archivos para elegir el objeto que desea cargar.

  5. Elija Abrir y, a continuación, Cargar.

AWS CLI
Para cargar una imagen de prueba al bucket de origen (AWS CLI)
  • Desde el directorio que contiene la imagen que desea cargar, ejecute el siguiente comando de la CLI. Reemplace el parámetro --bucket con el nombre del bucket de origen. Para los parámetros --key y --body, utilice el nombre de archivo de la imagen de prueba.

    aws s3api put-object --bucket SOURCEBUCKET --key HappyFace.jpg --body ./HappyFace.jpg

Crear una política de permisos


        Diagrama de flujo de trabajo del tutorial que muestra que está en el paso de la función de Lambda de 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 otorga permisos de lectura y escritura a Lambda para los buckets de Amazon S3 y le permite escribir en Amazon Logs. CloudWatch

AWS Management Console
Para crear la política (consola)
  1. Abra la página de Policies (Políticas) de la consola AWS Identity and Access Management (IAM).

  2. Elija Crear política.

  3. 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:::*/*" } ] }
  4. Seleccione Siguiente.

  5. En Detalles de política, para el Nombre de la política, ingrese LambdaS3Policy.

  6. Elija Crear política.

AWS CLI
Para crear la política (AWS CLI)
  1. Guarde el siguiente JSON en un archivo llamado policy.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:::*/*" } ] }
  2. Desde el directorio en el que guardó el documento de política JSON, ejecute el siguiente comando de la CLI.

    aws iam create-policy --policy-name LambdaS3Policy --policy-document file://policy.json

Creación de un rol de ejecución


        Diagrama de flujo de trabajo del tutorial que muestra que se encuentra en el paso de la función de Lambda de 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.

AWS Management Console
Para crear un rol de ejecución y adjuntar la política de permisos (consola)
  1. Abra la página Roles en la consola (IAM).

  2. Elija Crear rol.

  3. En Tipo de entidad de confianza, seleccione el Servicio de AWS; en Caso de uso, seleccione Lambda.

  4. Seleccione Siguiente.

  5. Agregue la política de permisos que creó en el paso anterior de la siguiente manera:

    1. En el cuadro de búsqueda de políticas, escriba LambdaS3Policy.

    2. En los resultados de búsqueda, seleccione la casilla de verificación para LambdaS3Policy.

    3. Seleccione Siguiente.

  6. En Detalles del rol, para el Nombre del rol, ingrese LambdaS3Role.

  7. Elija Crear rol.

AWS CLI
Para crear un rol de ejecución y adjuntar la política de permisos (AWS CLI)
  1. Guarde el siguiente JSON en un archivo llamado trust-policy.json. Esta política de confianza permite a Lambda utilizar los permisos del rol al dar permiso al servicio principal lambda.amazonaws.com para llamar a la acción de AWS Security Token Service (AWS STS) AssumeRole.

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
  2. Desde el directorio en el que guardó el documento de política de confianza JSON, ejecute el siguiente comando de la CLI para crear el rol de ejecución.

    aws iam create-role --role-name LambdaS3Role --assume-role-policy-document file://trust-policy.json
  3. Para adjuntar la política de permisos que creó en el paso anterior, ejecute el siguiente comando de la CLI. Reemplace el número de Cuenta de AWS en el ARN de la política por su propio número de cuenta.

    aws iam attach-role-policy --role-name LambdaS3Role --policy-arn arn:aws:iam::123456789012:policy/LambdaS3Policy

Crear el paquete de despliegue de la función


        Diagrama de flujo de trabajo del tutorial que muestra que se encuentra en el paso de la función de Lambda de creación del paquete de despliegue

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.

Node.js
Para crear el paquete de despliegue (Node.js)
  1. 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
  2. Guarde el siguiente código de función en un archivo llamado index.mjs. Asegúrese de 'us-west-2' reemplazarlos por aquellos Región de AWS en los 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-west-2'}); // 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); };
  3. 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 directorio node_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
  4. 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 directorio node_modules estén todos en la raíz del archivo .zip.

Python
Para crear el paquete de despliegue (Python)
  1. Guarde el código de ejemplo como un archivo denominado lambda_function.py.

    import boto3 import os import sys import uuid from urllib.parse import unquote_plus from PIL import Image import PIL.Image s3_client = boto3.client('s3') def resize_image(image_path, resized_path): with Image.open(image_path) as image: image.thumbnail(tuple(x / 2 for x in image.size)) image.save(resized_path) def lambda_handler(event, context): for record in event['Records']: bucket = record['s3']['bucket']['name'] key = unquote_plus(record['s3']['object']['key']) tmpkey = key.replace('/', '') download_path = '/tmp/{}{}'.format(uuid.uuid4(), tmpkey) upload_path = '/tmp/resized-{}'.format(tmpkey) s3_client.download_file(bucket, key, download_path) resize_image(download_path, upload_path) s3_client.upload_file(upload_path, '{}-resized'.format(bucket), 'resized-{}'.format(key))
  2. En el mismo directorio en el que creó el archivo lambda_function.py, cree un nuevo directorio llamado package e instale la biblioteca Pillow (PIL) y AWS SDK for Python (Boto3). Si bien el tiempo de ejecución de Lambda Python incluye una versión del SDK Boto3, recomendamos agregar todas las dependencias de la función al paquete de despliegue, incluso si están incluidas en el tiempo de ejecución. Para obtener más información, consulte Dependencias del tiempo de ejecución en Python.

    mkdir package pip install \ --platform manylinux2014_x86_64 \ --target=package \ --implementation cp \ --python-version 3.9 \ --only-binary=:all: --upgrade \ pillow boto3

    La biblioteca Pillow contiene código C y C++. Al utilizar las opciones --platform manylinux_2014_x86_64 y --only-binary=:all:, pip descargará e instalará una versión de Pillow que contiene archivos binarios precompilados compatibles con el sistema operativo Amazon Linux 2. Esto garantiza que el paquete de implementación funcione en el entorno de ejecución de Lambda, independientemente del sistema operativo y la arquitectura del equipo de compilación local.

  3. Cree un archivo .zip que contenga el código de la aplicación y las bibliotecas Pillow y Boto3. En Linux o macOS, ejecute los siguientes comandos desde la interfaz de la línea de comandos.

    cd package zip -r ../lambda_function.zip . cd .. zip lambda_function.zip lambda_function.py

    En Windows, utilice la herramienta de compresión que prefiera para crear el archivo lambda_function.zip. Asegúrese de que el archivo lambda_function.py y las carpetas que contienen las dependencias estén en la raíz del archivo .zip.

También puede crear su paquete de implementación mediante un entorno virtual de Python. Consulte Uso de archivos .zip para funciones de Lambda en Python

Crear la función de Lambda


        Diagrama de flujo de trabajo del tutorial que muestra que se encuentra creando la función en el paso de 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.

AWS Management Console
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.

  1. Abra la página de Funciones en la consola de Lambda.

  2. 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.

    
              Imagen que muestra el menú desplegable de regiones en la consola de Lambda
  3. Elija Crear función.

  4. Elija Author from scratch (Crear desde cero).

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

    1. En Function name (Nombre de la función), introduzca CreateThumbnail.

    2. Para el Tiempo de ejecución, elija Node.js 18.x o Python 3.9, según el lenguaje elegido para la función.

    3. En Arquitectura, elija x86_64.

  6. En la pestaña Cambiar rol de ejecución predeterminado, haga lo siguiente:

    1. Amplíe la pestaña y, a continuación, elija Utilizar un rol existente.

    2. Seleccione el LambdaS3Role que creó anteriormente.

  7. Elija Crear función.

Para cargar el código de la función (consola)
  1. En el panel Código fuente, elija Cargar desde.

  2. Elija un archivo .zip.

  3. Seleccione Cargar.

  4. En el selector de archivos, seleccione un archivo .zip y luego elija Abrir.

  5. Seleccione Guardar.

AWS CLI
Para crear la función (AWS CLI)
  • Ejecute el comando de CLI para el lenguaje elegido. En el parámetro role, asegúrese de reemplazar 123456789012 por el ID de la Cuenta de AWS. En el parámetro region, reemplace us-west-2 por la región en la que creó los buckets de Amazon S3.

    • Para Node.js, ejecute el siguiente comando desde el directorio que contiene el archivo function.zip.

      aws lambda create-function --function-name CreateThumbnail \ --zip-file fileb://function.zip --handler index.handler --runtime nodejs18.x \ --timeout 10 --memory-size 1024 \ --role arn:aws:iam::123456789012:role/LambdaS3Role --region us-west-2
    • Para Python, ejecute el siguiente comando desde el directorio que contiene el archivo lambda_function.zip.

      aws lambda create-function --function-name CreateThumbnail \ --zip-file fileb://lambda_function.zip --handler lambda_function.lambda_handler \ --runtime python3.9 --timeout 10 --memory-size 1024 \ --role arn:aws:iam::123456789012:role/LambdaS3Role --region us-west-2

Configurar Amazon S3 para invocar una función


        Diagrama de flujo de trabajo del tutorial que muestra que se encuentra en el paso de creación del desencadenador de Amazon S3

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. Esto puede provocar que se facturen cargos imprevistos en su Cuenta de AWS.

AWS Management Console
Para configurar el desencadenador de Amazon S3 (consola)
  1. Abra la página Funciones de la consola de Lambda y elija la función (CreateThumbnail).

  2. Elija Add trigger (Añadir disparador).

  3. Seleccione S3.

  4. En Bucket, seleccione el bucket de origen.

  5. En Tipos de eventos, seleccione Todos los eventos de creación de objetos.

  6. 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.

  7. Elija Añadir.

    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.

AWS CLI
Para configurar el desencadenador de Amazon S3 (AWS CLI)
  1. Para que el bucket de origen de Amazon S3 invoque la función al agregar un archivo de imagen, primero debe configurar los permisos de la función mediante una política basada en recursos. Una instrucción de política basada en recursos concede permisos a otros Servicios de AWS para invocar la función. Para conceder permisos a Amazon S3 para invocar la función, ejecute el siguiente comando de la CLI. Asegúrese de reemplazar el parámetro source-account por su propio ID de Cuenta de AWS y de utilizar su propio nombre de bucket de origen.

    aws lambda add-permission --function-name CreateThumbnail \ --principal s3.amazonaws.com --statement-id s3invoke --action "lambda:InvokeFunction" \ --source-arn arn:aws:s3:::SOURCEBUCKET \ --source-account 123456789012

    La política que defina con este comando permite a Amazon S3 invocar la función solo cuando se lleva a cabo una acción en el bucket de origen.

    nota

    Si bien los nombres de los buckets de Amazon S3 son globalmente únicos, cuando se utilizan políticas basadas en recursos, se recomienda aclarar que el bucket debe pertenecer a la cuenta. Esto sucede porque si elimina un bucket, es posible que otra Cuenta de AWS cree un bucket con el mismo Nombre de recurso de Amazon (ARN).

  2. Guarde el siguiente JSON en un archivo llamado notification.json. Cuando se aplica al bucket de origen, este JSON configura el bucket para enviar una notificación a la función de Lambda cada vez que se agrega un objeto nuevo. Reemplace el número de Cuenta de AWS y la Región de AWS en el ARN de la función de Lambda por su número de cuenta y su región.

    { "LambdaFunctionConfigurations": [ { "Id": "CreateThumbnailEventConfiguration", "LambdaFunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:CreateThumbnail", "Events": [ "s3:ObjectCreated:Put" ] } ] }
  3. Ejecute el siguiente comando de la CLI para aplicar la configuración de notificación del archivo JSON que creó al bucket de origen. Reemplace SOURCEBUCKET por el nombre del bucket de origen.

    aws s3api put-bucket-notification-configuration --bucket SOURCEBUCKET \ --notification-configuration file://notification.json

    Para obtener más información sobre el put-bucket-notification-configuration comando y la notification-configuration opción, consulte la Referencia put-bucket-notification-configurationde comandos de la AWS CLI.

Probar la función de Lambda con un evento de prueba


        Diagrama de flujo de trabajo del tutorial que muestra que se encuentra en el paso de prueba de un evento ficticio

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.

AWS Management Console
Para probar la función de Lambda con un evento ficticio (consola)
  1. Abra la página Funciones de la consola de Lambda y elija la función (CreateThumbnail).

  2. Elija la pestaña Prueba.

  3. Para crear el evento de prueba, en el panel Evento de prueba, haga lo siguiente:

    1. En Acción del evento de prueba, seleccione Crear nuevo evento.

    2. En Nombre del evento, escriba myTestEvent.

    3. En Plantilla, seleccione S3 Put.

    4. Reemplace los valores de los siguientes parámetros por sus propios valores.

      • En awsRegion, reemplace us-east-1 por la Región de AWS en la que creó el bucket de Amazon S3.

      • En name, reemplace example-bucket por el nombre del bucket de origen de Amazon S3.

      • En key, reemplace test%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": "example-bucket", "ownerIdentity": { "principalId": "EXAMPLE" }, "arn": "arn:aws:s3:::example-bucket" }, "object": { "key": "test%2Fkey", "size": 1024, "eTag": "0123456789abcdef0123456789abcdef", "sequencer": "0A1B2C3D4E5F678901" } } } ] }
    5. Seleccione Guardar.

  4. En el panel Evento de prueba, seleccione Prueba.

  5. 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:

    1. En la consola de Amazon S3, abra la página Buckets.

    2. Elija el bucket de destino y confirme que el archivo redimensionado aparezca en el panel Objetos.

AWS CLI
Para probar la función de Lambda con un evento ficticio (AWS CLI)
  1. Guarde el siguiente JSON en un archivo llamado dummyS3Event.json. Reemplace los valores de los siguientes parámetros por sus propios valores:

    1. En awsRegion, reemplace us-west-2 por la Región de AWS en la que creó el bucket de Amazon S3.

    2. En name, reemplace SOURCEBUCKET por el nombre del bucket de origen de Amazon S3.

    3. En key, reemplace HappyFace.jpg 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-west-2", "eventTime":"1970-01-01T00:00:00.000Z", "eventName":"ObjectCreated:Put", "userIdentity":{ "principalId":"AIDAJDPLRKLG7UEXAMPLE" }, "requestParameters":{ "sourceIPAddress":"127.0.0.1" }, "responseElements":{ "x-amz-request-id":"C3D13FE58DE4C810", "x-amz-id-2":"FMyUVURIY8/IgAtTv8xRjskZQpcIZ9KG4V5Wp6S7S/JRWeUWerMUE5JgHvANOjpD" }, "s3":{ "s3SchemaVersion":"1.0", "configurationId":"testConfigRule", "bucket":{ "name":"SOURCEBUCKET", "ownerIdentity":{ "principalId":"A3NL1KOZZKExample" }, "arn":"arn:aws:s3:::SOURCEBUCKET" }, "object":{ "key":"HappyFace.jpg", "size":1024, "eTag":"d41d8cd98f00b204e9800998ecf8427e", "versionId":"096fKKXTRTtl3on89fVO.nfljtsv6qko" } } } ] }
  2. Desde el directorio en el que guardó el archivo dummyS3Event.json, invoque la función mediante la ejecución del siguiente comando de la CLI. Este comando invoca la función de Lambda de forma sincrónica al definir RequestResponse como valor del parámetro de tipo de invocación. Para obtener más información sobre la invocación sincrónica y asíncrona, consulte Invocación de funciones de Lambda.

    aws lambda invoke --function-name CreateThumbnail \ --invocation-type RequestResponse --cli-binary-format raw-in-base64-out \ --payload file://dummyS3Event.json outputfile.txt

    La cli-binary-format opción es obligatoria si utiliza la versión 2 deAWS CLI. Para que esta sea la configuración predeterminada, ejecute aws configure set cli-binary-format raw-in-base64-out. Para obtener más información, consulte las opciones globales de la línea de comandos admitidas de AWS CLI.

  3. Compruebe que la función haya creado una versión en miniatura de la imagen y la haya guardado en el bucket de Amazon S3 de destino. Ejecute el siguiente comando de la CLI, para ello reemplace SOURCEBUCKET-resized por el nombre del bucket de destino.

    aws s3api list-objects-v2 --bucket SOURCEBUCKET-resized

    Debería ver un resultado similar a este. El parámetro Key muestra el nombre del archivo de imagen redimensionado.

    { "Contents": [ { "Key": "resized-HappyFace.jpg", "LastModified": "2023-06-06T21:40:07+00:00", "ETag": "\"d8ca652ffe83ba6b721ffc20d9d7174a\"", "Size": 2633, "StorageClass": "STANDARD" } ] }

Probar la función con el desencadenador de Amazon S3


        Diagrama de flujo de trabajo del tutorial que muestra que se encuentra en el paso de prueba de carga de un archivo a 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.

AWS Management Console
Para probar la función de Lambda mediante el desencadenador de Amazon S3 (consola)
  1. Para cargar una imagen en el bucket de Amazon S3, haga lo siguiente:

    1. Abra la página Buckets de la consola de Amazon S3 y elija el bucket de origen.

    2. Seleccione Cargar.

    3. 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.

    4. Elija Abrir y, a continuación, Cargar.

  2. Compruebe que Lambda haya guardado una versión redimensionada del archivo de imagen en el bucket de destino, de la siguiente manera:

    1. Vuelva a la página Buckets de la consola de Amazon S3 y elija el bucket de destino.

    2. 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.

AWS CLI
Para probar la función de Lambda mediante el desencadenador de Amazon S3 (AWS CLI)
  1. Desde el directorio que contiene la imagen que desea cargar, ejecute el siguiente comando de la CLI. Reemplace el parámetro --bucket con el nombre del bucket de origen. Para los parámetros --key y --body, utilice el nombre de archivo de la imagen de prueba. La imagen de prueba puede ser cualquier archivo .jpg o .png.

    aws s3api put-object --bucket SOURCEBUCKET --key SmileyFace.jpg --body ./SmileyFace.jpg
  2. Compruebe que la función haya creado una versión en miniatura de la imagen y la haya guardado en el bucket de Amazon S3 de destino. Ejecute el siguiente comando de la CLI, para ello reemplace SOURCEBUCKET-resized por el nombre del bucket de destino.

    aws s3api list-objects-v2 --bucket SOURCEBUCKET-resized

    Si la función se ejecuta correctamente, verá un resultado similar al siguiente. El bucket de destino ahora debería contener dos archivos redimensionados.

    { "Contents": [ { "Key": "resized-HappyFace.jpg", "LastModified": "2023-06-07T00:15:50+00:00", "ETag": "\"7781a43e765a8301713f533d70968a1e\"", "Size": 2763, "StorageClass": "STANDARD" }, { "Key": "resized-SmileyFace.jpg", "LastModified": "2023-06-07T00:13:18+00:00", "ETag": "\"ca536e5a1b9e32b22cd549e18792cdbc\"", "Size": 1245, "StorageClass": "STANDARD" } ] }

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
  1. Abra la página de Funciones en la consola de Lambda.

  2. Seleccione la función que ha creado.

  3. Elija Acciones, Eliminar.

  4. Escriba delete en el campo de entrada de texto y elija Delete (Eliminar).

Para eliminar la política que creó
  1. Abra la página de Policies (Políticas) de la consola de IAM.

  2. Seleccione la política que creó (AWSLambdaS3Policy).

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

  4. Elija Delete (Eliminar).

Cómo eliminar el rol de ejecución
  1. Abra la página Roles en la consola de IAM.

  2. Seleccione el rol de ejecución que creó.

  3. Elija Eliminar.

  4. 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
  1. Abra la consola de Amazon S3.

  2. Seleccione el bucket que ha creado.

  3. Elija Eliminar.

  4. Introduzca el nombre del bucket en el campo de entrada de texto.

  5. Elija Delete bucket (Eliminar bucket).