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á.
Usando o Amazon Rekognition e o Lambda para marcar ativos em um bucket do Amazon S3
Neste tutorial, você cria uma AWS Lambda função que marca automaticamente ativos digitais localizados em um bucket do Amazon S3. A função do Lambda lê todos os objetos em um determinado bucket do Amazon S3. Para cada objeto no bucket, ele passa a imagem ao serviço do Amazon Rekognition para gerar uma série de rótulos. Cada rótulo é usado para criar uma tag que é aplicada à imagem. Depois de executar a função do Lambda, ela cria automaticamente tags com base em todas as imagens em um determinado bucket do Amazon S3 e as aplica às imagens.
Por exemplo, suponha que você execute a função do Lambda e tenha essa imagem em um bucket do Amazon S3.

Em seguida, o aplicativo cria automaticamente as tags e as aplica à imagem.

nota
Os serviços que você usa neste tutorial fazem parte do nível AWS gratuito. Quando você terminar o tutorial, recomendamos encerrar todos os recursos que você criou durante o tutorial para que você não seja cobrado.
Este tutorial usa o AWS SDK for Java versão 2. Consulte o GitHub repositório de exemplos do SDK de AWS documentação para obter tutoriais
Tópicos
Pré-requisitos
Antes de começar, você precisa concluir as etapas em Configurar o AWS SDK for Java. Em seguida, verifique se você tem o seguinte:
JDK Java 1.8.
Maven 3.6 ou superior.
Um bucket do Amazon S3 com 5 a 7 imagens da natureza. Essas imagens são lidas pela função do Lambda.
Configurar o perfil IAM do Lambda
Este tutorial usa os serviços Amazon Rekognition e Amazon S3. Configure a função do Lambda-support para ter políticas que permitam invocar esses serviços a partir de uma função do Lambda.
Para configurar a função
Faça login no AWS Management Console e abra o console do IAM em https://console.aws.amazon.com/iam/
. -
No painel de navegação, escolha Funções e, em seguida, escolha Criar função.
-
Escolha AWS serviço e, em seguida, escolha Lambda.
-
Escolha a aba Permissões.
-
Pesquise por AWSLambdaBasicExecutionRole.
-
Escolha Próximas tags.
-
Escolha Revisar.
-
Nomeie a função do Lambda-support.
-
Selecione Criar perfil.
-
Escolha lambda-support para visualizar a página de visão geral.
-
Escolha Anexar políticas.
-
AmazonRekognitionFullAccessEscolha na lista de políticas.
-
Escolha Anexar política.
-
Pesquise o AmazonS3 e escolha FullAccess Anexar política.
Criar o projeto
Crie um novo projeto Java e, em seguida, configure o pom.xml do Maven com as configurações e dependências necessárias. Certifique-se de que seu arquivo pom.xml tenha a seguinte aparência:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>WorkflowTagAssets</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <name>java-basic-function</name> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>bom</artifactId> <version>2.10.54</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-lambda-java-core</artifactId> <version>1.2.1</version> </dependency> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.6</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.10.0</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.13.0</version> <scope>test</scope> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j18-impl</artifactId> <version>2.13.3</version> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>5.6.0</version> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <version>5.6.0</version> <scope>test</scope> </dependency> <dependency> <groupId>com.googlecode.json-simple</groupId> <artifactId>json-simple</artifactId> <version>1.1.1</version> </dependency> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>s3</artifactId> </dependency> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>rekognition</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.2</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.2.2</version> <configuration> <createDependencyReducedPom>false</createDependencyReducedPom> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build> </project>
Escreva o código
Use a API Java AWS Lambda de tempo de execução para criar a classe Java que define a função Lambda. Neste exemplo, há uma classe Java para a função do Lambda chamada Manipulador e classes adicionais necessárias para esse caso de uso. A figura a seguir mostra as classes Java no projeto. Observe que todas as classes Java estão localizadas em um pacote chamado com.example.tags.

Crie as seguintes classes Java para o código:
O Handler usa a API de tempo de execução Lambda Java e executa o caso de uso descrito neste tutorial. AWS A lógica do aplicativo que é executada está localizada no método handleRequest.
O S3Service usa a API Amazon S3 para realizar operações do S3.
AnalyzePhotosusa a API Amazon Rekognition para analisar as imagens.
BucketItemdefine um modelo que armazena informações do bucket do Amazon S3.
WorkItemdefine um modelo que armazena dados do Amazon Rekognition.
Classe Handler
Esse código Java representa a classe Handler. A classe lê um sinalizador que é passado para a função do Lambda. O serviço S3. ListBucketObjectsO método retorna um objeto List em que cada elemento é um valor de string que representa a chave do objeto. Se o valor do sinalizador for verdadeiro, as tags serão aplicadas iterando pela lista e aplicando tags a cada objeto chamando o método s3Service.tagAssets . Se o valor do sinalizador for falso, então o S3Service. deleteTagFromÉ invocado um método de objeto que exclui as tags. Além disso, observe que você pode registrar mensagens CloudWatch nos registros da Amazon usando um LambdaLoggerobjeto.
nota
Certifique-se de atribuir o nome do seu bucket à variável bucketName.
package com.example.tags; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; import com.amazonaws.services.lambda.runtime.LambdaLogger; import java.util.ArrayList; import java.util.List; import java.util.Map; public class Handler implements RequestHandler<Map<String,String>, String> { @Override public String handleRequest(Map<String, String> event, Context context) { LambdaLogger logger = context.getLogger(); String delFlag = event.get("flag"); logger.log("FLAG IS: " + delFlag); S3Service s3Service = new S3Service(); AnalyzePhotos photos = new AnalyzePhotos(); String bucketName = "<Enter your bucket name>"; List<String> myKeys = s3Service.listBucketObjects(bucketName); if (delFlag.compareTo("true") == 0) { // Create a List to store the data. List<ArrayList<WorkItem>> myList = new ArrayList<>(); // loop through each element in the List and tag the assets. for (String key : myKeys) { byte[] keyData = s3Service.getObjectBytes(bucketName, key); // Analyze the photo and return a list where each element is a WorkItem. ArrayList<WorkItem> item = photos.detectLabels(keyData, key); myList.add(item); } s3Service.tagAssets(myList, bucketName); logger.log("All Assets in the bucket are tagged!"); } else { // Delete all object tags. for (String key : myKeys) { s3Service.deleteTagFromObject(bucketName, key); logger.log("All Assets in the bucket are deleted!"); } } return delFlag; } }
Classe S3Service
A classe a seguir usa a API do Amazon S3 para realizar operações do S3. Por exemplo, o getObjectBytesmétodo retorna uma matriz de bytes que representa a imagem. Da mesma forma, o listBucketObjectsmétodo retorna um objeto List em que cada elemento é um valor de string que especifica o nome da chave.
package com.example.tags; import software.amazon.awssdk.core.ResponseBytes; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.s3.S3Client; import software.amazon.awssdk.services.s3.model.GetObjectRequest; import software.amazon.awssdk.services.s3.model.PutObjectTaggingRequest; import software.amazon.awssdk.services.s3.model.GetObjectResponse; import software.amazon.awssdk.services.s3.model.S3Exception; import software.amazon.awssdk.services.s3.model.ListObjectsResponse; import software.amazon.awssdk.services.s3.model.S3Object; import software.amazon.awssdk.services.s3.model.GetObjectTaggingResponse; import software.amazon.awssdk.services.s3.model.ListObjectsRequest; import java.util.ArrayList; import java.util.List; import software.amazon.awssdk.services.s3.model.Tagging; import software.amazon.awssdk.services.s3.model.Tag; import software.amazon.awssdk.services.s3.model.GetObjectTaggingRequest; import software.amazon.awssdk.services.s3.model.DeleteObjectTaggingRequest; public class S3Service { private S3Client getClient() { Region region = Region.US_WEST_2; return S3Client.builder() .region(region) .build(); } public byte[] getObjectBytes(String bucketName, String keyName) { S3Client s3 = getClient(); try { GetObjectRequest objectRequest = GetObjectRequest .builder() .key(keyName) .bucket(bucketName) .build(); // Return the byte[] from this object. ResponseBytes<GetObjectResponse> objectBytes = s3.getObjectAsBytes(objectRequest); return objectBytes.asByteArray(); } catch (S3Exception e) { System.err.println(e.awsErrorDetails().errorMessage()); System.exit(1); } return null; } // Returns the names of all images in the given bucket. public List<String> listBucketObjects(String bucketName) { S3Client s3 = getClient(); String keyName; List<String> keys = new ArrayList<>(); try { ListObjectsRequest listObjects = ListObjectsRequest .builder() .bucket(bucketName) .build(); ListObjectsResponse res = s3.listObjects(listObjects); List<S3Object> objects = res.contents(); for (S3Object myValue: objects) { keyName = myValue.key(); keys.add(keyName); } return keys; } catch (S3Exception e) { System.err.println(e.awsErrorDetails().errorMessage()); System.exit(1); } return null; } // Tag assets with labels in the given list. public void tagAssets(List myList, String bucketName) { try { S3Client s3 = getClient(); int len = myList.size(); String assetName = ""; String labelName = ""; String labelValue = ""; // Tag all the assets in the list. for (Object o : myList) { // Need to get the WorkItem from each list. List innerList = (List) o; for (Object value : innerList) { WorkItem workItem = (WorkItem) value; assetName = workItem.getKey(); labelName = workItem.getName(); labelValue = workItem.getConfidence(); tagExistingObject(s3, bucketName, assetName, labelName, labelValue); } } } catch (S3Exception e) { System.err.println(e.awsErrorDetails().errorMessage()); System.exit(1); } } // This method tags an existing object. private void tagExistingObject(S3Client s3, String bucketName, String key, String label, String LabelValue) { try { // First need to get existing tag set; otherwise the existing tags are overwritten. GetObjectTaggingRequest getObjectTaggingRequest = GetObjectTaggingRequest.builder() .bucket(bucketName) .key(key) .build(); GetObjectTaggingResponse response = s3.getObjectTagging(getObjectTaggingRequest); // Get the existing immutable list - cannot modify this list. List<Tag> existingList = response.tagSet(); ArrayList<Tag> newTagList = new ArrayList(new ArrayList<>(existingList)); // Create a new tag. Tag myTag = Tag.builder() .key(label) .value(LabelValue) .build(); // push new tag to list. newTagList.add(myTag); Tagging tagging = Tagging.builder() .tagSet(newTagList) .build(); PutObjectTaggingRequest taggingRequest = PutObjectTaggingRequest.builder() .key(key) .bucket(bucketName) .tagging(tagging) .build(); s3.putObjectTagging(taggingRequest); System.out.println(key + " was tagged with " + label); } catch (S3Exception e) { System.err.println(e.awsErrorDetails().errorMessage()); System.exit(1); } } // Delete tags from the given object. public void deleteTagFromObject(String bucketName, String key) { try { DeleteObjectTaggingRequest deleteObjectTaggingRequest = DeleteObjectTaggingRequest.builder() .key(key) .bucket(bucketName) .build(); S3Client s3 = getClient(); s3.deleteObjectTagging(deleteObjectTaggingRequest); } catch (S3Exception e) { System.err.println(e.awsErrorDetails().errorMessage()); System.exit(1); } } }
AnalyzePhotos classe
O código Java a seguir representa a AnalyzePhotosclasse. Essa classe usa a API Amazon Rekognition para analisar as imagens.
package com.example.tags; import software.amazon.awssdk.auth.credentials.EnvironmentVariableCredentialsProvider; import software.amazon.awssdk.core.SdkBytes; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.rekognition.RekognitionClient; import software.amazon.awssdk.services.rekognition.model.Image; import software.amazon.awssdk.services.rekognition.model.DetectLabelsRequest; import software.amazon.awssdk.services.rekognition.model.DetectLabelsResponse; import software.amazon.awssdk.services.rekognition.model.Label; import software.amazon.awssdk.services.rekognition.model.RekognitionException; import java.util.ArrayList; import java.util.List; public class AnalyzePhotos { // Returns a list of WorkItem objects that contains labels. public ArrayList<WorkItem> detectLabels(byte[] bytes, String key) { Region region = Region.US_EAST_2; RekognitionClient rekClient = RekognitionClient.builder() .credentialsProvider(EnvironmentVariableCredentialsProvider.create()) .region(region) .build(); try { SdkBytes sourceBytes = SdkBytes.fromByteArray(bytes); // Create an Image object for the source image. Image souImage = Image.builder() .bytes(sourceBytes) .build(); DetectLabelsRequest detectLabelsRequest = DetectLabelsRequest.builder() .image(souImage) .maxLabels(10) .build(); DetectLabelsResponse labelsResponse = rekClient.detectLabels(detectLabelsRequest); // Write the results to a WorkItem instance. List<Label> labels = labelsResponse.labels(); ArrayList<WorkItem> list = new ArrayList<>(); WorkItem item ; for (Label label: labels) { item = new WorkItem(); item.setKey(key); // identifies the photo. item.setConfidence(label.confidence().toString()); item.setName(label.name()); list.add(item); } return list; } catch (RekognitionException e) { System.out.println(e.getMessage()); System.exit(1); } return null ; } }
BucketItem classe
O código Java a seguir representa a BucketItemclasse que armazena dados de objetos do Amazon S3.
package com.example.tags; public class BucketItem { private String key; private String owner; private String date ; private String size ; public void setSize(String size) { this.size = size ; } public String getSize() { return this.size ; } public void setDate(String date) { this.date = date ; } public String getDate() { return this.date ; } public void setOwner(String owner) { this.owner = owner ; } public String getOwner() { return this.owner ; } public void setKey(String key) { this.key = key ; } public String getKey() { return this.key ; } }
WorkItem classe
O código Java a seguir representa a WorkItemclasse.
package com.example.tags; public class WorkItem { private String key; private String name; private String confidence ; public void setKey (String key) { this.key = key; } public String getKey() { return this.key; } public void setName (String name) { this.name = name; } public String getName() { return this.name; } public void setConfidence (String confidence) { this.confidence = confidence; } public String getConfidence() { return this.confidence; } }
Empacote o projeto
Empacote o projeto em um arquivo.jar (JAR) usando o seguinte comando Maven.
mvn package
O arquivo JAR está localizado na pasta de destino (que é uma pasta secundária da pasta do projeto).

nota
Observe o uso do maven-shade-pluginno arquivo POM do projeto. Esse plugin é responsável por criar um JAR que contém as dependências necessárias. Se você tentar empacotar o projeto sem esse plug-in, as dependências necessárias não serão incluídas no arquivo JAR e você encontrará um ClassNotFoundException.
Implante a função do Lambda
Abra o console do lambda
. Escolha Criar função.
Escolha Author from scratch (Criar do zero).
Na seção Informações básicas, insira cron como nome.
No Runtime, escolha Java 8.
Escolha Usar um perfil existente e, em seguida, escolha lambda-support (o perfil do IAM que você criou).
Escolha a opção Criar função.
Em Tipo de entrada de código, escolha Fazer upload de um arquivo.zip ou.jar.
Escolha Upload e, em seguida, navegue até o arquivo JAR que você criou.
Para Handler, digite o nome totalmente qualificado da função, por exemplo, com.example.tags.Handler:handleRequest (com.example.tags especifica o pacote, Handler é a classe seguida de :: e o nome do método).
Escolha Salvar.
Teste o método Lambda
Neste ponto do tutorial, você pode testar a função do Lambda.
No console do Lambda, clique na guia Testar e insira o seguinte JSON.
{ "flag": "true" }
nota
Passar tags verdadeiras para os ativos digitais e passar falsas exclui as tags.
Escolha o botão Invocar. Depois que a função do Lambda é invocada, você vê uma mensagem de sucesso.
Parabéns, você criou uma AWS Lambda função que aplica automaticamente tags a ativos digitais localizados em um bucket do Amazon S3. Conforme declarado no início deste tutorial, não se esqueça de encerrar todos os recursos que você criou ao passar por este tutorial para garantir que você não seja cobrado.
Para ver mais exemplos AWS de vários serviços, consulte o repositório de exemplos GitHub do SDK de AWS documentação