Tutorial: Creating an Amazon Rekognition Lambda Application - AWS Kit de ferramentas com Amazon Q

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

Tutorial: Creating an Amazon Rekognition Lambda Application

Este tutorial mostra como criar uma aplicação do Lambda que usa o Amazon Rekognition para marcar objetos do Amazon S3 com rótulos detectados.

Para obter pré-requisitos e informações sobre como configurar o AWS Toolkit for Visual Studio, consulte Usando os modelos AWS Lambda no Toolkit for Visual Studio AWS.

Criar um projeto do Image Rekognition do Lambda do Visual Studio .NET Core

O procedimento a seguir descreve como criar uma aplicação do Lambda do Amazon Rekognition por meio do AWS Toolkit for Visual Studio.

nota

Após a criação, sua aplicação terá uma solução com dois projetos: o projeto de origem, que contém o código da função do Lambda a ser implantado no Lambda, e um projeto de teste que usa o xUnit para testar a função localmente.

Às vezes, o Visual Studio não consegue encontrar todas as NuGet referências para seus projetos. Isso ocorre porque os blueprints exigem dependências que devem ser recuperadas. NuGet Quando novos projetos são criados, o Visual Studio extrai apenas referências locais e não referências remotas de NuGet. Para corrigir NuGet erros: clique com o botão direito do mouse nas referências e escolha Restaurar pacotes.

  1. No Visual Studio, expanda o menu Arquivo, expanda Novo e selecione Projeto.

  2. Na caixa de diálogo Novo projeto, verifique se as caixas suspensas Idioma, Plataforma e Tipo de projeto estão definidas como “Todos…” e insira aws lambda no campo Pesquisar.

  3. Selecione o modelo AWS Lambda com testes (.NET Core - C#).

  4. Clique em Avançar para abrir a caixa de diálogo Configurar novo projeto.

  5. Na caixa de diálogo Configurar seu novo projeto, insira ImageRekognition "" como Nome e preencha os campos restantes de acordo com sua preferência. Clique no botão Criar para prosseguir até a caixa de diálogo Selecionar esquema.

  6. Na caixa de diálogo Selecionar esquema, selecione o esquema Detectar rótulos de imagens e clique em Concluir para criar o projeto do Visual Studio.

    nota

    Esse esquema fornece o código para escutar eventos do Amazon S3 e usa o Amazon Rekognition para detectar rótulos e adicioná-los ao objeto do S3 como tags.

Revisar os arquivos de projeto

As seções a seguir examinam esses arquivos de projeto:

  1. Function.cs

  2. aws-lambda-tools-defaults.json

1. Function.cs

Dentro do arquivo Function.cs, o primeiro segmento do código é o atributo de conjunto, localizado na parte superior do arquivo. Por padrão, o Lambda só aceita parâmetros de entrada e tipos de retorno do tipo System.IO.Stream. Você deve registrar um serializador para usar classes tipadas para parâmetros de entrada e tipos de retorno. O atributo de conjunto registra o serializador JSON do Lambda, que usa Newtonsoft.Json para converter fluxos em classes tipadas. Você pode definir o serializador no nível de assembly ou método.

Veja a seguir um exemplo do atributo de conjunto:

// Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class. [assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]

A classe tem dois construtores. O primeiro é um construtor padrão usado quando o Lambda invoca a função. Esse construtor cria os clientes dos serviços Amazon S3 e Amazon Rekognition. O construtor também recupera AWS as credenciais desses clientes da função do IAM que você atribui à função ao implantá-la. A AWS região dos clientes é definida como a região em que sua função Lambda está sendo executada. Nesse esquema, você só deseja adicionar tags ao objeto do Amazon S3 caso o serviço Amazon Rekognition tenha um nível mínimo de confiança sobre o rótulo. Esse construtor verifica a variável de ambiente MinConfidence para determinar o nível de confiança aceitável. Você pode definir essa variável de ambiente ao implantar a função do Lambda.

Veja a seguir um exemplo do primeiro construtor de classe em Function.cs:

public Function() { this.S3Client = new AmazonS3Client(); this.RekognitionClient = new AmazonRekognitionClient(); var environmentMinConfidence = System.Environment.GetEnvironmentVariable(MIN_CONFIDENCE_ENVIRONMENT_VARIABLE_NAME); if(!string.IsNullOrWhiteSpace(environmentMinConfidence)) { float value; if(float.TryParse(environmentMinConfidence, out value)) { this.MinConfidence = value; Console.WriteLine($"Setting minimum confidence to {this.MinConfidence}"); } else { Console.WriteLine($"Failed to parse value {environmentMinConfidence} for minimum confidence. Reverting back to default of {this.MinConfidence}"); } } else { Console.WriteLine($"Using default minimum confidence of {this.MinConfidence}"); } }

O exemplo a seguir demonstra como é possível utilizar o segundo construtor para testes. O projeto de teste configura os próprios clientes do S3 e do Rekognition e os passa:

public Function(IAmazonS3 s3Client, IAmazonRekognition rekognitionClient, float minConfidence) { this.S3Client = s3Client; this.RekognitionClient = rekognitionClient; this.MinConfidence = minConfidence; }

Veja a seguir um exemplo do método FunctionHandler dentro do arquivo Function.cs.

public async Task FunctionHandler(S3Event input, ILambdaContext context) { foreach(var record in input.Records) { if(!SupportedImageTypes.Contains(Path.GetExtension(record.S3.Object.Key))) { Console.WriteLine($"Object {record.S3.Bucket.Name}:{record.S3.Object.Key} is not a supported image type"); continue; } Console.WriteLine($"Looking for labels in image {record.S3.Bucket.Name}:{record.S3.Object.Key}"); var detectResponses = await this.RekognitionClient.DetectLabelsAsync(new DetectLabelsRequest { MinConfidence = MinConfidence, Image = new Image { S3Object = new Amazon.Rekognition.Model.S3Object { Bucket = record.S3.Bucket.Name, Name = record.S3.Object.Key } } }); var tags = new List(); foreach(var label in detectResponses.Labels) { if(tags.Count < 10) { Console.WriteLine($"\tFound Label {label.Name} with confidence {label.Confidence}"); tags.Add(new Tag { Key = label.Name, Value = label.Confidence.ToString() }); } else { Console.WriteLine($"\tSkipped label {label.Name} with confidence {label.Confidence} because maximum number of tags reached"); } } await this.S3Client.PutObjectTaggingAsync(new PutObjectTaggingRequest { BucketName = record.S3.Bucket.Name, Key = record.S3.Object.Key, Tagging = new Tagging { TagSet = tags } }); } return; }

FunctionHandler é o método que o Lambda chamará depois de construir a instância. O parâmetro de entrada é do tipo S3Event, e não um Stream. Você pode fazer isso por causa do serializador JSON do Lambda registrado. O S3Event contém todas as informações sobre o evento acionado no Amazon S3. A função percorre todos os objetos do S3 que fizeram parte do evento e pede ao Rekognition para detectar rótulos. Depois que os rótulos forem detectados, eles serão adicionados como tags ao objeto do S3.

nota

O código contém chamadas para Console.WriteLine(). Quando a função está em execução no Lambda, todas as chamadas são Console.WriteLine() redirecionadas para o Amazon Logs. CloudWatch

2. aws-lambda-tools-defaults.json

O arquivo aws-lambda-tools-defaults.json contém valores padrão definidos pelo esquema para preencher previamente alguns dos campos no assistente de implantação. Também é útil para definir opções de linha de comandos para integração com a CLI do .NET Core.

Para acessar a integração da CLI do .NET Core, acesse o diretório do projeto da função e digite dotnet lambda help.

nota

O manipulador da função indica qual método o Lambda deve chamar em resposta à função invocada. O formato desse campo é:<assembly-name>::<full-type-name>::<method-name>. O namespace deve ser incluído com o nome do tipo.

Implantar a função

O procedimento a seguir descreve como implantar a função do Lambda.

  1. No Solution Explorer, clique com o botão direito do mouse no projeto Lambda e escolha Publish to AWS Lambda para abrir a janela Upload to. AWS Lambda

    nota

    Os valores predefinidos são recuperados do arquivo aws-lambda-tools-defaults.json.

  2. Na janela Fazer upload no AWS Lambda, insira um nome no campo Nome da função e clique no botão Próximo para avançar até a janela Detalhes avançados da função.

    nota

    Este exemplo usa o Nome da função ImageRekognition.

    AWS Lambda function upload interface with package type, runtime, and configuration options.
  3. Na janela Detalhes avançados da função, selecione um perfil do IAM que conceda permissão ao seu código para acessar seus recursos do Amazon S3 e do Amazon Rekognition.

    nota

    Se você estiver seguindo este exemplo, selecione o perfil AWSLambda_FullAccess.

  4. Defina a variável de ambiente MinConfidence como 60 e selecione Fazer upload para iniciar o processo de implantação. O processo de publicação é concluído quando a visualização da Função é exibida no AWS Explorer.

    AWS Lambda function configuration interface showing permissions, execution, and environment settings.
  5. Após a implantação bem-sucedida, configure o Amazon S3 a fim de enviar os eventos para a nova função. Para isso, acesse a guia Origens de eventos.

  6. Na guia Origens de eventos, clique no botão Adicionar e selecione o bucket do Amazon S3 para conectar à sua função do Lambda.

    nota

    O bucket deve estar na mesma AWS região da sua função Lambda.

Testar a função do

Agora que a função está implantada e um bucket do S3 está configurado como uma fonte de eventos para ele, abra o navegador de buckets do S3 no AWS Explorer para o bucket selecionado por você. Em seguida, faça upload de algumas imagens.

Quando o upload estiver concluído, você poderá confirmar se a função foi executada observando os logs na visualização da função. Ou clique com o botão direito do mouse no navegador de buckets e escolha Properties (Propriedades). Na guia Tags, você pode visualizar as tags que foram aplicadas ao objeto.

Properties window showing metadata tags for an image file in a cloud storage bucket.