

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.

# Creación de una función de Lambda de Amazon Rekognition
<a name="stored-video-lambda"></a>

En este tutorial, se muestra cómo obtener los resultados de una operación de análisis de vídeo para la detección de etiquetas mediante una función de Lambda en Java. 

**nota**  
En este tutorial se utiliza el AWS SDK for Java 1.x. [Para ver un tutorial sobre el uso de Rekognition y la versión 2 del SDK para AWS Java, consulta AWS el repositorio de ejemplos del SDK de documentación. GitHub ](https://github.com/awsdocs/aws-doc-sdk-examples/tree/master/javav2/usecases/video_analyzer_application)

Puede utilizar las funciones de Lambda con las operaciones de Amazon Rekognition Video. Por ejemplo, el siguiente diagrama muestra un sitio web que utiliza una función de Lambda para comenzar automáticamente el análisis de un vídeo cuando este se carga en un bucket de Amazon S3. Cuando se activa la función Lambda, llama [StartLabelDetection](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_StartLabelDetection.html)para empezar a detectar etiquetas en el vídeo cargado. Para obtener información sobre cómo utilizar Lambda para procesar notificaciones de eventos desde un bucket de Amazon S3, consulte [Uso de AWS Lambda con eventos de Amazon S3](https://docs.aws.amazon.com/lambda/latest/dg/with-s3.html).

Una segunda función de Lambda se activa cuando se envía el estado de realización del análisis al tema de Amazon SNS registrado. La segunda función Lambda llama [GetLabelDetection](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_GetLabelDetection.html)para obtener los resultados del análisis. A continuación, los resultados se almacenan en una base de datos como paso previo antes de mostrarlos en una página web. Esta segunda función lambda es el objetivo de este tutorial.

![Diagrama que muestra un flujo de trabajo de procesamiento de vídeo para Amazon Rekognition Video, desde la carga de un vídeo hasta el almacenamiento de los resultados en Amazon DynamoDB para mostrarlos en un sitio web.](http://docs.aws.amazon.com/es_es/rekognition/latest/dg/images/VideoRekognitionLambda.png)


En este tutorial, la función de Lambda se activa cuando Amazon Rekognition Video envía el estado de realización del análisis de vídeo al tema de Amazon SNS registrado. A continuación, la función recopila los resultados del análisis de vídeo llamando a [GetLabelDetection](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_GetLabelDetection.html). Con fines de demostración, este tutorial escribe los resultados de la detección de etiquetas en un CloudWatch registro. La función de Lambda de la aplicación debería almacenar los resultados del análisis para su uso posterior. Por ejemplo, puede utilizar Amazon DynamoDB para guardar los resultados del análisis. Para obtener más información, consulte el tema relacionado con el [uso de DynamoDB](url-ddb-dev;WorkingWithDynamo.html). 

Los siguientes procedimientos le muestran cómo:
+ Crear el tema de Amazon SNS y configurar los permisos.
+ Cree la función Lambda mediante el tema Amazon SNS Consola de administración de AWS y suscríbala al tema.
+ Configurar la función de Lambda mediante la Consola de administración de AWS.
+ Agregue código de muestra a un AWS Toolkit for Eclipse proyecto y cárguelo en la función Lambda.
+ Probar la función de Lambda mediante la AWS CLI.

**nota**  
Utilice la misma AWS región en todo el tutorial.

## Requisitos previos
<a name="lambda-stored-video-prerequisites"></a>

En este tutorial, se supone que está familiarizado con AWS Toolkit for Eclipse. Para obtener más información, consulte [AWS Toolkit for Eclipse](https://docs.aws.amazon.com/toolkit-for-eclipse/v1/user-guide/welcome.html).

## Creación del tema de SNS
<a name="lambda-create-sns-topic"></a>

El estado de realización de una operación de análisis de vídeo de Amazon Rekognition Video se envía a un tema de Amazon SNS. Este procedimiento crea el tema de Amazon SNS y el rol de servicio de IAM que otorga a Amazon Rekognition Video acceso a los temas de Amazon SNS. Para obtener más información, consulte [Cómo llamar a las operaciones de Amazon Rekognition Video](api-video.md).

**Para crear un tema de Amazon SNS**

1. Si no lo ha hecho aún, cree un rol de servicio de IAM para otorgar a Amazon Rekognition Video acceso a sus temas de Amazon SNS. Anote el nombre de recurso de Amazon (ARN). Para obtener más información, consulte [Otorgar acceso a varios temas de Amazon SNS](api-video-roles.md#api-video-roles-all-topics).

1. [Cree un tema de Amazon SNS](https://docs.aws.amazon.com/sns/latest/dg/CreateTopic.html) mediante la [consola de Amazon SNS](https://console.aws.amazon.com/sns/v2/home). Sólo tiene que especificar el nombre del tema. Añada al nombre del tema un prefijo. *AmazonRekognition* Apunte el ARN del tema. 

## Crear la función de Lambda
<a name="lambda-create-function"></a>

Utilice la función de Lambda para crear la función de Consola de administración de AWS. A continuación, deberá usar un proyecto de AWS Toolkit for Eclipse para subir el paquete de la función de Lambda en AWS Lambda. También es posible crear la función de Lambda con AWS Toolkit for Eclipse. Para obtener más información, consulte [Tutorial: Cómo crear, cargar e invocar una función de AWS Lambda](https://docs.aws.amazon.com/toolkit-for-eclipse/v1/user-guide/lambda-tutorial.html).

**Para crear la función de Lambda**

1. Inicie sesión en la consola de administración de AWS y abra la consola de AWS Lambda en [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/).

1. Elija **Crear función**.

1. Elija **Crear desde cero**.

1. En **Nombre de función**, introduzca un nombre para la función. 

1. En **Tiempo de ejecución**, elija **Java 8**. 

1. Elija **Seleccionar o crear un rol de ejecución**.

1. En **Rol de ejecución**, elija **Crear un nuevo rol con permisos básicos de Lambda**. 

1. Observe el nombre del nuevo rol que se muestra en la parte inferior de la sección **Información básica**.

1. Seleccione **Creación de función**.

## Configuración de la función de Lambda
<a name="lambda-configure-function"></a>

Una vez que haya creado la función de Lambda, puede configurarla para que la active el tema de Amazon SNS que se crea en [Creación del tema de SNS](#lambda-create-sns-topic). También deberá ajustar los requisitos de memoria y el periodo de tiempo de espera para la función de Lambda.

**Para configurar la función de Lambda**

1. En **Código de función**, escriba `com.amazonaws.lambda.demo.JobCompletionHandler` para **Controlador**.

1. En **Configuración básica**, elija **Editar**. Se muestra el cuadro de diálogo **Editar configuración básica**.

   1. Elija **1024** para **Memoria**.

   1. Elija **10** segundos para **Tiempo de espera**.

   1. Seleccione **Save**.

1. En **Diseñador**, elija **\+ Agregar desencadenador**. Se muestra el cuadro de diálogo Agregar desencadenador.

1. En **Configuración de desencadenador** elija **SNS**.

   En **Tema de SNS**, elija el tema de Amazon SNS que creó en [Creación del tema de SNS](#lambda-create-sns-topic).

1. Elija **Activar disparador**.

1. Para añadir el disparador, elija **Añadir**.

1. Elija **Guardar** para guardar la función de Lambda actualizada.

## Configuración del rol de IAM para Lambda
<a name="configure-lambda-role"></a>

Para llamar a Amazon Rekognition Video operations, debe añadir la política gestionada de *AmazonRekognitionFullAccess*AWS a la función Lambda de IAM. Las operaciones de inicio, por ejemplo [StartLabelDetection](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_StartLabelDetection.html), también requieren permisos de pase para el rol de servicio de IAM que Amazon Rekognition Video utiliza para acceder al tema de Amazon SNS.

**Para configurar el rol**

1. Inicie sesión en la consola de IAM Consola de administración de AWS y ábrala en. [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)

1. Seleccione **Roles** en el panel de navegación. 

1. En la lista, elija el nombre del rol de ejecución que ha creado en [Crear la función de Lambda](#lambda-create-function).

1. Elija la pestaña **Permisos**.

1. Seleccione **Asociar políticas**.

1. Elija una *AmazonRekognitionFullAccess*de las políticas de la lista.

1. Elija **Asociar política**.

1. Nuevamente, elija el rol de ejecución. 

1. Elija **Agregar política insertada**.

1. Seleccione la pestaña **JSON**.

1. Reemplace la política existente por la siguiente política. Reemplace `servicerole` por el rol de servicio de IAM; que ha creado en [Creación del tema de SNS](#lambda-create-sns-topic).

1. Elija **Revisar política**.

1. En **Nombre\***, escriba un nombre para la política.

1. Elija **Crear política**.

## Crear el proyecto AWS Toolkit for Eclipse Lambda
<a name="lambda-create-code"></a>

Cuando se activa la función Lambda, el código siguiente obtiene el estado de finalización del tema Amazon SNS y [GetLabelDetection](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_GetLabelDetection.html)llama para obtener los resultados del análisis. Se graba en un registro un recuento de las etiquetas detectadas y una lista de las etiquetas detectadas. CloudWatch La función de Lambda debería almacenar los resultados del análisis de vídeo para su uso posterior.

**Para crear el proyecto AWS Toolkit for Eclipse Lambda**

1. [Cree un proyecto AWS Toolkit for EclipseAWS Lambda](https://docs.aws.amazon.com/toolkit-for-eclipse/v1/user-guide/lambda-tutorial.html#lambda-tutorial-create-handler-class). 
   + En **Nombre del proyecto**, escriba un nombre de proyecto de su elección.
   + Para el **nombre de la clase:**, introduzca *JobCompletionHandler*.
   + En **Tipo de entrada**, elija **Evento de SNS**.
   + Deje el resto de los campos sin modificar. 

1. En el explorador de **proyectos de Eclipse**, abra el método de controlador de Lambda generado (JobCompletionHandler.java) y sustituya el contenido por lo siguiente:

   ```
   //Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved.
   //PDX-License-Identifier: MIT-0 (For details, see https://github.com/awsdocs/amazon-rekognition-developer-guide/blob/master/LICENSE-SAMPLECODE.)
   
   package com.amazonaws.lambda.demo;
   
   import com.amazonaws.services.lambda.runtime.Context;
   import com.amazonaws.services.lambda.runtime.LambdaLogger;
   import com.amazonaws.services.lambda.runtime.RequestHandler;
   import com.amazonaws.services.lambda.runtime.events.SNSEvent;
   import java.util.List;
   import com.amazonaws.regions.Regions;
   import com.amazonaws.services.rekognition.AmazonRekognition;
   import com.amazonaws.services.rekognition.AmazonRekognitionClientBuilder;
   import com.amazonaws.services.rekognition.model.GetLabelDetectionRequest;
   import com.amazonaws.services.rekognition.model.GetLabelDetectionResult;
   import com.amazonaws.services.rekognition.model.LabelDetection;
   import com.amazonaws.services.rekognition.model.LabelDetectionSortBy;
   import com.amazonaws.services.rekognition.model.VideoMetadata;
   import com.fasterxml.jackson.databind.JsonNode;
   import com.fasterxml.jackson.databind.ObjectMapper;
   
   
   
   public class JobCompletionHandler implements RequestHandler<SNSEvent, String> {
   
      @Override
      public String handleRequest(SNSEvent event, Context context) {
   
         String message = event.getRecords().get(0).getSNS().getMessage();
         LambdaLogger logger = context.getLogger(); 
   
         // Parse SNS event for analysis results. Log results
         try {
            ObjectMapper operationResultMapper = new ObjectMapper();
            JsonNode jsonResultTree = operationResultMapper.readTree(message);
            logger.log("Rekognition Video Operation:=========================");
            logger.log("Job id: " + jsonResultTree.get("JobId"));
            logger.log("Status : " + jsonResultTree.get("Status"));
            logger.log("Job tag : " + jsonResultTree.get("JobTag"));
            logger.log("Operation : " + jsonResultTree.get("API"));
   
            if (jsonResultTree.get("API").asText().equals("StartLabelDetection")) {
   
               if (jsonResultTree.get("Status").asText().equals("SUCCEEDED")){
                  GetResultsLabels(jsonResultTree.get("JobId").asText(), context);
               }
               else{
                  String errorMessage = "Video analysis failed for job " 
                        + jsonResultTree.get("JobId") 
                        + "State " + jsonResultTree.get("Status");
                  throw new Exception(errorMessage); 
               }
   
            } else
               logger.log("Operation not StartLabelDetection");
   
         } catch (Exception e) {
            logger.log("Error: " + e.getMessage());
            throw new RuntimeException (e);
   
   
         }
   
         return message;
      }
   
      void GetResultsLabels(String startJobId, Context context) throws Exception {
   
         LambdaLogger logger = context.getLogger();
   
         AmazonRekognition rek = AmazonRekognitionClientBuilder.standard().withRegion(Regions.US_EAST_1).build();
   
         int maxResults = 1000;
         String paginationToken = null;
         GetLabelDetectionResult labelDetectionResult = null;
         String labels = "";
         Integer labelsCount = 0;
         String label = "";
         String currentLabel = "";
        
         //Get label detection results and log them. 
         do {
   
            GetLabelDetectionRequest labelDetectionRequest = new GetLabelDetectionRequest().withJobId(startJobId)
                  .withSortBy(LabelDetectionSortBy.NAME).withMaxResults(maxResults).withNextToken(paginationToken);
   
            labelDetectionResult = rek.getLabelDetection(labelDetectionRequest);
            
            paginationToken = labelDetectionResult.getNextToken();
            VideoMetadata videoMetaData = labelDetectionResult.getVideoMetadata();
   
            // Add labels to log
            List<LabelDetection> detectedLabels = labelDetectionResult.getLabels();
            
            for (LabelDetection detectedLabel : detectedLabels) {
               label = detectedLabel.getLabel().getName();
               if (label.equals(currentLabel)) {
                  continue;
               }
               labels = labels + label + " / ";
               currentLabel = label;
               labelsCount++;
   
            }
         } while (labelDetectionResult != null && labelDetectionResult.getNextToken() != null);
   
         logger.log("Total number of labels : " + labelsCount);
         logger.log("labels : " + labels);
   
      }
   
   
   }
   ```

1. Los espacios de nombres de Rekognition no se resuelven. Para corregirlo:
   + Detenga el ratón sobre la parte subrayada de la línea `import com.amazonaws.services.rekognition.AmazonRekognition;`. 
   + Elija **Corregir configuración del proyecto...**.
   + Elija la versión más reciente del archivo de Amazon Rekognition.
   + Elija **Aceptar** para añadir el archivo al proyecto.

1. Guarde el archivo.

1. Haga clic con el botón derecho en la ventana de código de Eclipse, elija **AWS Lambda** y, a continuación, elija **Cargar función a AWS Lambda**. 

1. En la página **Seleccionar función de Lambda de destino**, elija la región de AWS que desea utilizar. 

1. Elija **Elegir una función de Lambda existente** y seleccione la función de Lambda que ha creado en [Crear la función de Lambda](#lambda-create-function). 

1. Elija **Siguiente**. Se muestra el cuadro de diálogo **Configuración de función**. 

1. En **Rol de IAM**, elija el rol de IAM que creó en [Crear la función de Lambda](#lambda-create-function).

1. Elija **Finalizar** y la función de Lambda se subirá en AWS.

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

Utilice el siguiente AWS CLI comando para probar la función Lambda iniciando el análisis de detección de etiquetas de un vídeo. Una vez finalizado el análisis, la función de Lambda se activa. Compruebe que el análisis se ha realizado correctamente comprobando los CloudWatch registros.

**Para probar la función de Lambda**

1. Cargue un archivo de vídeo con formato MOV o MPEG-4 en el bucket de S3. Para realizar pruebas, cargue un vídeo con una duración inferior a 30 segundos.

   Para ver las instrucciones, consulte [Carga de objetos en Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UploadingObjectsintoAmazonS3.html) en la *Guía del usuario de Amazon Simple Storage Service*.

1. Ejecute el siguiente AWS CLI comando para empezar a detectar etiquetas en un vídeo.

   ```
   aws rekognition start-label-detection --video "S3Object={Bucket="{{bucketname}}",Name="{{videofile}}"}" \
   --notification-channel "SNSTopicArn={{TopicARN}},RoleArn={{RoleARN}}" \
   --region {{Region}}
   ```

   Actualice los siguientes valores:
   + Cambie `bucketname` y `videofile` en el nombre de bucket de Amazon S3 y nombre de archivo del vídeo donde desea detectar etiquetas.
   + Reemplace `TopicARN` por el ARN del tema de Amazon SNS que ha creado en [Creación del tema de SNS](#lambda-create-sns-topic).
   + Reemplace `RoleARN` por el ARN del rol de IAM que ha creado en [Creación del tema de SNS](#lambda-create-sns-topic).
   + Cambie `Region` a la AWS región que esté utilizando. ``

1. Anote el valor de `JobId` en la respuesta. La respuesta tiene un aspecto similar a la del siguiente ejemplo JSON.

   ```
   {
       "JobId": "547089ce5b9a8a0e7831afa655f42e5d7b5c838553f1a584bf350ennnnnnnnnn"
   }
   ```

1. Abra la consola de [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/). 

1. Cuando finalice el análisis, aparecerá una entrada de log para la función de Lambda en el **Grupo de registro**.

1. Elija la función de Lambda para ver los flujos de registro.

1. Elija el flujo de logs más reciente para ver las entradas de log realizadas por la función de Lambda. Si la operación se realizó correctamente, tendrá un aspecto similar al siguiente resultado, que muestra los detalles de la operación de reconocimiento de vídeo, incluido el identificador del trabajo, el tipo de operación StartLabelDetection "» y una lista de categorías de etiquetas detectadas, como Botella, Ropa, Multitud y Comida:  
![Salida de registro que muestra los detalles de una operación de reconocimiento de vídeo.](http://docs.aws.amazon.com/es_es/rekognition/latest/dg/images/log.png)

   El valor de **ID de trabajo** debería coincidir con el valor de `JobId` que anotó en el paso 3.