

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Analisando imagens com uma AWS Lambda função
<a name="ex-lambda"></a>

AWS Lambda é um serviço de computação que permite executar código sem provisionar ou gerenciar servidores. Por exemplo, você pode analisar imagens enviadas de um aplicativo móvel sem precisar criar um servidor para hospedar o código do aplicativo. As instruções a seguir mostram como criar uma função do Lambda em Python que chame [DetectCustomLabels](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_DetectCustomLabels). A função analisa uma imagem fornecida e retorna uma lista de rótulos encontrados na imagem. As instruções incluem um exemplo de código em Python que mostra como chamar a função do Lambda com uma imagem em um bucket do Amazon S3 ou uma imagem fornecida por um computador local. 

**Topics**
+ [

## Etapa 1: criar uma AWS Lambda função (console)
](#example-lambda-create-function)
+ [

## Etapa 2: (opcional) crie uma camada (console)
](#example-lambda-create-layer)
+ [

## Etapa 3: adicione o código em Python (console)
](#example-lambda-add-code)
+ [

## Etapa 4: teste sua função do Lambda
](#example-lambda-test)

## Etapa 1: criar uma AWS Lambda função (console)
<a name="example-lambda-create-function"></a>

Nesta etapa, você cria uma AWS função vazia e uma função de execução do IAM que permite que sua função chame a `DetectCustomLabels` operação. Ele também concede acesso ao bucket do Amazon S3 que armazena imagens para análise. Também é possível especificar variáveis de ambiente para o seguinte:
+ O modelo do Amazon Rekognition Custom Labels que você deseja que sua função do Lambda use.
+ O limite de confiança que você deseja que o modelo use.

Posteriormente, você adiciona o código-fonte e, opcionalmente, uma camada à função do Lambda.

**Para criar uma AWS Lambda função (console)**

1. Faça login no Console de gerenciamento da AWS e abra o AWS Lambda console em [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/).

1. Escolha a opção **Criar função**. Para obter mais informações, consulte [Criar uma função do Lambda no console](https://docs.aws.amazon.com/lambda/latest/dg/getting-started-create-function.html).

1. Escolha as seguintes opções:
   + Escolha **Criar do zero**. 
   + Insira um valor para **Nome da função**.
   + Em **Runtime**, escolha **Python 3.10**.

1. Escolha **Criar função** para criar a função do AWS Lambda .

1. Em sua página da função, escolha a guia **Configuração**.

1. No painel **Variáveis de ambiente**, escolha **Editar**.

1. Adicione as seguintes variáveis de ambiente: Para cada variável, escolha **Adicionar variável de ambiente**, e insira a chave e o valor da variável.     
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/rekognition/latest/customlabels-dg/ex-lambda.html)

1. Escolha **Salvar** para salvar as variáveis de ambiente.

1. No painel **Permissões**, em **Nome do perfil**, selecione a o perfil de execução para abri-lo no console do IAM.

1. Na guia **Permissões**, escolha **Adicionar permissões** e **Criar política em linha**.

1. Escolha **JSON** e substitua a política padrão com a política a seguir.

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

****  

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

------

1. Escolha **Próximo**.

1. Em **Detalhes da política**, insira um nome para a política, como *DetectCustomLabels-access*.

1. Escolha **Criar política**.

1. Se estiver armazenando imagens para análise em um bucket do Amazon S3, repita as etapas 10 a 14. 

   1. Para a etapa 11, use a política a seguir. *bucket/folder path*Substitua as imagens que você deseja analisar pelo bucket e pelo caminho da pasta do Amazon S3. 

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

****  

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

------

   1. Para a etapa 13, escolha um nome de política diferente, como *S3Bucket-access*.

## Etapa 2: (opcional) crie uma camada (console)
<a name="example-lambda-create-layer"></a>

Para executar este exemplo, não é preciso executar esta etapa. A `DetectCustomLabels` operação está incluída no ambiente padrão do Lambda Python como parte do AWS SDK for Python (Boto3). Se outras partes da sua função do Lambda precisarem de atualizações de AWS serviço recentes que não estejam no ambiente padrão do Lambda Python, siga esta etapa para adicionar a versão mais recente do SDK do Boto3 como uma camada à sua função. 

Primeiro, você cria um arquivo .zip que pode conter o SDK do Boto3. Uma camada é criada o arquivo de arquivos.zip é adicionado à camada. Para obter mais informações, consulte [Como usar camadas com sua função do Lambda](https://docs.aws.amazon.com/lambda/latest/dg/invocation-layers.html#invocation-layers-using).

**Para criar e adicionar uma camada (console)**

1. Abra um prompt de comando e execute os comandos a seguir.

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

1. Observe o nome do arquivo zip (boto3-layer.zip). Ele será necessário na etapa 6 deste procedimento.

1. Abra o AWS Lambda console em [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/).

1. No painel de navegação, escolha **Camadas**. 

1. Escolha **Criar camada**.

1. Insira valores para **Nome** e **Descrição**.

1. Escolha **Fazer upload de um arquivo .zip** e escolha **Fazer upload**.

1. Na caixa de diálogo, escolha o arquivo de arquivos.zip (boto3-layer.zip) criada na etapa 1 desse procedimento.

1. Para runtimes compatíveis, escolha **Python 3.9**.

1. Escolha **Criar** para criar a camada.

1. Escolha o ícone do menu do painel de navegação.

1. Selecione **Funções** no painel de navegação.

1. Na lista de recursos, escolha a função que você criou em [Etapa 1: criar uma AWS Lambda função (console)](#example-lambda-create-function). 

1. Escolha a guia **Código**.

1. Na seção **Camadas**, escolha **Adicionar uma camada**.

1. Escolha **camadas personalizadas**.

1. Em **Camadas personalizadas**, escolha o nome da camada que você inseriu na etapa 6. 

1. Em **Versão**, escolha a versão da camada, que deve ser 1.

1. Escolha **Adicionar**.

## Etapa 3: adicione o código em Python (console)
<a name="example-lambda-add-code"></a>

Nesta etapa, o código em Python é adicionado à sua função do Lambda usando o editor de código do console do Lambda. O código analisa uma imagem fornecida com `DetectCustomLabels` e retorna uma lista de rótulos encontrados na imagem. A imagem fornecida pode estar localizada em um bucket do Amazon S3 ou fornecida como bytes de imagem codificados em byte64.

**Para adicionar um código em Python (console)**

1. Se não estiver no console do Lambda, faça o seguinte:

   1. Abra o AWS Lambda console em [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/).

   1. Abra a função do Lambda que você criou em [Etapa 1: criar uma AWS Lambda função (console)](#example-lambda-create-function).

1. Escolha a guia **Código**.

1. Em **Código-fonte**, substitua o código em **lambda\$1function.py** pelo seguinte: 

   ```
   # 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. Escolha **Implantar** para implantar sua função do Lambda.

## Etapa 4: teste sua função do Lambda
<a name="example-lambda-test"></a>

Nesta etapa, o código em Python é usado em seu computador para passar uma imagem local, ou uma imagem em um bucket do Amazon S3, para sua função do Lambda. As imagens passadas de um computador local devem ter menos de 6.291.456 bytes. Se suas imagens forem maiores, faça o upload das imagens em um bucket do Amazon S3 e chame o script com o caminho do Amazon S3 para a imagem. Para obter mais informações sobre como fazer upload de arquivos para um bucket do Amazon S3, consulte [Fazer upload de objetos](https://docs.aws.amazon.com/AmazonS3/latest/userguide/upload-objects.html).

Certifique-se de executar o código na mesma AWS região em que você criou a função Lambda. [Você pode visualizar a AWS região da sua função Lambda na barra de navegação da página de detalhes da função no console do Lambda.](https://console.aws.amazon.com/lambda/)

Se a AWS Lambda função retornar um erro de tempo limite, estenda o período de tempo limite da função Lambda. Para obter mais informações, consulte [Configurando o tempo limite da função](https://docs.aws.amazon.com/lambda/latest/dg/configuration-function-common.html#configuration-timeout-console) (console).

Para obter mais informações sobre como invocar uma função Lambda a partir do seu código, [consulte AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/invoking-lambda-functions.html) Invocando funções. 

**Para testar a função do Lambda**

1. Certifique-se de que você tem a permissão `lambda:InvokeFunction`. É possível usar a política a seguir. 

   É possível obter o ARN para sua função do Lambda na visão geral da função no [console do Lambda.](https://console.aws.amazon.com/lambda/)

   Para conceder acesso, adicione as permissões aos seus usuários, grupos ou perfis:
   + Usuários e grupos em Centro de Identidade do AWS IAM:

     Crie um conjunto de permissões. Siga as instruções em [Criação de um conjunto de permissões](https://docs.aws.amazon.com//singlesignon/latest/userguide/howtocreatepermissionset.html) no *Guia do usuário do Centro de Identidade do AWS IAM *.
   + Usuários gerenciados no IAM com provedor de identidades:

     Crie um perfil para a federação de identidades. Siga as instruções em [Criando um perfil para um provedor de identidades de terceiros (federação)](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_roles_create_for-idp.html) no *Guia do Usuário do IAM*.
   + Usuários do IAM:
     + Crie um perfil que seu usuário possa assumir. Siga as instruções em [Criação de um perfil para um usuário do IAM](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_roles_create_for-user.html) no *Guia do usuário do IAM*.
     + (Não recomendado) Vincule uma política diretamente a um usuário ou adicione um usuário a um grupo de usuários. Siga as instruções em [Adição de permissões a um usuário (console)](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_users_change-permissions.html#users_change_permissions-add-console) no *Guia do usuário do IAM*.

1. Instale e configure o AWS SDK para Python. Para obter mais informações, consulte [Etapa 4: configurar o AWS CLI e AWS SDKs](su-awscli-sdk.md).

1. [Inicie o modelo](rm-start.md) que você especificou na etapa 7 de [Etapa 1: criar uma AWS Lambda função (console)](#example-lambda-create-function).

1. Salve o código a seguir em um arquivo chamado `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. Execute o código. Para o argumento da linha de comando, forneça o nome da função do Lambda e a imagem que você deseja analisar. É possível fornecer um caminho para uma imagem local ou o caminho do S3 para uma imagem armazenada em um bucket do Amazon S3. Por exemplo:

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

   Se a imagem estiver em um bucket do Amazon S3, certifique-se de que seja o mesmo bucket que você especificou na etapa 15 de [Etapa 1: criar uma AWS Lambda função (console)](#example-lambda-create-function).

   Se for bem-sucedida, a saída será uma lista de rótulos encontrados na imagem. Se nenhum rótulo for retornado, considere reduzir o valor de confiança que você definiu na etapa 7 do [Etapa 1: criar uma AWS Lambda função (console)](#example-lambda-create-function).

1. Se você tiver concluído a função do Lambda e o modelo não for usado por outras aplicações, [interrompa o modelo](rm-stop.md). [Inicie o modelo](rm-start.md) na próxima vez que quiser usar a função do Lambda. 