Menggunakan Amazon Rekognition dan Lambda untuk menandai aset di bucket Amazon S3 - Amazon Rekognition

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Menggunakan Amazon Rekognition dan Lambda untuk menandai aset di bucket Amazon S3

Dalam tutorial ini, Anda membuat AWS Lambda fungsi yang secara otomatis menandai aset digital yang terletak di bucket Amazon S3. Fungsi Lambda membaca semua objek dalam bucket Amazon S3 yang diberikan. Untuk setiap objek dalam bucket, itu meneruskan citra ke layanan Amazon Rekognition untuk menghasilkan serangkaian label. Setiap label digunakan untuk membuat tanda yang diterapkan pada citra. Setelah Anda menjalankan fungsi Lambda, itu secara otomatis membuat tanda berdasarkan semua citra dalam bucket Amazon S3 yang diberikan dan menerapkannya pada citra.

Sebagai contoh, asumsikan Anda menjalankan fungsi Lambda dan Anda memiliki citra ini dalam bucket Amazon S3.

Gunung berapi meletus dengan lava cair mengalir di sisinya melawan langit berawan.

Aplikasi kemudian secara otomatis membuat tanda dan menerapkannya pada citra.

Tabel yang menunjukkan tag untuk melacak biaya penyimpanan, termasuk Alam, Gunung Berapi, Letusan, Lava, Gunung, dan Luar Ruangan dengan nilai numerik.
catatan

Layanan yang Anda gunakan dalam tutorial ini adalah bagian dari Tingkat AWS Gratis. Ketika Anda telah menyelesaikan tutorial, kami merekomendasikan untuk mengakhiri sumber daya apa pun yang Anda buat selama tutorial sehingga Anda tidak dikenakan biaya.

Tutorial ini menggunakan AWS SDK for Java versi 2. Lihat GitHub repositori contoh SDK AWS Dokumentasi untuk tutorial Java V2 tambahan.

Prasyarat

Sebelum memulai, Anda perlu menyelesaikan langkah-langkah dalam Menyiapkan AWS SDK for Java. Kemudian pastikan bahwa Anda memiliki hal berikut ini:

  • Java 1.8 JDK.

  • Maven 3.6 atau lebih tinggi.

  • Bucket Amazon S3 dengan 5-7 citra alam di dalamnya. Citra ini dibaca oleh fungsi Lambda.

Konfigurasikan peran Lambda IAM

Tutorial ini menggunakan layanan Amazon Rekognition dan Amazon S3. Konfigurasi peran lambda-support untuk memiliki kebijakan yang memungkinkannya mengaktifkan layanan ini dari fungsi Lambda.

Untuk mengonfigurasi peran
  1. Masuk ke AWS Management Console dan buka konsol IAM di https://console.aws.amazon.com/iam/.

  2. Di panel navigasi, pilih Peran, lalu pilih Buat Peran.

  3. Pilih Layanan AWS , lalu pilih Lambda.

  4. Pilih tab Izin.

  5. Cari AWSLambdaBasicExecutionRole.

  6. Pilih Tanda selanjutnya.

  7. Pilih Tinjau.

  8. Namai peran dengan lambda-support.

  9. Pilih Buat peran.

  10. Pilih lambda-support untuk melihat halaman gambaran umum.

  11. Pilih Pasang kebijakan.

  12. Pilih AmazonRekognitionFullAccessdari daftar kebijakan.

  13. Pilih Lampirkan kebijakan.

  14. Cari AmazonS3 FullAccess, lalu pilih Lampirkan kebijakan.

Buat proyek

Buat proyek Java baru, kemudian konfigurasi Maven pom.xml dengan pengaturan yang diperlukan dan dependensi. Pastikan file pom.xml Anda terlihat seperti berikut ini:

<?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>

Tulis kode

Gunakan AWS Lambda runtime Java API untuk membuat kelas Java yang mendefinisikan fungsi Lambda. Dalam contoh ini, ada satu kelas Java untuk fungsi Lambda bernama Handler dan kelas tambahan yang diperlukan untuk kasus penggunaan ini. Citra berikut menunjukkan kelas Java dalam proyek. Perhatikan bahwa semua kelas Java terletak di sebuah paket bernama com.example.tags.

Struktur proyek yang menunjukkan kelas Java untuk aset penandaan alur kerja seperti AnalyzePhotos,, Handler BucketItem, S3Service, dan. WorkItem

Buat kelas Java berikut untuk kode:

  • Handler menggunakan Lambda Java run-time API dan melakukan kasus penggunaan yang dijelaskan dalam tutorial ini. AWS Logis aplikasi yang dijalankan terletak di metode handleRequest.

  • S3Service menggunakan API Amazon S3 untuk melakukan operasi S3.

  • AnalyzePhotosmenggunakan Amazon Rekognition API untuk menganalisis gambar.

  • BucketItemmendefinisikan model yang menyimpan informasi bucket Amazon S3.

  • WorkItemmendefinisikan model yang menyimpan data Amazon Rekognition.

Kelas handler

Kode Java ini mewakili kelas Handler. Kelas membaca bendera yang diteruskan ke fungsi Lambda. Layanan S3. ListBucketObjectsmetode mengembalikan objek Daftar di mana setiap elemen adalah nilai string yang mewakili kunci objek. Jika nilai bendera benar, maka tanda diterapkan dengan mengiterasi melalui daftar dan menerapkan tanda ke setiap objek dengan memanggil metode s3Service.tagAssets. Jika nilai flag adalah false, maka S3service. deleteTagFromMetode objek dipanggil yang menghapus tag. Juga, perhatikan bahwa Anda dapat mencatat pesan ke CloudWatch log Amazon dengan menggunakan LambdaLoggerobjek.

catatan

Pastikan Anda menetapkan nama bucket ke variabel 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; } }

Kelas S3Service

Kelas berikut menggunakan API Amazon S3 untuk melakukan operasi S3. Misalnya, getObjectBytesmetode mengembalikan array byte yang mewakili gambar. Demikian juga, listBucketObjectsmetode mengembalikan objek List di mana setiap elemen adalah nilai string yang menentukan nama kunci.

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 kelas

Kode Java berikut mewakili AnalyzePhotoskelas. Kelas ini menggunakan API Amazon Rekognition untuk menganalisis citra.

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 kelas

Kode Java berikut mewakili BucketItemkelas yang menyimpan data objek 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 kelas

Kode Java berikut mewakili WorkItemkelas.

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; } }

Kemas proyek

Kemas proyek ke dalam file .jar (JAR) dengan menggunakan perintah Maven berikut.

mvn package

File JAR terletak di folder target (yang merupakan folder anak dari folder proyek).

Jendela file explorer menunjukkan folder target dengan file JAR seperti WorkflowTagAssets -1.0-snapshot.jar dan file dan folder proyek lainnya.
catatan

Perhatikan penggunaan maven-shade-plugindalam file POM proyek. Plugin ini bertanggung jawab untuk membuat JAR yang berisi dependensi yang diperlukan. Jika Anda mencoba untuk mengemas proyek tanpa plugin ini, dependensi yang diperlukan tidak termasuk dalam file JAR dan Anda akan menemukan file. ClassNotFoundException

Deploy fungsi Lambda

  1. Buka Konsol Lambda.

  2. Pilih Buat Fungsi.

  3. Pilih Penulis dari scratch.

  4. Di bagian Informasi dasar, masukkan cron sebagai nama.

  5. Di Waktu aktif, pilih Java 8.

  6. Pilih Gunakan peran yang sudah ada, lalu pilih lambda-support (IAM role yang telah Anda buat).

  7. Pilih Buat fungsi.

  8. Untuk Tipe entri kode, pilih Unggah file .zip atau .jar.

  9. Pilih Unggah, lalu jelajahi ke file JAR yang telah Anda buat.

  10. Untuk Handler, masukkan nama fungsi yang memenuhi syarat, misalnya, menentukan paket com.example.tags.Handler:handleRequest (com.example.tags, Handler adalah kelas yang diikuti oleh :: dan nama metode).

  11. Pilih Simpan.

Uji metode Lambda

Pada titik dalam tutorial ini, Anda dapat menguji fungsi Lambda.

  1. Dalam konsol Lambda, klik tab Uji lalu masukkan JSON berikut.

    { "flag": "true" }
    Uji editor JSON acara dengan pasangan nilai kunci bendera, tombol Hapus dan Format, dan tombol Panggil.
    catatan

    Meneruskan tanda BETUL aset digital dan teruskan menghapus tanda SALAH.

  2. Pilih tombol Panggil. Setelah fungsi Lambda dipanggil, Anda melihat pesan berhasil.

    Pesan hasil eksekusi yang menunjukkan operasi berhasil, dengan tombol Detail.

Selamat, Anda telah membuat AWS Lambda fungsi yang secara otomatis menerapkan tag ke aset difital yang terletak di bucket Amazon S3. Sebagaimana dinyatakan di awal tutorial ini, pastikan untuk mengakhiri semua sumber daya yang telah Anda buat saat akan melalui tutorial ini untuk memastikan Anda tidak dikenakan biaya.

Untuk contoh AWS multiservice lainnya, lihat repositori contoh SDK AWS Dokumentasi. GitHub