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.
Uso de Amazon Rekognition y Lambda para etiquetar activos en un bucket de Amazon S3
En este tutorial, creará una AWS Lambda función que etiquete automáticamente los activos digitales ubicados en un bucket de Amazon S3. La función de Lambda lee todos los objetos de un bucket de Amazon S3 determinado. Para cada objeto del bucket, pasa la imagen al servicio Amazon Rekognition para generar una serie de etiquetas. Cada etiqueta se usa para crear una etiqueta que se aplica a la imagen. Tras ejecutar la función de Lambda, esta crea automáticamente etiquetas basadas en todas las imágenes de un determinado bucket de Amazon S3 y las aplica a las imágenes.
Por ejemplo, supongamos que ejecuta la función de Lambda y tiene esta imagen en un bucket de Amazon S3.

A continuación, la aplicación crea etiquetas automáticamente y las aplica a la imagen.

nota
Los servicios que utiliza en este tutorial forman parte de la capa AWS gratuita. Cuando termine con el tutorial, le recomendamos que termine todos los recursos que haya creado durante el tutorial para que no se le cobre nada.
En este tutorial se utiliza la versión 2 del AWS SDK for Java. Consulte el GitHub repositorio de ejemplos del SDK de AWS documentación
Temas
Requisitos previos
Antes de empezar, debe completar los pasos de Configuración del AWS SDK para Java. Después, asegúrese de cuenta con lo siguiente:
Java 1.8 JDK.
Maven 3.6 o superior.
Un bucket de Amazon S3 con entre 5 y 7 imágenes de la naturaleza. La función de Lambda lee estas imágenes.
Configuración del rol de IAM para Lambda
En este tutorial se utilizan los servicios Amazon Rekognition y Amazon S3. Configure la función lambda-support para que tenga políticas que le permitan invocar estos servicios desde una función de Lambda.
Para configurar el rol
Inicie sesión en la consola de IAM AWS Management Console y ábrala en https://console.aws.amazon.com/iam/
. -
En el panel de navegación, elija Roles y, a continuación, Crear rol.
-
Elija Servicio de AWS y, a continuación, Lambda.
-
Elija la pestaña Permisos.
-
Busque la opción AWSLambdaBasicExecutionRole.
-
Elija Siguiente: etiquetas.
-
Elija Revisar.
-
Asigne el nombre lambda-support al rol.
-
Elija Crear rol.
-
Seleccione lambda-support para ver la página de información general.
-
Seleccione Asociar políticas.
-
Elija una AmazonRekognitionFullAccessde las políticas de la lista.
-
Elija Asociar política.
-
Busque AmazonS3 yFullAccess, a continuación, seleccione Adjuntar política.
Creación del proyecto
Cree un nuevo proyecto de Java y, a continuación, configure el archivo pom.xml de Maven con los ajustes y dependencias necesarios. Asegúrese de que el archivo pom.xml tiene el siguiente aspecto:
<?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>
Escribir el código
Utilice la API AWS Lambda de Java en tiempo de ejecución para crear la clase Java que define la función Lambda. En este ejemplo, hay una clase de Java para la función de Lambda denominada Handler y se requieren clases adicionales para este caso de uso. En el siguiente gráfico, se muestran las clases de Java en el proyecto. Observe que todas las clases de Java se encuentran en un paquete denominado com.example.tags.

Cree las siguientes clases de Java para el código:
Handler usa la API de tiempo de ejecución Lambda Java y lleva a cabo el caso de uso descrito en este tutorial. AWS La lógica de la aplicación que se ejecuta se encuentra en el método handleRequest.
S3Service usa la API de Amazon S3 para realizar operaciones de S3.
AnalyzePhotosutiliza la API Amazon Rekognition para analizar las imágenes.
BucketItemdefine un modelo que almacena la información del bucket de Amazon S3.
WorkItemdefine un modelo que almacena los datos de Amazon Rekognition.
Clase Handler
Este código Java representa la clase Handler. La clase lee un indicador que se pasa a la función de Lambda. El servicio S3. ListBucketObjectsdevuelve un objeto List donde cada elemento es un valor de cadena que representa la clave del objeto. Si el valor del indicador es verdadero, las etiquetas se aplican iterando por la lista y aplicándolas a cada objeto mediante una llamada al método s3Service.tagAssets. Si el valor del indicador es falso, entonces el S3Service. deleteTagFromSe invoca el método Object que elimina las etiquetas. Además, ten en cuenta que puedes registrar mensajes en CloudWatch los registros de Amazon mediante un LambdaLoggerobjeto.
nota
Asegúrese de asignar el nombre de su bucket a la variable 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; } }
Clase de servicio de S3
La siguiente clase usa la API de Amazon S3 para realizar operaciones de S3. Por ejemplo, el getObjectBytesmétodo devuelve una matriz de bytes que representa la imagen. Del mismo modo, el listBucketObjectsmétodo devuelve un objeto List en el que cada elemento es un valor de cadena que especifica el nombre de la clave.
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 clase
El siguiente código Java representa la AnalyzePhotosclase. Esta clase utiliza la API de Amazon Rekognition para analizar las imágenes.
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 clase
El siguiente código Java representa la BucketItemclase que almacena los datos de objetos de 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 clase
El siguiente código Java representa la WorkItemclase.
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; } }
Empaquetar el proyecto
Empaquete el proyecto en un archivo.jar (JAR) mediante el siguiente comando de Maven.
mvn package
El archivo JAR se encuentra en la carpeta de destino (que es una carpeta secundaria de la carpeta del proyecto).

nota
Observe el uso de maven-shade-pluginen el archivo POM del proyecto. Este complemento es responsable de crear un JAR que contenga las dependencias necesarias. Si intentas empaquetar el proyecto sin este complemento, las dependencias necesarias no se incluyen en el archivo JAR y encontrarás un ClassNotFoundException.
Implementación de la función de Lambda
Abra la consola de Lambda
. Elija Crear función.
Elija Crear desde cero.
En la sección Información básica, introduzca cron como nombre.
En Tiempo de ejecución, elija Java 8.
Elija Usar un rol existente y, a continuación, elija lambda-support (el rol de IAM que creó).
Seleccione Crear función.
Para Tipo de entrada de código, elija Cargar un archivo .zip.
Seleccione Cargar y, a continuación, busque el archivo JAR que creó.
Para Handler, introduzca el nombre completo de la función, por ejemplo, com.example.tags.Handler:handleRequest (com.example.tags especifica el paquete, Handler es la clase seguida de :: y el nombre del método).
Seleccione Guardar.
Probar el método Lambda
En este punto del tutorial, puede probar la función de Lambda.
En la consola de Lambda, haga clic en la pestaña Prueba y, a continuación, introduzca el siguiente JSON.
{ "flag": "true" }
nota
Al transferir true se etiquetan los activos digitales y al transferir false se eliminan las etiquetas.
Pulse el botón Invocar. Tras invocar la función de Lambda, verá un mensaje de éxito.
Enhorabuena, ha creado una AWS Lambda función que aplica etiquetas automáticamente a los activos digitales ubicados en un bucket de Amazon S3. Como se indicó al principio de este tutorial, recuerde cancelar todos los recursos que creó mientras realiza este tutorial para asegurarse de que no se le cobre nada.
Para ver más ejemplos de AWS varios servicios, consulte el repositorio de ejemplos del SDK de AWS documentación