Pengkomputeran tanpa pelayan dengan AWS Lambda, Bahagian 2

Separuh pertama artikel ini membentangkan gambaran keseluruhan pengkomputeran tanpa server dengan AWS Lambda, termasuk membangun, menyebarkan, dan menguji fungsi AWS Lambda dalam aplikasi Java contoh. Dalam Bahagian 2, anda akan belajar bagaimana mengintegrasikan fungsi Lambda dengan pangkalan data luaran, dalam hal ini DynamoDB. Kami kemudian akan menggunakan AWS SDK untuk memanggil fungsi Lambda dari aplikasi Java contoh kami.

AWS Lambda dan DynamoDB

DynamoDB adalah kedai dokumen NoSQL yang dihoskan oleh Amazon Web Services (AWS). DynamoDB mendefinisikan abstraksi data sebagai jadual, yang menerima operasi pangkalan data biasa seperti menyisipkan, mengambil, meminta, mengemas kini, dan menghapus. Seperti banyak pangkalan data NoSQL lain, skema DynamoDB tidak tetap, jadi beberapa item dalam jadual yang sama boleh mempunyai bidang yang tidak dimiliki oleh orang lain.

Salah satu ciri terbaik DynamoDB adalah model harga bertingkat. Tidak seperti Perkhidmatan Pangkalan Data Relasi AWS (RDS), di mana AWS menguruskan pangkalan data anda menggunakan contoh EC2 yang anda bayar, DynamoDB adalah bayar-seperti-anda-pergi. Anda membayar untuk simpanan yang anda gunakan dan jumlah permintaan anda, tetapi anda tidak membayar secara langsung untuk mesin maya yang mendasari. Selain itu, AWS memberi anda peringkat percuma yang menyokong ruang sehingga 25 GB, dengan cukup banyak proses untuk melaksanakan hingga 200 juta permintaan setiap bulan.

Dalam pengkomputeran tanpa Server dengan AWS Lambda, Bahagian 1, kami mengembangkan aplikasi Java tanpa server yang mudah menggunakan fungsi Lambda. Anda boleh memuat turun kod sumber untuk aplikasi GetWidgetHandler pada bila-bila masa. Sekiranya anda belum membaca Bahagian 1, saya sarankan untuk membiasakan diri dengan kod aplikasi dan contoh dari artikel itu sebelum meneruskan.

Langkah pertama kami adalah menyediakan pangkalan data DynamoDB di konsol AWS kami. Selepas itu kami akan mengemas kini get-widgetfungsi dari Bahagian 1 untuk mendapatkan widget dari jadual DynamoDB.

Sediakan pangkalan data DynamoDB di AWS

Kita akan mulakan dengan membuat jadual DynamoDB. Dari konsol AWS, klik pada Perkhidmatan dan pilih DynamoDB dari bahagian pangkalan data, seperti yang ditunjukkan dalam Rajah 1.

Steven Haines

Setelah dilancarkan, anda akan melihat papan pemuka DynamoDB. Klik butang Buat jadual untuk mula membuat jadual anda, seperti yang ditunjukkan pada Gambar 2.

Steven Haines

Sekarang anda akan melihat halaman yang ditunjukkan dalam Rajah 3.

Steven Haines

Beri nama meja anda (dalam hal ini "Widget") dan tetapkan kunci utama id, membiarkannya sebagai String. Menekan Buat apabila anda selesai akan mengarahkan anda ke halaman jadual DynamoDB. Sekiranya anda perlu menavigasi ke halaman ini pada masa akan datang, pilih Perkhidmatan -> DynamoDB , dan klik pada Jadual .

Steven Haines

Kami akan membuat entri secara manual dalam jadual Widget baru, jadi klik butang Buat item seperti yang ditunjukkan dalam Gambar 5.

Steven Haines

DynamoDB akan mengisi halaman Buat Item dengan idmedan. Masukkan ID yang mudah diingat, seperti "1". Seterusnya, tekan tambah (+) di sebelah ID baru, tambah medan lain yang dipanggil name. Masukkan nilai untuk namemedan, seperti "Widget 1". Tekan Simpan apabila anda selesai.

Kemas kini kelas GetWidgetHandler

Dengan data dalam pangkalan data kami, perkara seterusnya yang perlu kami lakukan ialah mengemas kini GetWidgetHandlerkelas dari Bahagian 1. Kami akan memulakan dengan menambahkan kebergantungan DynamoDB ke fail POM asal kami. pom.xmlFail yang dikemas kini ditunjukkan dalam Penyenaraian 1.

Penyenaraian 1. pom.xml (dikemas kini dengan pergantungan 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        

Penyenaraian 1 menambah aws-java-sdk-dynamodbkebergantungan pada fail POM dari Bahagian 1. Penyenaraian 2 menunjukkan GetWidgetHandlerkelas yang dikemas kini .

Penyenaraian 2. GetWidgetHandler.java (dikemas kini 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(); } } } 

Antara muka utama untuk DynamoDB adalah DynamoDBobjek. Untuk membuat DynamoDBcontoh, kami memerlukan klien DynamoDB. Oleh kerana fungsi Lambda kami akan dijalankan dalam AWS, kami tidak perlu memberikan kelayakan, jadi kami dapat menggunakan klien lalai. Perhatikan bahawa kami hanya dapat membuat pertanyaan pangkalan data tanpa bukti kelayakan kerana get-widget-roledari Bahagian 1 mempunyai dynamodb:GetItemkebenaran.

Dari DynamoDBcontoh tersebut, kita dapat memanggil getTable("Widget")untuk mendapatkan Tablecontoh. Maka kita boleh memanggil getItem()pada Tablecontoh, lulus kunci primer bagi barang yang kita mahu mendapatkan semula. Sekiranya terdapat item dengan kunci utama yang ditentukan maka ia akan mengembalikan respons yang sah; jika tidak ia akan kembali null. The Itemkelas menyediakan akses kepada parameter tindak balas, jadi kami selesaikan pelaksanaan dengan membuat Widgetobjek dengan namanya dimuatkan dari DynamoDB.

muat turun Dapatkan kod Dapatkan kod untuk aplikasi GetWidgetHandler yang dikemas kini. Dicipta oleh Steven Haines untuk JavaWorld.

Menanyakan DynamoDB dengan DynamoDBMapper

Terdapat beberapa API untuk membuat pertanyaan DynamoDB, dari panggilan perkhidmatan RESTful, ke antara muka tahap rendah di atas, hingga beberapa antara muka tahap yang lebih tinggi. Salah satu antara muka yang lebih popular ialah DynamoDBMapper. Antaramuka ini memberikan konstruk yang serupa dengan yang mungkin anda dapati ketika memetakan objek ke data hubungan dalam alat seperti Hibernate. Mari kita tinjau secara ringkas cara mendapatkan semula Widgetdari DynamoDB menggunakan DynamoDBMapperAPI.

Perkara pertama yang perlu kita lakukan ialah menambahkan beberapa anotasi ke Widgetkelas, yang ditunjukkan dalam Penyenaraian 3.

Penyenaraian 3. Widget.java (dikemas kini dengan anotasi 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 DynamoDBTableanotasi menetapkan nama jadual DynamoDB untuk mana Widgetpeta. The DynamoDBHashKeyanotasi mengenal pasti kunci utama daripada Widgetjadual. Dan DynamoDBAttributeanotasi mengenal pasti atribut kelas lain yang memetakan ke atribut pangkalan data di DynamoDB. Sekiranya anda mempunyai atribut lain yang ingin anda abaikan, anda boleh menambahkan @DynamoDBIgnoreanotasi.

Dengan Widgetkelas yang diberi penjelasan, kita sekarang dapat mengemas kini GetWidgetHandlerkelas untuk menggunakan DynamoDBMapper, yang ditunjukkan dalam Penyenaraian 4.

Penyenaraian 4. GetWidgetHandler.java (dikemas kini 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; } } 

Dalam versi sebelumnya (Bahagian 1), GetWidgetHandlerkami membuat AmazonDynamoDBinstance, menggunakan AmazonDynamoDBClientBuilder.defaultClient()panggilan. Sekarang kita akan menggunakan klien itu untuk memulakan DynamoDBMapperinstance sebagai gantinya.

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.

Sekiranya anda kebetulan OutOfMemoryErrormenguji fungsi anda, pilih tab Konfigurasi dan buka bahagian Tetapan Lanjutan. Di sini anda dapat meningkatkan ingatan anda, seperti gambar di bawah.

Steven Haines