Komputasi tanpa server dengan AWS Lambda, Bagian 2

Paruh pertama artikel ini menyajikan ikhtisar komputasi tanpa server dengan AWS Lambda, termasuk membangun, menerapkan, dan menguji fungsi AWS Lambda dalam contoh aplikasi Java. Di Bagian 2, Anda akan mempelajari cara mengintegrasikan fungsi Lambda dengan database eksternal, dalam hal ini DynamoDB. Kami kemudian akan menggunakan AWS SDK untuk menjalankan fungsi Lambda dari contoh aplikasi Java kami.

AWS Lambda dan DynamoDB

DynamoDB adalah penyimpanan dokumen NoSQL yang dihosting oleh Amazon Web Services (AWS). DynamoDB mendefinisikan abstraksi data sebagai tabel, yang menerima operasi database umum seperti menyisipkan, mengambil, membuat kueri, memperbarui, dan menghapus. Seperti banyak database NoSQL lainnya, skema DynamoDB tidak diperbaiki, jadi beberapa item dalam tabel yang sama dapat memiliki kolom yang tidak dimiliki item lain.

Salah satu fitur terbaik DynamoDB adalah model penetapan harga berjenjang. Tidak seperti AWS Relational Database Service (RDS), di mana AWS mengelola database Anda menggunakan instans EC2 yang Anda bayar, DynamoDB adalah pay-as-you-go. Anda membayar untuk penyimpanan yang Anda gunakan dan throughput kueri Anda, tetapi Anda tidak langsung membayar untuk mesin virtual yang mendasarinya. Selain itu, AWS memberi Anda tingkat gratis yang mendukung ruang hingga 25 GB, dengan throughput yang cukup untuk menjalankan hingga 200 juta permintaan per bulan.

Dalam komputasi tanpa server dengan AWS Lambda, Bagian 1, kami mengembangkan aplikasi Java tanpa server yang sederhana menggunakan fungsi Lambda. Anda dapat mengunduh kode sumber untuk aplikasi GetWidgetHandler kapan saja. Jika Anda belum membaca Bagian 1, saya sarankan untuk memahami kode aplikasi dan contoh dari artikel tersebut sebelum melanjutkan.

Langkah pertama kami adalah menyiapkan database DynamoDB di konsol AWS kami. Setelah itu kita akan memperbarui get-widgetfungsi dari Bagian 1 untuk mengambil widget dari tabel DynamoDB.

Siapkan database DynamoDB di AWS

Kami akan mulai dengan membuat tabel DynamoDB. Dari konsol AWS, klik Layanan dan pilih DynamoDB dari bagian database, seperti yang ditunjukkan pada Gambar 1.

Steven Haines

Setelah diluncurkan, Anda akan melihat dasbor DynamoDB. Klik tombol Buat tabel untuk mulai membuat tabel Anda, ditunjukkan pada Gambar 2.

Steven Haines

Sekarang Anda akan melihat halaman yang ditunjukkan pada Gambar 3.

Steven Haines

Beri nama tabel Anda (dalam hal ini "Widget") dan setel kunci utama menjadi id, biarkan sebagai String. Menekan Buat setelah Anda selesai akan mengarahkan Anda ke halaman tabel DynamoDB. Jika Anda perlu menavigasi ke halaman ini di masa mendatang, pilih Layanan -> DynamoDB , dan klik Tabel .

Steven Haines

Kami akan secara manual membuat entri di tabel Widget baru, jadi klik tombol Buat item yang ditunjukkan pada Gambar 5.

Steven Haines

DynamoDB akan mengisi halaman Create Item dengan idbidang tersebut. Masukkan ID yang mudah diingat, seperti "1". Selanjutnya, tekan plus (+) di sebelah ID baru, tambahkan bidang lain yang disebut name. Masukkan nilai untuk namebidang, seperti "Widget 1". Tekan Simpan setelah Anda selesai.

Perbarui kelas GetWidgetHandler

Dengan data dalam database kita, hal berikutnya yang perlu kita lakukan adalah memperbarui GetWidgetHandlerkelas dari Bagian 1. Kita akan mulai dengan menambahkan ketergantungan DynamoDB ke file POM asli kita. File yang diperbarui pom.xmlditunjukkan pada Daftar 1.

Kode 1. pom.xml (diperbarui dengan ketergantungan DynamoDB)

 4.0.0 com.javaworld.geekcap aws-lambda-java jar 1.0-SNAPSHOT aws-lambda-java //maven.apache.org  1.8 UTF-8    com.amazonaws aws-lambda-java-core 1.1.0   com.amazonaws aws-java-sdk-dynamodb 1.11.135   junit junit 4.12 test      org.apache.maven.plugins maven-compiler-plugin 2.0.2  ${java.version} ${java.version}    org.apache.maven.plugins maven-shade-plugin 2.3  false    package  shade        

Kode 1 menambahkan aws-java-sdk-dynamodbketergantungan ke file POM dari Bagian 1. Kode 2 menunjukkan GetWidgetHandlerkelas yang diperbarui .

Kode 2. GetWidgetHandler.java (diperbarui untuk memuat data dari DynamoDB)

 package com.javaworld.awslambda.widget.handlers; import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder; import com.amazonaws.services.dynamodbv2.document.DynamoDB; import com.amazonaws.services.dynamodbv2.document.Item; import com.amazonaws.services.dynamodbv2.document.Table; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; import com.javaworld.awslambda.widget.model.Widget; import com.javaworld.awslambda.widget.model.WidgetRequest; public class GetWidgetHandler implements RequestHandler { @Override public Widget handleRequest(WidgetRequest widgetRequest, Context context) { //return new Widget(widgetRequest.getId(), "My Widget " + widgetRequest.getId()); // Create a connection to DynamoDB AmazonDynamoDB client = AmazonDynamoDBClientBuilder.defaultClient(); DynamoDB dynamoDB = new DynamoDB(client); // Get a reference to the Widget table Table table = dynamoDB.getTable("Widget"); // Get our item by ID Item item = table.getItem("id", widgetRequest.getId()); if(item != null) { System.out.println(item.toJSONPretty()); // Return a new Widget object return new Widget(widgetRequest.getId(), item.getString("name")); } else { return new Widget(); } } } 

Antarmuka utama ke DynamoDB adalah DynamoDBobjeknya. Untuk membuat sebuah DynamoDBinstance, kita membutuhkan klien DynamoDB. Karena fungsi Lambda kami akan berjalan di AWS, kami tidak perlu memberikan kredensial, jadi kami dapat menggunakan klien default. Perhatikan bahwa kita hanya dapat melakukan kueri database tanpa kredensial karena get-widget-roledari Bagian 1 memiliki dynamodb:GetItemizin.

Dari DynamoDBinstance, kita dapat memanggil getTable("Widget")untuk mengambil sebuah Tableinstance. Kemudian kita memanggil getItem()pada Tablecontoh, lewat itu kunci utama dari item yang kita ingin mengambil. Jika ada item dengan kunci utama yang ditentukan maka itu akan mengembalikan respons yang valid; jika tidak maka akan kembali null. The Itemkelas menyediakan akses ke parameter respon, jadi kami selesaikan pelaksanaan dengan menciptakan baru Widgetobjek dengan namanya diambil dari DynamoDB.

download Dapatkan kode Dapatkan kode untuk aplikasi GetWidgetHandler yang diperbarui. Dibuat oleh Steven Haines untuk JavaWorld.

Membuat kueri DynamoDB dengan DynamoDBMapper

Ada beberapa API untuk membuat kueri DynamoDB, dari panggilan layanan RESTful, ke antarmuka tingkat rendah di atas, hingga beberapa antarmuka tingkat yang lebih tinggi. Salah satu antarmuka yang lebih populer adalah DynamoDBMapper. Antarmuka ini menyediakan konstruksi yang serupa dengan apa yang mungkin Anda temukan saat memetakan objek ke data relasional dalam alat seperti Hibernate. Mari kita tinjau secara singkat cara mengambil Widgetdari DynamoDB menggunakan DynamoDBMapperAPI.

Hal pertama yang perlu kita lakukan adalah menambahkan beberapa penjelasan ke Widgetkelas, yang ditunjukkan pada Kode 3.

Kode 3. Widget.java (diperbarui dengan penjelasan DynamoDBMapper)

 package com.javaworld.awslambda.widget.model; import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAttribute; import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBHashKey; import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTable; @DynamoDBTable(tableName="Widget") public class Widget { private String id; private String name; public Widget() { } public Widget(String id) { this.id = id; } public Widget(String id, String name) { this.id = id; this.name = name; } @DynamoDBHashKey(attributeName="id") public String getId() { return id; } public void setId(String id) { this.id = id; } @DynamoDBAttribute(attributeName="name") public String getName() { return name; } public void setName(String name) { this.name = name; } } 

The DynamoDBTablepenjelasan menentukan nama tabel DynamoDB mana Widgetpeta. The DynamoDBHashKeypenjelasan mengidentifikasi kunci utama dari Widgettabel. Dan DynamoDBAttributeanotasi mengidentifikasi atribut kelas lain yang dipetakan ke atribut database di DynamoDB. Jika Anda memiliki atribut lain yang ingin Anda abaikan, Anda dapat menambahkan @DynamoDBIgnoreanotasi.

Dengan Widgetkelas yang dianotasi, sekarang kita dapat memperbarui GetWidgetHandlerkelas untuk menggunakan DynamoDBMapper, yang ditunjukkan pada Kode 4.

Kode 4. GetWidgetHandler.java (diperbarui dengan DynamoDBMapper)

 package com.javaworld.awslambda.widget.handlers; import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder; import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; import com.javaworld.awslambda.widget.model.Widget; import com.javaworld.awslambda.widget.model.WidgetRequest; public class GetWidgetHandler implements RequestHandler { @Override public Widget handleRequest(WidgetRequest widgetRequest, Context context) { // Create a connection to DynamoDB AmazonDynamoDB client = AmazonDynamoDBClientBuilder.defaultClient(); // Build a mapper DynamoDBMapper mapper = new DynamoDBMapper(client); // Load the widget by ID Widget widget = mapper.load(Widget.class, widgetRequest.getId()); if(widget == null) { // We did not find a widget with this ID, so return an empty Widget context.getLogger().log("No Widget found with ID: " + widgetRequest.getId() + "\n"); return new Widget(); } // Return the widget return widget; } } 

Di versi sebelumnya (Bagian 1), GetWidgetHandlerkami membuat AmazonDynamoDBinstance, menggunakan AmazonDynamoDBClientBuilder.defaultClient()panggilan. Sekarang kita akan menggunakan klien itu untuk menginisialisasi sebuah DynamoDBMapperinstance.

The DynamoDBMapper class provides access to execute queries, load objects by ID, save objects, delete objects, and so forth. In this case, we pass DynamoDBMapper the widget's class (Widget.class) and its primary key. If DynamoDB has a Widget with the specified primary key it will return it; if not it will return null.

Rebuild and then re-upload your new JAR file by opening your Lambda function dashboard, then click on the Code tab and press Upload. When you re-upload and subsequently call your function, AWS Lambda will create a new container for the new JAR file and push that to an EC2 instance. You should expect the first run to be slow.

Jika Anda kebetulan menemukan OutOfMemoryErrorsaat Anda menguji ulang fungsi Anda, pilih tab Konfigurasi dan buka bagian Pengaturan Lanjutan. Di sini Anda dapat meningkatkan memori Anda, seperti yang ditunjukkan di bawah ini.

Steven Haines