Tutorial: creación de una aplicación de Lambda con Amazon Rekognition - AWS Kit de herramientas con Amazon Q

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: creación de una aplicación de Lambda con Amazon Rekognition

En este tutorial se muestra cómo crear una aplicación de Lambda que utilice Amazon Rekognition para etiquetar objetos de S3 con las etiquetas detectadas.

Para conocer los requisitos previos y obtener información acerca de la configuración de AWS Toolkit for Visual Studio, consulte Uso de las plantillas de AWS Lambda en el Kit de herramientas de AWS para Visual Studio.

Creación de un proyecto Image Rekognition de Lambda con .NET Core

En el siguiente procedimiento se describe cómo crear una aplicación de Lambda de Amazon Rekognition a partir de AWS Toolkit for Visual Studio.

nota

En el momento de su creación, su aplicación tendrá una solución con dos proyectos: el proyecto de origen que contiene el código de la función de Lambda que se implementará en Lambda y un proyecto de prueba que utiliza xUnit para probar la función localmente.

A veces, Visual Studio no puede encontrar todas las referencias de NuGet para sus proyectos. Esto se debe a que los esquemas requieren dependencias que se deben recuperar de NuGet. Cuando se crean nuevos proyectos, Visual Studio solo incorpora las referencias locales y no las referencias remotas de NuGet. Para corregir los errores de NuGet: haga clic con el botón derecho en sus referencias y seleccione Restaurar paquetes.

  1. Desde Visual Studio, expanda el menú Archivo, expanda Nuevo y, a continuación, elija Proyecto.

  2. En el cuadro de diálogo Nuevo proyecto, asegúrese de que los cuadros desplegables Idioma, Plataforma y Tipo de proyecto están definidos en "Todo…" e introduzca aws lambda en el campo Buscar.

  3. Seleccione la plantilla AWS Lambda con pruebas (.NET Core - C#).

  4. Haga clic en Siguiente para abrir el cuadro de diálogo Configurar su nuevo proyecto.

  5. En el cuadro de diálogo Configurar su nuevo proyecto, introduzca “ImageRekognition” para el Nombre y, a continuación, complete los campos restantes según sus preferencias. Pulse el botón Crear para pasar al cuadro de diálogo de Selección de esquemas.

  6. Desde el diálogo Seleccionar esquema, elija el esquema Detectar etiquetas de imágenes y, a continuación, elija Finalizar para crear el proyecto de Visual Studio.

    nota

    Este esquema proporciona código para escuchar los eventos de Amazon S3 y utiliza Amazon Rekognition para detectar etiquetados y añadirlos al objeto de S3 como etiquetas.

Revisión de los archivos del proyecto

En las siguientes secciones, se examinan estos archivos de proyecto:

  1. Function.cs

  2. aws-lambda-tools-defaults.json

1. Function.cs

Dentro del archivo Function.cs, el primer segmento de código es el atributo de ensamblaje, ubicado en la parte superior del archivo. De forma predeterminada, Lambda acepta únicamente parámetros de entrada y tipos devueltos de tipo System.IO.Stream. Debe registrar un serializador para utilizar las clases con tipos para los parámetros de entrada y los tipos devueltos. El atributo de conjunto registra el serializador JSON de Lambda, que utiliza Newtonsoft.Json para convertir secuencias en clases con tipos. Puede definir el serializador en el nivel del conjunto o del método.

A continuación se muestra un ejemplo de conjunto de atributos:

// Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class. [assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]

La clase tiene dos constructores. El primero es un constructor predeterminado que se utiliza cuando Lambda invoca la función. Este constructor crea los clientes de los servicios Amazon S3 y Amazon Rekognition. El constructor también recupera las credenciales de AWS para estos clientes del rol de IAM que se asignó a la función al implementarla. La región de AWS para los clientes se define en la región en la que se está ejecutando la función de Lambda. En este esquema, solo desea añadir etiquetas al objeto de Amazon S3 si el servicio Amazon Rekognition tiene un nivel mínimo de confianza en la etiqueta. Este constructor comprueba la variable de entorno MinConfidence para determinar el nivel de confianza aceptable. Puede configurar esta variable de entorno cuando implemente la función de Lambda.

A continuación, se muestra un ejemplo del constructor de primera clase de Function.cs:

public Function() { this.S3Client = new AmazonS3Client(); this.RekognitionClient = new AmazonRekognitionClient(); var environmentMinConfidence = System.Environment.GetEnvironmentVariable(MIN_CONFIDENCE_ENVIRONMENT_VARIABLE_NAME); if(!string.IsNullOrWhiteSpace(environmentMinConfidence)) { float value; if(float.TryParse(environmentMinConfidence, out value)) { this.MinConfidence = value; Console.WriteLine($"Setting minimum confidence to {this.MinConfidence}"); } else { Console.WriteLine($"Failed to parse value {environmentMinConfidence} for minimum confidence. Reverting back to default of {this.MinConfidence}"); } } else { Console.WriteLine($"Using default minimum confidence of {this.MinConfidence}"); } }

En el ejemplo siguiente se muestra cómo se puede utilizar el segundo constructor para realizar pruebas. El proyecto de prueba configura sus propios clientes de S3 y Rekognition y los transfiere a:

public Function(IAmazonS3 s3Client, IAmazonRekognition rekognitionClient, float minConfidence) { this.S3Client = s3Client; this.RekognitionClient = rekognitionClient; this.MinConfidence = minConfidence; }

En siguiente es un ejemplo del método FunctionHandler que está en el archivo Function.cs.

public async Task FunctionHandler(S3Event input, ILambdaContext context) { foreach(var record in input.Records) { if(!SupportedImageTypes.Contains(Path.GetExtension(record.S3.Object.Key))) { Console.WriteLine($"Object {record.S3.Bucket.Name}:{record.S3.Object.Key} is not a supported image type"); continue; } Console.WriteLine($"Looking for labels in image {record.S3.Bucket.Name}:{record.S3.Object.Key}"); var detectResponses = await this.RekognitionClient.DetectLabelsAsync(new DetectLabelsRequest { MinConfidence = MinConfidence, Image = new Image { S3Object = new Amazon.Rekognition.Model.S3Object { Bucket = record.S3.Bucket.Name, Name = record.S3.Object.Key } } }); var tags = new List(); foreach(var label in detectResponses.Labels) { if(tags.Count < 10) { Console.WriteLine($"\tFound Label {label.Name} with confidence {label.Confidence}"); tags.Add(new Tag { Key = label.Name, Value = label.Confidence.ToString() }); } else { Console.WriteLine($"\tSkipped label {label.Name} with confidence {label.Confidence} because maximum number of tags reached"); } } await this.S3Client.PutObjectTaggingAsync(new PutObjectTaggingRequest { BucketName = record.S3.Bucket.Name, Key = record.S3.Object.Key, Tagging = new Tagging { TagSet = tags } }); } return; }

FunctionHandler es el método al que Lambda llama después de construir la instancia. Observe que el parámetro de entrada es de tipo S3Event y no Stream. Puede hacerlo gracias al serializador JSON de Lambda registrado. El S3Event contiene toda la información acerca del evento activado en S3. La función recorre cíclicamente todos los objetos de S3 que forman parte del evento e indica a Rekognition que detecte etiquetas. Una vez que las etiquetas se han detectado, se añaden como etiquetas al objeto de S3.

nota

El código contiene llamadas a Console.WriteLine(). Cuando la función se ejecuta en Lambda, todas las llamadas a Console.WriteLine() redirigen a Registros de Amazon CloudWatch.

2. aws-lambda-tools-defaults.json

El archivo aws-lambda-tools-defaults.json contiene los valores predeterminados que el esquema ha establecido para rellenar automáticamente algunos de los campos del asistente de implementación. También resulta útil para configurar las opciones de línea de comandos para la integración con la CLI de .NET Core.

Para acceder a la integración de la CLI de .NET Core, navegue hasta el directorio del proyecto de la función y escriba dotnet lambda help.

nota

El controlador de funciones indica a qué método debe llamar Lambda en respuesta a la función invocada. El formato de este campo es: <assembly-name>::<full-type-name>::<method-name>. El espacio de nombres se debe incluir con el nombre del tipo.

Implementación de la función

En el siguiente procedimiento se describe cómo implementar la función de Lambda.

  1. En el Explorador de soluciones, haga clic con el botón derecho en el proyecto de Lambda y seleccione Publicar en AWS Lambda para abrir la ventana Cargar a AWS Lambda.

    nota

    Los valores preestablecidos se recuperan del archivo aws-lambda-tools-defaults.json.

  2. En la ventana Cargar a AWS Lambda, introduzca un nombre en el campo Nombre de la función y, a continuación, pulse el botón Siguiente para acceder a la ventana Detalles avanzados de la función.

    nota

    En este ejemplo se utiliza el Nombre de la función ImageRekognition.

    AWS Lambda function upload interface with package type, runtime, and configuration options.
  3. Desde la ventana Detalles avanzados de la función, seleccione un rol de IAM que conceda al código permiso para obtener acceso a los recursos Amazon S3 y Amazon Rekognition.

    nota

    Si sigue este ejemplo, seleccione el rol AWSLambda_FullAccess.

  4. Establezca la variable de entorno MinConfidence en 60 y, a continuación, seleccione Cargar para iniciar el proceso de implementación. El proceso de publicación finaliza cuando aparece la vista Función en el Explorador de AWS.

    AWS Lambda function configuration interface showing permissions, execution, and environment settings.
  5. Tras una implementación correcta, configure Amazon S3 para que envíe sus eventos a la nueva función desplazándose hasta la pestaña Orígenes de eventos.

  6. En la pestaña Orígenes de eventos, pulse el botón Añadir y, a continuación, seleccione el bucket de Amazon S3 que desee conectar con su función de Lambda.

    nota

    El bucket debe estar en la misma región de AWS que su función de Lambda.

Prueba de la función

Ahora que la función se ha implementado y que se ha configurado un bucket de S3 como origen de eventos para ella, abra el navegador de buckets de S3 desde el Explorador de AWS para el bucket seleccionado. A continuación, cargue algunas imágenes.

Cuando se haya completado la carga, puede confirmar que su función se ha ejecutado comprobando los registros en la vista de la función. O bien, haga clic con el botón derecho del ratón en las imágenes del navegador del bucket y elija Properties (Propiedades). En la pestaña Tags (Etiquetas), puede ver las etiquetas que se han aplicado al objeto.

Properties window showing metadata tags for an image file in a cloud storage bucket.