

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
<a name="lambda-rekognition-example"></a>

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 obtener información sobre los requisitos previos y la configuración de AWS Toolkit for Visual Studio, consulte [Uso de plantillas AWS Lambda en AWS el Toolkit](lambda-index.md) for Visual Studio.

## Creación de un proyecto Image Rekognition de Lambda con .NET Core
<a name="create-a-visual-studio-net-core-lam-image-rekognition-project"></a>

En el siguiente procedimiento se describe cómo crear una aplicación de Lambda de Amazon Rekognition desde el 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 NuGet referencias de sus proyectos. Esto se debe a que los blueprints requieren dependencias de las que hay que recuperar. NuGet Cuando se crean nuevos proyectos, Visual Studio solo extrae referencias locales y no referencias remotas. NuGet Para corregir NuGet errores: haga clic con el botón derecho en las referencias y seleccione **Restaurar paquetes**.

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

1. 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**.

1. Seleccione la plantilla **AWS Lambda con pruebas (.NET Core - C\$1)**.

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

1. En el cuadro de diálogo **Configure su nuevo proyecto**, introduzca ImageRekognition «» como **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**.

1. 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
<a name="examine-the-files"></a>

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

1. `Function.cs`

1. `aws-lambda-tools-defaults.json`

### 1. Function.cs
<a name="functioncs"></a>

Dentro del archivo `Function.cs`, el primer segmento de código es el atributo de ensamblado, 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 AWS credenciales de estos clientes de la función de IAM que se asigna a la función al desplegarla. La AWS región de los clientes se establece en la región en la que se ejecuta la función 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 se `Console.WriteLine()` redirigen a Amazon CloudWatch Logs.

### 2. aws-lambda-tools-defaults.json
<a name="toolsdefaults"></a>

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
<a name="deploy-the-function"></a>

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

1. En la ventana **Cargar en 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.\]](http://docs.aws.amazon.com/es_es/toolkit-for-visual-studio/latest/user-guide/images/lambda-upload-imgrek-03192024.png)

1. 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`.

1. Establezca la variable de entorno `MinConfidence` en 60 y, a continuación, seleccione **Cargar** para iniciar el proceso de implementación. Cuando el proceso de publicación finaliza, aparece la vista **Función** en el **Explorador de AWS **.  
![\[AWS Lambda function configuration interface showing permissions, execution, and environment settings.\]](http://docs.aws.amazon.com/es_es/toolkit-for-visual-studio/latest/user-guide/images/lambda-upload-imgrek-advanced-03192024.png)

1. 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**.

1. 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 depósito debe estar en la misma AWS región que la función Lambda.

## Prueba de la función
<a name="test-the-function"></a>

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.\]](http://docs.aws.amazon.com/es_es/toolkit-for-visual-studio/latest/user-guide/images/lambda-object-properties.png)
