

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.

# Procesar datos en un flujo de trabajo de etiquetado personalizado con AWS Lambda
<a name="sms-custom-templates-step3"></a>

En este tema puede aprender a implementar funciones de [AWS Lambda](https://aws.amazon.com/lambda/) opcionales al crear un flujo de trabajo de etiquetado personalizado. Puede especificar dos tipos de funciones de Lambda para utilizarlas con el flujo de trabajo de etiquetado personalizado.
+ *Función de Lambda previa a la anotación*: esta función procesa previamente cada objeto de datos que se envía al trabajo de etiquetado antes de enviarlo a los trabajadores.
+ *Lambda postanotación*: esta función procesa los resultados una vez que los trabajadores envían una tarea. Si especifica varios trabajadores por objeto de datos, esta función puede incluir una lógica para consolidar las anotaciones.

Si es un usuario nuevo de Lambda y Ground Truth, le recomendamos que utilice las páginas de esta sección de la siguiente manera:

1. En primer lugar, revise [Uso de las funciones de Lambda previas y posteriores a la anotaciónUso de las funciones de Lambda](sms-custom-templates-step3-lambda-requirements.md).

1. A continuación, utilice la página [Agregue los permisos necesarios para usarlos AWS Lambda con Ground Truth](sms-custom-templates-step3-lambda-permissions.md) para obtener información sobre los requisitos de seguridad y permisos para utilizar las funciones de Lambda preanotación y postanotación en un trabajo de etiquetado personalizado de Ground Truth.

1. A continuación, debe visitar la consola de Lambda o utilizar la de Lambda APIs para crear sus funciones. Utilice la sección [Creación de funciones de Lambda mediante las plantillas de Ground Truth](sms-custom-templates-step3-lambda-create.md) para obtener información sobre cómo crear funciones de Lambda.

1. Para saber cómo actualizar su función de Lambda, consulte [Prueba de las funciones de Lambda previas y posteriores a la anotación](sms-custom-templates-step3-lambda-test.md).

1. Tras crear las funciones de Lambda de preprocesamiento y postprocesamiento, selecciónelas en la sección **Funciones de Lambda** que aparece después del editor de código para su HTML personalizado en la consola de Ground Truth. Para saber cómo utilizar estas funciones en una solicitud de API `CreateLabelingJob`, consulte [Crear un trabajo de etiquetado (API)](sms-create-labeling-job-api.md).

Para ver un tutorial sobre el flujo de trabajo de etiquetado personalizado que incluya ejemplos de funciones de Lambda previas y posteriores a la anotación, consulte [Plantilla de demostración: anotación de imágenes con `crowd-bounding-box`](sms-custom-templates-step2-demo1.md).

**Topics**
+ [Uso de las funciones de Lambda previas y posteriores a la anotación](sms-custom-templates-step3-lambda-requirements.md)
+ [Agregue los permisos necesarios para usarlos AWS Lambda con Ground Truth](sms-custom-templates-step3-lambda-permissions.md)
+ [Creación de funciones de Lambda mediante las plantillas de Ground Truth](sms-custom-templates-step3-lambda-create.md)
+ [Prueba de las funciones de Lambda previas y posteriores a la anotación](sms-custom-templates-step3-lambda-test.md)

# Uso de las funciones de Lambda previas y posteriores a la anotación
<a name="sms-custom-templates-step3-lambda-requirements"></a>

Consulte estos temas para obtener más información sobre la sintaxis de las solicitudes enviadas a las funciones de Lambda previas y posteriores a la anotación, y la sintaxis de respuesta necesaria que Ground Truth utiliza en flujos de trabajo de etiquetado personalizado.

**Topics**
+ [Lambda de preanotación](#sms-custom-templates-step3-prelambda)
+ [La función Lambda de postanotación](#sms-custom-templates-step3-postlambda)

## Lambda de preanotación
<a name="sms-custom-templates-step3-prelambda"></a>

Antes de enviar una tarea de etiquetado al trabajador, se puede invocar un función de Lambda previa a la anotación opcional.

Ground Truth envía a la función de Lambda una solicitud con formato JSON para proporcionar detalles sobre el trabajo de etiquetado y el objeto de datos.

A continuación se muestran dos solicitudes con formato JSON de ejemplo.

------
#### [ Data object identified with "source-ref" ]

```
{
    "version": "2018-10-16",
    "labelingJobArn": <labelingJobArn>
    "dataObject" : {
        "source-ref": <s3Uri>
    }
}
```

------
#### [ Data object identified with "source" ]

```
{
    "version": "2018-10-16",
    "labelingJobArn": <labelingJobArn>
    "dataObject" : {
        "source": <string>
    }
}
```

------

 En la siguiente lista se incluyen los esquemas de la solicitud previa a la anotación. A continuación, se describe cada parámetro.
+ `version` (cadena): es un número de versión que utiliza internamente Ground Truth.
+ `labelingJobArn` (cadena): es el nombre del recurso de Amazon, o ARN, de su trabajo de etiquetado. Este ARN se puede usar para hacer referencia al trabajo de etiquetado cuando se utilizan operaciones de la API de Ground Truth, como `DescribeLabelingJob`.
+ El `dataObject` (objeto JSON): la clave contiene una sola línea JSON, ya sea desde el archivo de manifiesto de entrada o enviada desde Amazon SNS. Los objetos de línea JSON de su manifiesto pueden tener un tamaño de 100 kilobytes como máximo y contener una gran variedad de datos. Para un trabajo de anotación de imágenes muy básico, es posible que el JSON `dataObject` solo contenga una clave `source-ref` que identifique la imagen que se va a anotar. Si el objeto de datos (por ejemplo, una línea de texto) se incluye directamente en el archivo de manifiesto de entrada, el objeto de datos se identifica con `source`. Si crea un trabajo de verificación o ajuste, esta línea puede contener datos de etiqueta y metadatos del trabajo de etiquetado anterior.

A continuación se muestran ejemplos en pestañas de una solicitud previa a la anotación. Cada parámetro de estas solicitudes de ejemplo se explica debajo de la tabla con pestañas.

------
#### [ Data object identified with "source-ref" ]

```
{
    "version": "2018-10-16",
    "labelingJobArn": "arn:aws:sagemaker:us-west-2:111122223333:labeling-job/<labeling_job_name>"
    "dataObject" : {
        "source-ref": "s3://input-data-bucket/data-object-file-name"
    }
}
```

------
#### [ Data object identified with "source" ]

```
{
    "version": "2018-10-16",
    "labelingJobArn": "arn:aws:sagemaker:<aws_region>:111122223333:labeling-job/<labeling_job_name>"
    "dataObject" : {
        "source": "Sue purchased 10 shares of the stock on April 10th, 2020"
    }
}
```

------

A cambio, Ground Truth requiere una respuesta con el siguiente formato:

**Example de datos devueltos previstos**  

```
{
    "taskInput": <json object>,
    "isHumanAnnotationRequired": <boolean> # Optional
}
```

En el ejemplo anterior, `<json object>` debe contener *todos* los datos que necesita su plantilla de tarea de trabajador personalizado. Si está llevando a cabo una tarea de cuadro delimitador donde las instrucciones no cambien en ningún momento, podría simplemente ser el recurso de HTTP(S) o Amazon S3 para su archivo de imagen. Si se trata de una tarea de análisis de opinión y diferentes objetos pueden tener diferentes opciones, es la referencia de objeto como una cadena y las opciones como una matriz de cadenas.

**Implicaciones de `isHumanAnnotationRequired`**  
Este valor es opcional, ya que su valor predeterminado será `true`. El principal caso de uso para establecerlo de forma explícita es cuando se desea excluir este objeto de datos de su etiquetado por parte de trabajadores humanos. 

Si tiene una combinación de objetos en el manifiesto, con algunos objetos que requieren anotaciones humanas y otros que no los necesitan, puede incluir un valor `isHumanAnnotationRequired` en cada objeto de datos. Puede añadir lógica a su Lambda preanotación para determinar dinámicamente si un objeto requiere una anotación y establecer este valor booleano en consecuencia.

### Ejemplos de funciones de Lambda previa a la anotación.
<a name="sms-custom-templates-step3-prelambda-example"></a>

La siguiente función de Lambda previa a la anotación básica accede al objeto JSON en `dataObject` desde la solicitud inicial y lo devuelve en el parámetro `taskInput`.

```
import json

def lambda_handler(event, context):
    return {
        "taskInput":  event['dataObject']
    }
```

Suponiendo que el archivo de manifiesto de entrada utiliza `"source-ref"` para identificar objetos de datos, la plantilla de tareas de trabajador que se utiliza en el mismo trabajo de etiquetado que esta función de Lambda preanotación debe incluir un elemento Liquid como el siguiente para su ingerir `dataObject`.

```
{{ task.input.source-ref | grant_read_access }}
```

Si el archivo de manifiesto de entrada utilizó `source` para identificar el objeto de datos, la plantilla de tareas de trabajador puede ingerir `dataObject` con lo siguiente:

```
{{ task.input.source }}
```

El siguiente ejemplo de Lambda preanotación incluye lógica para identificar la clave utilizada en `dataObject` y apuntar a ese objeto de datos mediante `taskObject` en la instrucción de devolución de Lambda.

```
import json

def lambda_handler(event, context):

    # Event received
    print("Received event: " + json.dumps(event, indent=2))

    # Get source if specified
    source = event['dataObject']['source'] if "source" in event['dataObject'] else None

    # Get source-ref if specified
    source_ref = event['dataObject']['source-ref'] if "source-ref" in event['dataObject'] else None

    # if source field present, take that otherwise take source-ref
    task_object = source if source is not None else source_ref

    # Build response object
    output = {
        "taskInput": {
            "taskObject": task_object
        },
        "humanAnnotationRequired": "true"
    }

    print(output)
    # If neither source nor source-ref specified, mark the annotation failed
    if task_object is None:
        print(" Failed to pre-process {} !".format(event["labelingJobArn"]))
        output["humanAnnotationRequired"] = "false"

    return output
```

## La función Lambda de postanotación
<a name="sms-custom-templates-step3-postlambda"></a>

Cuando todos los trabajadores hayan anotado el objeto de datos o cuando se haya alcanzado [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_HumanLoopConfig.html#SageMaker-Type-HumanLoopConfig-TaskAvailabilityLifetimeInSeconds](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_HumanLoopConfig.html#SageMaker-Type-HumanLoopConfig-TaskAvailabilityLifetimeInSeconds), lo que ocurra primero, Ground Truth envía esas anotaciones a su Lambda postanotación. Esta función Lambda se suele utilizar para [Consolidación de anotaciones](sms-annotation-consolidation.md).

**nota**  
Para ver un ejemplo de una función Lambda posterior a la consolidación, [consulte](https://github.com/aws-samples/aws-sagemaker-ground-truth-recipe/blob/master/aws_sagemaker_ground_truth_sample_lambda/annotation_consolidation_lambda.py) annotation\$1consolidation\$1lambda.py en [aws-sagemaker-ground-truthel](https://github.com/aws-samples/aws-sagemaker-ground-truth-recipe) GitHub repositorio -recipe.

La siguiente tabla contiene los esquemas de la solicitud postanotación. En la siguiente lista con viñetas se describe cada uno de los parámetros.

```
{
    "version": "2018-10-16",
    "labelingJobArn": <string>,
    "labelCategories": [<string>],
    "labelAttributeName": <string>,
    "roleArn" : <string>,
    "payload": {
        "s3Uri": <string>
    }
 }
```
+ `version` (cadena): un número de versión que utiliza internamente Ground Truth.
+ `labelingJobArn` (cadena): el nombre del recurso de Amazon, o ARN, de su trabajo de etiquetado. Este ARN se puede usar para hacer referencia al trabajo de etiquetado cuando se utilizan operaciones de la API de Ground Truth, como `DescribeLabelingJob`.
+ `labelCategories` (lista de cadenas): incluye las categorías de etiquetas y otros atributos que especificó en la consola o que incluyó en el archivo de configuración de categorías de etiquetas.
+ `labelAttributeName` (cadena): el nombre del trabajo de etiquetado o el nombre del atributo de etiqueta que especificó al crear el trabajo de etiquetado.
+ `roleArn` (cadena): el nombre de recurso de Amazon (ARN) del rol de ejecución de IAM que se especifica al crear el trabajo de etiquetado. 
+ `payload` (objeto JSON): un JSON que incluye una clave `s3Uri` que identifica la ubicación de los datos de anotación de ese objeto de datos en Amazon S3. El segundo bloque de código que aparece a continuación muestra un ejemplo de este archivo de anotaciones.

En el siguiente bloque de código se incluye un ejemplo de una solicitud postanotación. Cada parámetro de esta solicitud de ejemplo se explica debajo del bloque de código.

**Example de una solicitud Lambda postanotación**  

```
{
    "version": "2018-10-16",
    "labelingJobArn": "arn:aws:sagemaker:us-west-2:111122223333:labeling-job/labeling-job-name",
    "labelCategories": ["Ex Category1","Ex Category2", "Ex Category3"],
    "labelAttributeName": "labeling-job-attribute-name",
    "roleArn" : "arn:aws:iam::111122223333:role/role-name",
    "payload": {
        "s3Uri": "s3://amzn-s3-demo-bucket/annotations.json"
    }
 }
```

**nota**  
Si ningún trabajador trabaja en el objeto de datos y se ha alcanzado `TaskAvailabilityLifetimeInSeconds`, el objeto de datos se marca como erróneo y no se incluirá como parte de la invocación de Lambda postanotación.

El siguiente bloque de código contiene el esquema de carga. Este es el archivo que indica el parámetro `s3Uri` en el objeto JSON de la solicitud Lambda postanotación `payload`. Por ejemplo, si el bloque de código anterior es la solicitud Lambda postanotación, el siguiente archivo de anotaciones se encuentra en `s3://amzn-s3-demo-bucket/annotations.json`.

En la siguiente lista con viñetas se describe cada uno de los parámetros.

**Example de un archivo de anotaciones**  

```
[
    {
        "datasetObjectId": <string>,
        "dataObject": {
            "s3Uri": <string>,
            "content": <string>
        },
        "annotations": [{
            "workerId": <string>,
            "annotationData": {
                "content": <string>,
                "s3Uri": <string>
            }
       }]
    }
]
```
+ `datasetObjectId` (cadena): identifica un identificador único que Ground Truth asigna a cada objeto de datos que envíe al trabajo de etiquetado.
+ `dataObject` (objeto JSON): el objeto de datos que se etiquetó. Si el objeto de datos está incluido en el archivo de manifiesto de entrada y se identifica mediante la clave `source` (por ejemplo, una cadena), `dataObject` incluye una clave `content` que identifica el objeto de datos. De lo contrario, ubicación del objeto de datos (por ejemplo, un enlace o un URI de S3) se identifica con `s3Uri`.
+ `annotations` (lista de objetos JSON): esta lista contiene un único objeto JSON por cada anotación enviada por los trabajadores para ese `dataObject`. Un único objeto JSON contiene un `workerId` único que se puede utilizar para identificar al trabajador que envió esa anotación. La clave `annotationData` contiene uno de los siguientes valores:
  + `content` (cadena): contiene los datos de la anotación. 
  + `s3Uri` (cadena): contiene un URI de S3 que identifica la ubicación de los datos de anotación.

La siguiente tabla contiene ejemplos del contenido que puede encontrar en la carga para distintos tipos de anotaciones.

------
#### [ Named Entity Recognition Payload ]

```
[
    {
      "datasetObjectId": "1",
      "dataObject": {
        "content": "Sift 3 cups of flour into the bowl."
      },
      "annotations": [
        {
          "workerId": "private.us-west-2.ef7294f850a3d9d1",
          "annotationData": {
            "content": "{\"crowd-entity-annotation\":{\"entities\":[{\"endOffset\":4,\"label\":\"verb\",\"startOffset\":0},{\"endOffset\":6,\"label\":\"number\",\"startOffset\":5},{\"endOffset\":20,\"label\":\"object\",\"startOffset\":15},{\"endOffset\":34,\"label\":\"object\",\"startOffset\":30}]}}"
          }
        }
      ]
    }
]
```

------
#### [ Semantic Segmentation Payload ]

```
[
    {
      "datasetObjectId": "2",
      "dataObject": {
        "s3Uri": "s3://amzn-s3-demo-bucket/gt-input-data/images/bird3.jpg"
      },
      "annotations": [
        {
          "workerId": "private.us-west-2.ab1234c5678a919d0",
          "annotationData": {
            "content": "{\"crowd-semantic-segmentation\":{\"inputImageProperties\":{\"height\":2000,\"width\":3020},\"labelMappings\":{\"Bird\":{\"color\":\"#2ca02c\"}},\"labeledImage\":{\"pngImageData\":\"iVBOR...\"}}}"
          }
        }
      ]
    }
  ]
```

------
#### [ Bounding Box Payload ]

```
[
    {
      "datasetObjectId": "0",
      "dataObject": {
        "s3Uri": "s3://amzn-s3-demo-bucket/gt-input-data/images/bird1.jpg"
      },
      "annotations": [
        {
          "workerId": "private.us-west-2.ab1234c5678a919d0",
          "annotationData": {
            "content": "{\"boundingBox\":{\"boundingBoxes\":[{\"height\":2052,\"label\":\"Bird\",\"left\":583,\"top\":302,\"width\":1375}],\"inputImageProperties\":{\"height\":2497,\"width\":3745}}}"
          }
        }
      ]
    }
 ]
```

------

La función de Lambda postanotación puede contener una lógica similar a la siguiente para recorrer y acceder a todas las anotaciones contenidas en la solicitud. [Para ver un ejemplo completo, consulte [annotation\$1consolidation\$1lambda.py](https://github.com/aws-samples/aws-sagemaker-ground-truth-recipe/blob/master/aws_sagemaker_ground_truth_sample_lambda/annotation_consolidation_lambda.py) en el aws-sagemaker-ground-truth repositorio -recipe.](https://github.com/aws-samples/aws-sagemaker-ground-truth-recipe) GitHub En este GitHub ejemplo, debe añadir su propia lógica de consolidación de anotaciones. 

```
for i in range(len(annotations)):
    worker_id = annotations[i]["workerId"]
    annotation_content = annotations[i]['annotationData'].get('content')
    annotation_s3_uri = annotations[i]['annotationData'].get('s3uri')
    annotation = annotation_content if annotation_s3_uri is None else s3_client.get_object_from_s3(
        annotation_s3_uri)
    annotation_from_single_worker = json.loads(annotation)

    print("{} Received Annotations from worker [{}] is [{}]"
            .format(log_prefix, worker_id, annotation_from_single_worker))
```

**sugerencia**  
Al ejecutar algoritmos de consolidación en los datos, puede utilizar un servicio de base de datos AWS para almacenar los resultados o puede devolver los resultados procesados a Ground Truth. Los datos que devuelva a Ground Truth se almacenan en manifiestos de anotaciones consolidados en el bucket de S3 especificado para la salida durante la configuración del trabajo de etiquetado.

A cambio, Ground Truth requiere una respuesta con el siguiente formato:

**Example de datos devueltos previstos**  

```
[
   {        
        "datasetObjectId": <string>,
        "consolidatedAnnotation": {
            "content": {
                "<labelattributename>": {
                    # ... label content
                }
            }
        }
    },
   {        
        "datasetObjectId": <string>,
        "consolidatedAnnotation": {
            "content": {
                "<labelattributename>": {
                    # ... label content
                }
            }
        }
    }
    .
    .
    .
]
```
En este punto, todos los datos que envíe a su bucket de S3 que no sean `datasetObjectId` están en el objeto `content`.

Cuando devuelve anotaciones en `content`, se obtiene una entrada en el manifiesto de salida de su trabajo como la siguiente:

**Example de formato de etiqueta en manifiesto de salida**  

```
{  "source-ref"/"source" : "<s3uri or content>", 
   "<labelAttributeName>": {
        # ... label content from you
    },   
   "<labelAttributeName>-metadata": { # This will be added by Ground Truth
        "job_name": <labelingJobName>,
        "type": "groundTruth/custom",
        "human-annotated": "yes", 
        "creation_date": <date> # Timestamp of when received from Post-labeling Lambda
    }
}
```

Debido a la naturaleza potencialmente compleja de una plantilla personalizada y de los datos que recopila, Ground Truth no ofrece un procesamiento más amplio de los datos.

# Agregue los permisos necesarios para usarlos AWS Lambda con Ground Truth
<a name="sms-custom-templates-step3-lambda-permissions"></a>

Es posible que tenga que configurar algunos o todos los siguientes elementos para crear y usar AWS Lambda con Ground Truth. 
+ Debe conceder un permiso a un rol o usuario de IAM (en conjunto, una entidad de IAM) para crear las funciones Lambda previas y posteriores a la anotación mediante y elegirlas al crear el AWS Lambda trabajo de etiquetado. 
+ La función de ejecución de IAM especificada al configurar el trabajo de etiquetado necesita permiso para invocar las funciones de Lambda preanotación y postanotación. 
+ Es posible que las funciones de Lambda postanotación necesiten permiso para acceder a Amazon S3.

Utilice las siguientes secciones para obtener información sobre cómo crear las entidades de IAM y conceder los permisos descritos más arriba.

**Topics**
+ [Otorgue permiso para crear y seleccionar una función AWS Lambda](#sms-custom-templates-step3-postlambda-create-perms)
+ [Conceda permiso al rol de ejecución de IAM para invocar funciones AWS Lambda](#sms-custom-templates-step3-postlambda-execution-role-perms)
+ [Otorgue permisos de Lambda postanotación para acceder a la anotación](#sms-custom-templates-step3-postlambda-perms)

## Otorgue permiso para crear y seleccionar una función AWS Lambda
<a name="sms-custom-templates-step3-postlambda-create-perms"></a>

Si no necesita permisos detallados para desarrollar funciones Lambda previas y posteriores a la anotación, puede adjuntar AWS la `AWSLambda_FullAccess` política gestionada a un usuario o rol. Esta política otorga amplios permisos para usar todas las funciones de Lambda, así como permisos para realizar acciones en otros AWS servicios con los que Lambda interactúa.

Para crear una política más detallada para los casos de uso sensibles a la seguridad, consulte la documentación [Políticas de IAM basadas en la identidad para Lambda en la Guía para](https://docs.aws.amazon.com/lambda/latest/dg/access-control-identity-based.html) desarrolladores para obtener información sobre cómo crear una política de IAM que se adapte a su caso de uso. AWS Lambda 

**Políticas de uso de la consola de Lambda**

Si desea conceder permiso a una entidad de IAM para usar la consola Lambda, [consulte Uso de la consola Lambda en la](https://docs.aws.amazon.com/lambda/latest/dg/security_iam_id-based-policy-examples.html#security_iam_id-based-policy-examples-console) Guía para desarrolladores. AWS Lambda 

Además, si desea que el usuario pueda acceder e implementar las funciones iniciales de anotación previa y posterior a la anotación de Ground Truth mediante AWS Serverless Application Repository la consola de Lambda, debe especificar el *`<aws-region>`* lugar en el que desea implementar las funciones (debe ser la misma AWS región que se utilizó para crear el trabajo de etiquetado) y añadir la siguiente política a la función de IAM.

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "serverlessrepo:ListApplicationVersions",
                "serverlessrepo:GetApplication",
                "serverlessrepo:CreateCloudFormationTemplate"
            ],
            "Resource": "arn:aws:serverlessrepo:us-east-1:838997950401:applications/aws-sagemaker-ground-truth-recipe"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": "serverlessrepo:SearchApplications",
            "Resource": "*"
        }
    ]
}
```

------

**Políticas para ver las funciones de Lambda en la consola de Ground Truth**

Para conceder a una entidad de IAM permiso para ver las funciones de Lambda en la consola de Ground Truth cuando el usuario crea un trabajo de etiquetado personalizado, la entidad debe tener los permisos que se describen [Conceda permiso a IAM para usar la consola Amazon SageMaker Ground Truth](sms-security-permission-console-access.md), incluidos los permisos descritos en la sección [Permisos del flujo de trabajo de etiquetado personalizado](sms-security-permission-console-access.md#sms-security-permissions-custom-workflow).

## Conceda permiso al rol de ejecución de IAM para invocar funciones AWS Lambda
<a name="sms-custom-templates-step3-postlambda-execution-role-perms"></a>

Si añade la política gestionada de IAM [AmazonSageMakerGroundTruthExecution](https://console.aws.amazon.com/iam/home?#/policies/arn:aws:iam::aws:policy/AmazonSageMakerGroundTruthExecution)a la función de ejecución de IAM utilizada para crear el trabajo de etiquetado, esta función tiene permiso para enumerar e invocar funciones de Lambda con una de las siguientes cadenas en el nombre de la función`GtRecipe`:`SageMaker`,,, `Sagemaker` o. `sagemaker` `LabelingFunction` 

Si los nombres de las funciones de Lambda preanotación y postanotación no incluyen uno de los términos del párrafo anterior, o si necesita un permiso más detallado que los de la política administrada `AmazonSageMakerGroundTruthExecution`, puede añadir una política similar a la siguiente para dar permiso al rol de ejecución para invocar las funciones preanotación y postanotación.

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "lambda:InvokeFunction",
            "Resource": [
                "arn:aws:lambda:us-east-1:111122223333:function:<pre-annotation-lambda-name>",
                "arn:aws:lambda:us-east-1:111122223333:function:<post-annotation-lambda-name>"
            ]
        }
    ]
}
```

------

## Otorgue permisos de Lambda postanotación para acceder a la anotación
<a name="sms-custom-templates-step3-postlambda-perms"></a>

Como se describe en [La función Lambda de postanotación](sms-custom-templates-step3-lambda-requirements.md#sms-custom-templates-step3-postlambda), la solicitud de Lambda postanotación incluye la ubicación de los datos de la anotación en Amazon S3. Esta ubicación se identifica mediante la cadena `s3Uri` del objeto `payload`. Para procesar las anotaciones a medida que van llegando, incluso para una función de transferencia simple, debe asignar los permisos necesarios al [rol de ejecución de Lambda](https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html) postanotación para leer archivos de Amazon S3.

Hay muchas maneras de configurar su Lambda para obtener acceso a los datos de anotaciones en Amazon S3. Las dos formas más comunes son:
+ Permita que la función de ejecución de Lambda asuma la función de ejecución de SageMaker IA identificada `roleArn` en la solicitud de Lambda posterior a la anotación. Esta función de ejecución de SageMaker IA es la que se utiliza para crear el trabajo de etiquetado y tiene acceso al depósito de salida de Amazon S3 donde se almacenan los datos de anotación.
+ Conceda permiso al rol de ejecución de Lambda para obtener acceso directo al bucket de salida de Amazon S3.

Utilice las siguientes secciones para aprender a configurar estas opciones. 

**Otorgue permiso a Lambda para asumir la función de ejecución de SageMaker IA**

Para permitir que una función de Lambda asuma una función de ejecución de SageMaker IA, debe adjuntar una política a la función de ejecución de la función de Lambda y modificar la relación de confianza de la función de ejecución de SageMaker IA para permitir que Lambda la asuma.

1. [Adjunte la siguiente política de IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html) a la función de ejecución de su función Lambda para asumir SageMaker la función de ejecución de IA identificada en. `Resource` Reemplace `222222222222` por el [identificador de la cuenta de AWS](https://docs.aws.amazon.com/general/latest/gr/acct-identifiers.html). Reemplace `sm-execution-role` por el nombre del rol asumido.

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": {
           "Effect": "Allow",
           "Action": "sts:AssumeRole",
           "Resource": "arn:aws:iam::222222222222:role/sm-execution-role"
       }
   }
   ```

------

1. [Modifique la política de confianza](https://docs.aws.amazon.com/IAM/latest/UserGuide/roles-managingrole-editing-console.html#roles-managingrole_edit-trust-policy) de la función de ejecución de la SageMaker IA para incluir lo siguiente. `Statement` Reemplace `222222222222` por el [identificador de la cuenta de AWS](https://docs.aws.amazon.com/general/latest/gr/acct-identifiers.html). Reemplace `my-lambda-execution-role` por el nombre del rol asumido.

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Principal": {
                   "AWS": "arn:aws:iam::222222222222:role/my-lambda-execution-role"
               },
               "Action": "sts:AssumeRole"
           }
       ]
   }
   ```

------

**Conceda permiso al rol de ejecución de Lambda para acceder a S3**

Puede añadir una política similar a la siguiente al rol de ejecución de la función de Lambda postanotación para concederle permisos de lectura de S3. *amzn-s3-demo-bucket*Sustitúyalo por el nombre del depósito de salida que especifique al crear un trabajo de etiquetado.

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

****  

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

------

Para añadir permisos de lectura de S3 a un rol de ejecución de Lambda en la consola de Lambda, utilice el siguiente procedimiento. 

**Añada permisos de lectura de S3 a la función de Lambda postanotación:**

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

1. Elija el nombre de la función postanotación.

1. Elija **Configuración** y, a continuación, seleccione **Permisos**.

1. Seleccione el **Nombre del rol** y la página de resumen de ese rol se abrirá en la consola de IAM en una pestaña nueva. 

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

1. Realice una de las siguientes acciones:
   + Busque y seleccione **`AmazonS3ReadOnlyAccess`** para dar permiso a la función para leer todos los buckets y objetos de la cuenta. 
   + Si necesita permisos más detallados, seleccione **Crear política** y utilice el ejemplo de política de la sección anterior para crear una política. Tenga en cuenta que debe volver a la página de resumen del rol de ejecución después de crear la política.

1. Si utilizó la política administrada `AmazonS3ReadOnlyAccess`, seleccione **Asociar política**. 

   Si creó una política nueva, vuelva a la página de resumen del rol de ejecución de Lambda y asocie la política que acaba de crear.

# Creación de funciones de Lambda mediante las plantillas de Ground Truth
<a name="sms-custom-templates-step3-lambda-create"></a>

Puede crear una función Lambda mediante la consola de Lambda AWS CLI, el o un AWS SDK en el lenguaje de programación compatible que elija. Utilice la Guía para AWS Lambda desarrolladores para obtener más información sobre cada una de estas opciones:
+ Para saber cómo crear una función de Lambda con la consola, consulte [Cree una función de Lambda con la consola](https://docs.aws.amazon.com/lambda/latest/dg/getting-started-create-function.html).
+ Para obtener información sobre cómo crear una función Lambda mediante AWS CLI, consulte Uso de [AWS Lambda con la AWS](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-awscli.html) interfaz de línea de comandos.
+ Seleccione la sección correspondiente de la tabla de contenido para obtener más información sobre cómo trabajar con Lambda en el lenguaje que prefiera. Por ejemplo, seleccione [Compilación con Python](https://docs.aws.amazon.com/lambda/latest/dg/lambda-python.html) para obtener más información sobre el uso de Lambda con AWS SDK para Python (Boto3).

*Ground Truth proporciona plantillas de anotación previa y posterior a través de una receta AWS Serverless Application Repository (SAR).* Utilice el siguiente procedimiento para seleccionar la receta de Ground Truth en la consola de Lambda.

**Utilice la receta SAR de Ground Truth para crear funciones de Lambda preanotación y postanotación:**

1. Abra la página [https://console.aws.amazon.com/lambda/home#/functions](https://console.aws.amazon.com/lambda/home#/functions) en la consola de Lambda.

1. Seleccione **Crear función**.

1. Seleccione **Examinar el repositorio de aplicaciones sin servidor**.

1. En el cuadro de texto de búsqueda, escribe **aws-sagemaker-ground-truth-recipe** y selecciona esa aplicación.

1. Seleccione **Implementar**. La implementación de la aplicación puede tardar un par de minutos. 

   Una vez implementada la aplicación, aparecen dos funciones en la sección **Funciones** de la consola de Lambda: `serverlessrepo-aws-sagema-GtRecipePreHumanTaskFunc-<id>` y `serverlessrepo-aws-sagema-GtRecipeAnnotationConsol-<id>`. 

1. Seleccione una de estas funciones y añada su lógica personalizada en la sección **Código**.

1. Cuando haya terminado con los cambios, seleccione **Implementar** para implementarlas.

# Prueba de las funciones de Lambda previas y posteriores a la anotación
<a name="sms-custom-templates-step3-lambda-test"></a>

Puede probar las funciones de Lambda preanotación y postanotación en la consola de Lambda. Si es un usuario nuevo de Lambda, puede aprender a probar, o *invocar*, sus funciones de Lambda en la consola mediante el tutorial [Crear una función de Lambda](https://docs.aws.amazon.com/lambda/latest/dg/getting-started-create-function.html#gettingstarted-zip-function) con la consola en la Guía para desarrolladores de AWS Lambda . Puedes usar las secciones de esta página para aprender a probar las plantillas de anotación previa y posterior a la anotación de Ground Truth que se proporcionan a través de un AWS Serverless Application Repository (SAR). 

**Topics**
+ [Requisitos previos](#sms-custom-templates-step3-lambda-test-pre)
+ [Pruebe la función de Lambda preanotación](#sms-custom-templates-step3-lambda-test-pre-annotation)
+ [Pruebe la función de Lambda postanotación](#sms-custom-templates-step3-lambda-test-post-annotation)

## Requisitos previos
<a name="sms-custom-templates-step3-lambda-test-pre"></a>

Debe hacer lo siguiente para utilizar las pruebas que se describen en esta página.
+ Necesita acceso a la consola de Lambda y permiso para crear e invocar funciones de Lambda. Para saber cómo configurar estos permisos, consulte [Otorgue permiso para crear y seleccionar una función AWS Lambda](sms-custom-templates-step3-lambda-permissions.md#sms-custom-templates-step3-postlambda-create-perms)
+ Si no ha implementado la receta de SAR de Ground Truth, utilice el procedimiento [Creación de funciones de Lambda mediante las plantillas de Ground Truth](sms-custom-templates-step3-lambda-create.md) para hacerlo.
+ Para probar la función de Lambda postanotación, debe tener un archivo de datos en Amazon S3 con ejemplos de datos de anotación. Para realizar una prueba sencilla, puede copiar y pegar el siguiente código en un archivo, guardarlo como `sample-annotations.json` y [subirlo a Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/upload-objects.html). Anote el URI de S3 de este archivo; necesita esta información para configurar la prueba de Lambda postanotación.

  ```
  [{"datasetObjectId":"0","dataObject":{"content":"To train a machine learning model, you need a large, high-quality, labeled dataset. Ground Truth helps you build high-quality training datasets for your machine learning models."},"annotations":[{"workerId":"private.us-west-2.0123456789","annotationData":{"content":"{\"crowd-entity-annotation\":{\"entities\":[{\"endOffset\":8,\"label\":\"verb\",\"startOffset\":3},{\"endOffset\":27,\"label\":\"adjective\",\"startOffset\":11},{\"endOffset\":33,\"label\":\"object\",\"startOffset\":28},{\"endOffset\":51,\"label\":\"adjective\",\"startOffset\":46},{\"endOffset\":65,\"label\":\"adjective\",\"startOffset\":53},{\"endOffset\":74,\"label\":\"adjective\",\"startOffset\":67},{\"endOffset\":82,\"label\":\"adjective\",\"startOffset\":75},{\"endOffset\":102,\"label\":\"verb\",\"startOffset\":97},{\"endOffset\":112,\"label\":\"verb\",\"startOffset\":107},{\"endOffset\":125,\"label\":\"adjective\",\"startOffset\":113},{\"endOffset\":134,\"label\":\"adjective\",\"startOffset\":126},{\"endOffset\":143,\"label\":\"object\",\"startOffset\":135},{\"endOffset\":169,\"label\":\"adjective\",\"startOffset\":153},{\"endOffset\":176,\"label\":\"object\",\"startOffset\":170}]}}"}}]},{"datasetObjectId":"1","dataObject":{"content":"Sift 3 cups of flour into the bowl."},"annotations":[{"workerId":"private.us-west-2.0123456789","annotationData":{"content":"{\"crowd-entity-annotation\":{\"entities\":[{\"endOffset\":4,\"label\":\"verb\",\"startOffset\":0},{\"endOffset\":6,\"label\":\"number\",\"startOffset\":5},{\"endOffset\":20,\"label\":\"object\",\"startOffset\":15},{\"endOffset\":34,\"label\":\"object\",\"startOffset\":30}]}}"}}]},{"datasetObjectId":"2","dataObject":{"content":"Jen purchased 10 shares of the stock on Janurary 1st, 2020."},"annotations":[{"workerId":"private.us-west-2.0123456789","annotationData":{"content":"{\"crowd-entity-annotation\":{\"entities\":[{\"endOffset\":3,\"label\":\"person\",\"startOffset\":0},{\"endOffset\":13,\"label\":\"verb\",\"startOffset\":4},{\"endOffset\":16,\"label\":\"number\",\"startOffset\":14},{\"endOffset\":58,\"label\":\"date\",\"startOffset\":40}]}}"}}]},{"datasetObjectId":"3","dataObject":{"content":"The narrative was interesting, however the character development was weak."},"annotations":[{"workerId":"private.us-west-2.0123456789","annotationData":{"content":"{\"crowd-entity-annotation\":{\"entities\":[{\"endOffset\":29,\"label\":\"adjective\",\"startOffset\":18},{\"endOffset\":73,\"label\":\"adjective\",\"startOffset\":69}]}}"}}]}]
  ```
+ Debe seguir las instrucciones para dar permiso [Otorgue permisos de Lambda postanotación para acceder a la anotación](sms-custom-templates-step3-lambda-permissions.md#sms-custom-templates-step3-postlambda-perms) a la función de ejecución de la función Lambda posterior a la anotación para que asuma la función de ejecución de SageMaker IA que utiliza para crear el trabajo de etiquetado. La función Lambda posterior a la anotación utiliza la función de ejecución de SageMaker IA para acceder al archivo de datos de la anotación, en S3. `sample-annotations.json`



## Pruebe la función de Lambda preanotación
<a name="sms-custom-templates-step3-lambda-test-pre-annotation"></a>

Utilice el siguiente procedimiento para probar la función Lambda previa a la anotación creada al implementar la receta Ground Truth AWS Serverless Application Repository (SAR). 

**Pruebe la función de Lambda preanotación de la receta de SAR de Ground Truth**

1. Abra la página [https://console.aws.amazon.com/lambda/home#/functions](https://console.aws.amazon.com/lambda/home#/functions) en la consola de Lambda.

1. Seleccione la función preanotación que se implementó a partir de la receta de SAR de Ground Truth. El nombre de esta función es similar a `serverlessrepo-aws-sagema-GtRecipePreHumanTaskFunc-<id>`.

1. En la sección **Código fuente**, selecciona la flecha situada junto a **Probar**.

1. Seleccione **Configurar un evento de prueba**.

1. Mantenga seleccionada la opción **Crear un evento de prueba nuevo**.

1. En **Plantilla de evento**, selecciona **SageMakerGround Truth PreHumanTask**. 

1. Asigne un **Nombre de evento** a su prueba.

1. Seleccione **Crear**.

1. Seleccione la flecha situada junto a **Probar** otra vez y verá que está seleccionada la prueba que ha creado, que se indica con un punto junto al nombre del evento. Si no está seleccionada, selecciónela. 

1. Seleccione **Probar** para ejecutar la prueba. 

Después de ejecutar la prueba, podrá ver los **Resultados de la ejecución**. En **Registros de la función**, debería ver una respuesta similar a la siguiente:

```
START RequestId: cd117d38-8365-4e1a-bffb-0dcd631a878f Version: $LATEST
Received event: {
  "version": "2018-10-16",
  "labelingJobArn": "arn:aws:sagemaker:us-east-2:123456789012:labeling-job/example-job",
  "dataObject": {
    "source-ref": "s3://sagemakerexample/object_to_annotate.jpg"
  }
}
{'taskInput': {'taskObject': 's3://sagemakerexample/object_to_annotate.jpg'}, 'isHumanAnnotationRequired': 'true'}
END RequestId: cd117d38-8365-4e1a-bffb-0dcd631a878f
REPORT RequestId: cd117d38-8365-4e1a-bffb-0dcd631a878f	Duration: 0.42 ms	Billed Duration: 1 ms	Memory Size: 128 MB	Max Memory Used: 43 MB
```

En esta respuesta, podemos ver que el resultado de la función de Lambda coincide con la sintaxis de respuesta preanotación requerida:

```
{'taskInput': {'taskObject': 's3://sagemakerexample/object_to_annotate.jpg'}, 'isHumanAnnotationRequired': 'true'}
```

## Pruebe la función de Lambda postanotación
<a name="sms-custom-templates-step3-lambda-test-post-annotation"></a>

Utilice el siguiente procedimiento para probar la función Lambda posterior a la anotación creada al implementar la receta Ground Truth AWS Serverless Application Repository (SAR). 

**Pruebe la función de Lambda postanotación de la receta de SAR de Ground Truth**

1. Abra la página [https://console.aws.amazon.com/lambda/home#/functions](https://console.aws.amazon.com/lambda/home#/functions) en la consola de Lambda.

1. Seleccione la función postanotación que se implementó a partir de la receta de SAR de Ground Truth. El nombre de esta función es similar a `serverlessrepo-aws-sagema-GtRecipeAnnotationConsol-<id>`.

1. En la sección **Código fuente**, selecciona la flecha situada junto a **Probar**.

1. Seleccione **Configurar un evento de prueba**.

1. Mantenga seleccionada la opción **Crear un evento de prueba nuevo**.

1. En **Plantilla de evento**, selecciona **SageMakerGround Truth AnnotationConsolidation**.

1. Asigne un **Nombre de evento** a su prueba.

1. Modifique el código de la plantilla de la siguiente manera:
   + Sustituya el nombre del recurso de Amazon (ARN) por el `roleArn` ARN de la función de ejecución de SageMaker IA que utilizó para crear el trabajo de etiquetado.
   + Sustituya el URI de S3 en `s3Uri` por el URI del archivo `sample-annotations.json` que ha añadido a Amazon S3.

   Después de realizar estas modificaciones, la prueba debería tener un aspecto similar al siguiente:

   ```
   {
     "version": "2018-10-16",
     "labelingJobArn": "arn:aws:sagemaker:us-east-2:123456789012:labeling-job/example-job",
     "labelAttributeName": "example-attribute",
     "roleArn": "arn:aws:iam::222222222222:role/sm-execution-role",
     "payload": {
       "s3Uri": "s3://your-bucket/sample-annotations.json"
     }
   }
   ```

1. Seleccione **Crear**.

1. Seleccione la flecha situada junto a **Probar** otra vez y verá que está seleccionada la prueba que ha creado, que se indica con un punto junto al nombre del evento. Si no está seleccionada, selecciónela. 

1. Seleccione **Probar** para ejecutar la prueba. 

Tras ejecutar la prueba, debería ver una sección `-- Consolidated Output --` en los **Registros de las funciones**, que contiene una lista de todas las anotaciones incluidas en `sample-annotations.json`.