

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.

# Análisis de imágenes con una AWS Lambda función
<a name="ex-lambda"></a>

AWS Lambda es un servicio informático que le permite ejecutar código sin aprovisionar ni administrar servidores. Por ejemplo, puede analizar las imágenes enviadas desde una aplicación móvil sin tener que crear un servidor para alojar el código de la aplicación. En las instrucciones siguientes se explica cómo crear una función de Lambda en Python que llame a [DetectCustomLabels](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_DetectCustomLabels). La función analiza una imagen facilitada y devuelve una lista con las etiquetas que se encuentran en la imagen. Las instrucciones incluyen un ejemplo de código Python que indica cómo llamar a la función de Lambda con la imagen de un bucket de Amazon S3 o una imagen sacada de un ordenador local. 

**Topics**
+ [Paso 1: Crear una AWS Lambda función (consola)](#example-lambda-create-function)
+ [Paso 2: (opcional) Crear una capa (consola)](#example-lambda-create-layer)
+ [Paso 3: Añadir código de Python (consola)](#example-lambda-add-code)
+ [Paso 4: Probar la función de Lambda](#example-lambda-test)

## Paso 1: Crear una AWS Lambda función (consola)
<a name="example-lambda-create-function"></a>

En este paso, se crea una AWS función vacía y una función de ejecución de IAM que permite a la función llamar a la `DetectCustomLabels` operación. También da acceso al bucket de Amazon S3 que almacena imágenes para su análisis. También puede indicar variables de entorno para lo siguiente:
+ El modelo de Etiquetas personalizadas de Amazon Rekognition para el que desea usar la función de Lambda.
+ El límite de confianza que desea que utilice el modelo.

Más adelante, añada el código fuente y, si lo desea, una capa a la función de Lambda.

**Para crear una AWS Lambda función (consola)**

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

1. Seleccione **Creación de función**. Para obtener más información, consulte [Crear una función de Lambda con la consola](https://docs.aws.amazon.com/lambda/latest/dg/getting-started-create-function.html).

1. Elija las siguientes opciones.
   + Elija **Crear desde cero**. 
   + Introduzca un valor en **Nombre de función**.
   + En **Tiempo de ejecución**, elija **Python 3.10**.

1. Elija **Crear función** para crear la función AWS Lambda .

1. En la página de la función, seleccione la pestaña **Configuración**.

1. En el panel **Variables de entorno**, elija **Editar**.

1. Añada las siguientes variables de entorno. En cada variable, elija **Añadir variable de entorno** y luego introduzca la clave y el valor de la variable.     
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/rekognition/latest/customlabels-dg/ex-lambda.html)

1. Elija **Guardar** para guardar las variables de entorno.

1. En el panel **Permisos**, en **Nombre del rol**, elija el rol de ejecución para abrir el rol en la consola de IAM.

1. En la pestaña **Permisos**, elija **Agregar permisos** y después **Crear política insertada**.

1. Elija **JSON** y reemplace la política existente por la siguiente política.

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Action": "rekognition:DetectCustomLabels",
               "Resource": "*",
               "Effect": "Allow",
               "Sid": "DetectCustomLabels"
           }
       ]
   }
   ```

------

1. Elija **Siguiente**.

1. En **Detalles de la política**, introduce un nombre para la política, como *DetectCustomLabels-access*.

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

1. Si va a almacenar imágenes para analizarlas en un bucket de Amazon S3, repita los pasos del 10 al 14. 

   1. En el paso 11, utilice la siguiente política. *bucket/folder path*Sustitúyala por la ruta del depósito y la carpeta de Amazon S3 a las imágenes que desee analizar. 

------
#### [ JSON ]

****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Sid": "S3Access",
                  "Effect": "Allow",
                  "Action": "s3:GetObject",
                  "Resource": "arn:aws:s3:::bucket/folder path/*"
              }
          ]
      }
      ```

------

   1. En el paso 13, elija un nombre de política diferente, como *S3Bucket-access*.

## Paso 2: (opcional) Crear una capa (consola)
<a name="example-lambda-create-layer"></a>

Para ejecutar este ejemplo, no es necesario realizar este paso. La `DetectCustomLabels` operación se incluye en el entorno Lambda Python predeterminado como parte del AWS SDK para Python (Boto3). Si otras partes de la función Lambda necesitan actualizaciones de AWS servicio recientes que no estén en el entorno Lambda Python predeterminado, realice este paso para añadir la última versión del SDK de Boto3 como capa a su función. 

En primer lugar, se crea un archivo de archivo .zip con el SDK de Boto3. A continuación, cree una capa y añada el archivo de zip a la capa. Para obtener más información, consulte [Uso de capas con la función de Lambda](https://docs.aws.amazon.com/lambda/latest/dg/invocation-layers.html#invocation-layers-using).

**Cómo crear y añadir una capa (consola)**

1. Abra el símbolo del sistema y escriba el comando siguiente.

   ```
   pip install boto3 --target python/.
   zip boto3-layer.zip -r python/
   ```

1. Apunte el nombre del archivo zip (boto3-layer.zip). Lo necesitará más tarde en el paso 6 de este mismo procedimiento.

1. Abra la consola en. AWS Lambda [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/)

1. En el panel de navegación, elija **Capas**. 

1. Elija **Crear capa**.

1. Introduzca los valores correspondientes en **Nombre** y **Descripción**.

1. Elija **Cargar archivo .zip** y luego **Cargar**.

1. En el cuadro de diálogo, elija el archivo .zip (boto3-layer.zip) que creó en el paso 1 de este procedimiento.

1. Con tiempos de ejecución compatibles, elija **Python 3.9**.

1. Elija **Crear** para crear la capa.

1. Elija el icono del menú del panel de navegación.

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

1. En la lista de recursos, elija la función que haya creado en [Paso 1: Crear una AWS Lambda función (consola)](#example-lambda-create-function). 

1. Elija la pestaña **Código**.

1. En la sección **Capas**, elija **Agregar una capa**.

1. Elija **Capas personalizadas**.

1. En **Capas personalizadas**, elija el nombre de la capa que escogió en el paso 6. 

1. En **Versión**, elija la versión de la capa, que debe ser 1.

1. Elija **Agregar**.

## Paso 3: Añadir código de Python (consola)
<a name="example-lambda-add-code"></a>

En este paso, agregue código Python a la función de Lambda mediante el editor de código de la consola de Lambda. El código analiza una imagen facilitada con `DetectCustomLabels` y devuelve una lista con las etiquetas que se encuentran en la imagen. La imagen facilitada puede estar ubicada en un bucket de Amazon S3 o incluirse como bytes de imagen codificados en byte64.

**Cómo añadir código Python (consola)**

1. Si no se encuentra en la consola de Lambda, haga lo siguiente:

   1. Abra la AWS Lambda consola en [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/).

   1. Abra la función de Lambda que creó en [Paso 1: Crear una AWS Lambda función (consola)](#example-lambda-create-function).

1. Elija la pestaña **Código**.

1. En **Código fuente**, sustituya el código en **lambda\$1function.py** por lo siguiente: 

   ```
   # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   # SPDX-License-Identifier: Apache-2.0
   
   """
   Purpose
   An AWS lambda function that analyzes images with an the Amazon Rekognition
   Custom Labels model.
   """
   import json
   import base64
   from os import environ
   import logging
   import boto3
   
   from botocore.exceptions import ClientError
   
   # Set up logging.
   logger = logging.getLogger(__name__)
   
   # Get the model ARN and confidence.
   model_arn = environ['MODEL_ARN']
   min_confidence = int(environ.get('CONFIDENCE', 50))
   
   # Get the boto3 client.
   rek_client = boto3.client('rekognition')
   
   
   def lambda_handler(event, context):
       """
       Lambda handler function
       param: event: The event object for the Lambda function.
       param: context: The context object for the lambda function.
       return: The labels found in the image passed in the event
       object.
       """
   
       try:
   
           # Determine image source.
           if 'image' in event:
               # Decode the image
               image_bytes = event['image'].encode('utf-8')
               img_b64decoded = base64.b64decode(image_bytes)
               image = {'Bytes': img_b64decoded}
   
   
           elif 'S3Object' in event:
               image = {'S3Object':
                        {'Bucket':  event['S3Object']['Bucket'],
                         'Name': event['S3Object']['Name']}
                        }
   
           else:
               raise ValueError(
                   'Invalid source. Only image base 64 encoded image bytes or S3Object are supported.')
   
   
           # Analyze the image.
           response = rek_client.detect_custom_labels(Image=image,
               MinConfidence=min_confidence,
               ProjectVersionArn=model_arn)
   
           # Get the custom labels
           labels = response['CustomLabels']
   
           lambda_response = {
               "statusCode": 200,
               "body": json.dumps(labels)
           }
   
       except ClientError as err:
           error_message = f"Couldn't analyze image. " + \
               err.response['Error']['Message']
   
           lambda_response = {
               'statusCode': 400,
               'body': {
                   "Error": err.response['Error']['Code'],
                   "ErrorMessage": error_message
               }
           }
           logger.error("Error function %s: %s",
               context.invoked_function_arn, error_message)
   
       except ValueError as val_error:
           lambda_response = {
               'statusCode': 400,
               'body': {
                   "Error": "ValueError",
                   "ErrorMessage": format(val_error)
               }
           }
           logger.error("Error function %s: %s",
               context.invoked_function_arn, format(val_error))
   
       return lambda_response
   ```

1. Elija **Implementar** para implementar la función de Lambda.

## Paso 4: Probar la función de Lambda
<a name="example-lambda-test"></a>

En este paso, utilice el código Python de su equipo para pasar una imagen local, o la imagen de un bucket de Amazon S3, a la función de Lambda. Las imágenes transferidas desde un equipo local deben tener un tamaño inferior a 6 291 456 bytes. Si las imágenes son más grandes, cárguelas en un bucket de Amazon S3 y llame al script con la ruta de Amazon S3 de la imagen. Para obtener más información sobre cómo cargar archivos en un bucket de Amazon S3, consulte [Cargar objetos](https://docs.aws.amazon.com/AmazonS3/latest/userguide/upload-objects.html).

Asegúrese de ejecutar el código en la misma AWS región en la que creó la función Lambda. [Puede ver la AWS región de la función Lambda en la barra de navegación de la página de detalles de la función en la consola Lambda.](https://console.aws.amazon.com/lambda/)

Si la AWS Lambda función devuelve un error de tiempo de espera, amplíe el período de tiempo de espera de la función Lambda. Para obtener más información, consulte [Configuración del tiempo de espera de la función](https://docs.aws.amazon.com/lambda/latest/dg/configuration-function-common.html#configuration-timeout-console) (consola).

Para obtener más información sobre cómo invocar una función Lambda desde el código, [consulte AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/invoking-lambda-functions.html) Invocación de funciones. 

**Cómo probar la función de Lambda**

1. Asegúrese de que tiene el permiso `lambda:InvokeFunction`. Puede utilizar la siguiente política. 

   Puede obtener el ARN de la función de Lambda en la descripción general de la función en la [consola de Lambda](https://console.aws.amazon.com/lambda/).

   Para dar acceso, asigne los permisos a los usuarios, grupos o roles correspondientes:
   + Usuarios y grupos en: AWS IAM Identity Center

     Cree un conjunto de permisos. Siga las instrucciones de [Creación de un conjunto de permisos](https://docs.aws.amazon.com//singlesignon/latest/userguide/howtocreatepermissionset.html) en la *Guía del usuario de AWS IAM Identity Center *.
   + Usuarios gestionados en IAM a través de un proveedor de identidades:

     Cree un rol para la federación de identidades. Siga las instrucciones descritas en [Creación de un rol para un proveedor de identidad de terceros (federación)](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_roles_create_for-idp.html) en la *Guía del usuario de IAM*.
   + Usuarios de IAM:
     + Cree un rol que el usuario pueda aceptar. Siga las instrucciones descritas en [Creación de un rol para un usuario de IAM](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_roles_create_for-user.html) en la *Guía del usuario de IAM*.
     + (No recomendado) Adjunte una política directamente a un usuario o agregue un usuario a un grupo de usuarios. Siga las instrucciones descritas en [Adición de permisos a un usuario (consola)](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_users_change-permissions.html#users_change_permissions-add-console) de la *Guía del usuario de IAM*.

1. Instale y configure el AWS SDK para Python. Para obtener más información, consulte [Paso 4: Configure y AWS CLI AWS SDKs](su-awscli-sdk.md).

1. [Inicie el modelo](rm-start.md) que eligió en el paso 7 de [Paso 1: Crear una AWS Lambda función (consola)](#example-lambda-create-function).

1. Guarde el siguiente código en un archivo denominado `client.py`. 

   ```
   # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   # SPDX-License-Identifier: Apache-2.0
   
   """
   Purpose
   Test code for running the Amazon Rekognition Custom Labels Lambda
   function example code.
   """
   
   import argparse
   import logging
   import base64
   import json
   import boto3
   
   from botocore.exceptions import ClientError
   
   
   logger = logging.getLogger(__name__)
   
   
   def analyze_image(function_name, image):
       """Analyzes an image with an AWS Lambda function.
       :param image: The image that you want to analyze.
       :return The status and classification result for
       the image analysis.
       """
   
       lambda_client = boto3.client('lambda')
   
       lambda_payload = {}
   
       if image.startswith('s3://'):
           logger.info("Analyzing image from S3 bucket: %s", image)
           bucket, key = image.replace("s3://", "").split("/", 1)
           s3_object = {
               'Bucket': bucket,
               'Name': key
           }
           lambda_payload = {"S3Object": s3_object}
   
       # Call the lambda function with the image.
       else:
           with open(image, 'rb') as image_file:
               logger.info("Analyzing local image image: %s ", image)
               image_bytes = image_file.read()
               data = base64.b64encode(image_bytes).decode("utf8")
   
               lambda_payload = {"image": data}
   
       response = lambda_client.invoke(FunctionName=function_name,
                                       Payload=json.dumps(lambda_payload))
   
       return json.loads(response['Payload'].read().decode())
   
   
   def add_arguments(parser):
       """
       Adds command line arguments to the parser.
       :param parser: The command line parser.
       """
   
       parser.add_argument(
           "function", help="The name of the AWS Lambda function that you want " \
           "to use to analyze the image.")
       parser.add_argument(
           "image", help="The local image that you want to analyze.")
   
   
   def main():
       """
       Entrypoint for script.
       """
       try:
           logging.basicConfig(level=logging.INFO,
                               format="%(levelname)s: %(message)s")
   
           # Get command line arguments.
           parser = argparse.ArgumentParser(usage=argparse.SUPPRESS)
           add_arguments(parser)
           args = parser.parse_args()
   
           # Get analysis results.
           result = analyze_image(args.function, args.image)
           status = result['statusCode']
   
           if status == 200:
               labels = result['body']
               labels = json.loads(labels)
               print(f"There are {len(labels)} labels in the image.")
               for custom_label in labels:
                   confidence = int(round(custom_label['Confidence'], 0))
                   print(
                       f"Label: {custom_label['Name']}: Confidence: {confidence}%")
           else:
               print(f"Error: {result['statusCode']}")
               print(f"Message: {result['body']}")
   
       except ClientError as error:
           logging.error(error)
           print(error)
   
   
   if __name__ == "__main__":
       main()
   ```

1. Ejecute el código. En el argumento de la línea de comandos, indique el nombre de la función de Lambda y la imagen que desee analizar. Puede poner la ruta de una imagen local o la ruta S3 de una imagen almacenada en un bucket de Amazon S3. Por ejemplo:

   ```
   python client.py function_name s3://bucket/path/image.jpg
   ```

   Si la imagen está en un bucket de Amazon S3, asegúrese de que es el mismo bucket que indicó en el paso 15 de [Paso 1: Crear una AWS Lambda función (consola)](#example-lambda-create-function).

   Si se ejecuta correctamente, le saldrá una lista de etiquetas que se encuentran en la imagen. Si no devuelve ninguna etiqueta, considere la posibilidad de reducir el valor de confianza que eligió en el paso 7 de [Paso 1: Crear una AWS Lambda función (consola)](#example-lambda-create-function).

1. Si ha terminado con la función de Lambda y otras aplicaciones no utilizan el modelo, [detenga el modelo](rm-stop.md). Recuerde [iniciar el modelo](rm-start.md) la próxima vez que desee utilizar la función de Lambda. 