Programování

Výpočet bez serveru s AWS Lambda, část 2

První polovina tohoto článku představila přehled bezserverových výpočtů s AWS Lambda, včetně sestavení, nasazení a testování funkcí AWS Lambda v ukázkové aplikaci Java. V části 2 se naučíte, jak integrovat funkce Lambda s externí databází, v tomto případě DynamoDB. Potom použijeme AWS SDK k vyvolání funkcí Lambda z naší ukázkové aplikace Java.

AWS Lambda a DynamoDB

DynamoDB je úložiště dokumentů NoSQL, které je hostováno službou Amazon Web Services (AWS). DynamoDB definuje datové abstrakce jako tabulky, které přijímají běžné databázové operace, jako je vkládání, načítání, dotazování, aktualizace a mazání. Stejně jako u mnoha jiných databází NoSQL není schéma DynamoDB opravené, takže některé položky ve stejné tabulce mohou obsahovat pole, která ostatní nemají.

Jednou z nejlepších funkcí DynamoDB je jeho stupňovitý cenový model. Na rozdíl od služby AWS Relational Database Service (RDS), ve které AWS spravuje vaši databázi pomocí instancí EC2, za které platíte, je DynamoDB průběžný. Platíte za úložiště, které používáte, a propustnost vašich dotazů, neplatíte však přímo za žádné podkladové virtuální stroje. AWS vám navíc poskytuje bezplatnou vrstvu podporující až 25 GB prostoru s dostatečnou propustností k provedení až 200 milionů požadavků za měsíc.

Ve výpočtech bez serveru s AWS Lambda, část 1, jsme vyvinuli jednoduchou aplikaci Java bez serveru pomocí funkcí Lambda. Zdrojový kód pro aplikaci GetWidgetHandler si můžete kdykoli stáhnout. Pokud jste si ještě nečetli část 1, doporučuji se před pokračováním seznámit s kódem aplikace a příklady z tohoto článku.

Naším prvním krokem je nastavení databáze DynamoDB v naší konzole AWS. Poté budeme aktualizovat get-widget funkce z části 1 k načtení widgetu z tabulky DynamoDB.

Nastavte databázi DynamoDB v AWS

Začneme vytvořením tabulky DynamoDB. Na konzole AWS klikněte na Služby a vyberte DynamoDB z části databáze, jak je znázorněno na obrázku 1.

Steven Haines

Po spuštění se zobrazí řídicí panel DynamoDB. Klikněte na ikonu Vytvořit tabulku tlačítko pro zahájení vytváření tabulky, jak je znázorněno na obrázku 2.

Steven Haines

Nyní uvidíte stránku zobrazenou na obrázku 3.

Steven Haines

Pojmenujte svoji tabulku (v tomto případě „Widget“) a nastavte primární klíč na id, opouštět to jako Tětiva. Lisování Vytvořit po dokončení vás přesměruje na stránku tabulek DynamoDB. Pokud budete v budoucnu potřebovat přejít na tuto stránku, vyberte Služby -> DynamoDBa klikněte na Tabulky.

Steven Haines

Ručně vytvoříme položku v nové tabulce widgetů, takže klikněte na Vytvořit položku tlačítko zobrazené na obrázku 5.

Steven Haines

DynamoDB předvyplní stránku Vytvořit položku pomocí id pole. Zadejte snadno zapamatovatelné ID, například „1“. Dále stiskněte plus (+) vedle nového ID a přidejte další volané pole název. Zadejte hodnotu pro název pole, například „Widget 1“. lis Uložit až skončíte.

Aktualizujte třídu GetWidgetHandler

S daty v naší databázi je další věcí, kterou musíme udělat, je aktualizace GetWidgetHandler třídy z části 1. Začneme přidáním závislosti DynamoDB do našeho původního souboru POM. Aktualizováno pom.xml soubor je uveden v seznamu 1.

Výpis 1. pom.xml (aktualizováno se závislostí 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-shad -plugin 2,3 falešného odstínu balení 

Výpis 1 přidává aws-java-sdk-dynamodb závislost na souboru POM z části 1. Výpis 2 zobrazuje aktualizované GetWidgetHandler třída.

Výpis 2. GetWidgetHandler.java (aktualizováno pro načtení dat z DynamoDB)

 balíček 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; veřejná třída GetWidgetHandler implementuje RequestHandler {@Override public Widget handleRequest (WidgetRequest widgetRequest, kontextový kontext) {// vrátit nový Widget (widgetRequest.getId (), "Můj Widget" + widgetRequest.getId ()); // Vytvořte připojení k klientovi DynamoDB AmazonDynamoDB = AmazonDynamoDBClientBuilder.defaultClient (); DynamoDB dynamoDB = nový DynamoDB (klient); // Získejte odkaz na tabulku Widget Tabulka tabulka = dynamoDB.getTable ("Widget"); // Získejte naši položku podle ID Položka item = table.getItem ("id", widgetRequest.getId ()); if (item! = null) {System.out.println (item.toJSONPretty ()); // Vrátit nový objekt Widget vrátit nový Widget (widgetRequest.getId (), item.getString ("name")); } else {vrátit nový Widget (); }}} 

Hlavním rozhraním k DynamoDB je DynamoDB objekt. Za účelem vytvoření DynamoDB například potřebujeme klienta DynamoDB. Protože naše funkce Lambda poběží v AWS, nemusíme poskytovat přihlašovací údaje, abychom mohli použít výchozího klienta. Všimněte si, že budeme moci dotazovat databázi pouze bez pověření, protože get-widget-role z části 1 má dynamodb: GetItem povolení.

Z DynamoDB například můžeme zavolat getTable ("Widget") získat a Stůl instance. Pak můžeme zavolat getItem () na Stůl například předáním primárního klíče položky, kterou chceme načíst. Pokud existuje položka se zadaným primárním klíčem, vrátí platnou odpověď; jinak se vrátí nula. The Položka třída poskytuje přístup k parametrům odezvy, takže dokončíme implementaci vytvořením nového Widget objekt se svým názvem načten z DynamoDB.

stáhnout Získat kód Získejte kód pro aktualizovanou aplikaci GetWidgetHandler. Vytvořil Steven Haines pro JavaWorld.

Dotazování DynamoDB pomocí DynamoDBMapper

Existuje několik rozhraní API pro dotazování DynamoDB, od volání služby RESTful až po rozhraní nižší úrovně výše, až po několik rozhraní vyšší úrovně. Jedním z nejoblíbenějších rozhraní je DynamoDBMapper. Toto rozhraní poskytuje podobný konstrukt, jaký můžete najít při mapování objektů na relační data v nástroji, jako je Hibernate. Pojďme se krátce podívat, jak načíst a Widget z DynamoDB pomocí DynamoDBMapper API.

První věcí, kterou musíme udělat, je přidat několik poznámek k Widget třídy, která je uvedena v seznamu 3.

Výpis 3. Widget.java (aktualizováno anotacemi DynamoDBMapper)

 balíček 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") veřejná třída Widget {soukromé ID řetězce; soukromé jméno řetězce; public Widget () {} public Widget (String id) {this.id = id; } public Widget (ID řetězce, název řetězce) {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 () {návratové jméno; } public void setName (název řetězce) {this.name = name; }} 

The DynamoDBTable anotace určuje název tabulky DynamoDB, ke které Widget mapy. The DynamoDBHashKey anotace identifikuje primární klíč Widget stůl. A DynamoDBAttribute anotace identifikuje další atributy třídy, které se mapují na atributy databáze v DynamoDB. Pokud jste měli další atributy, které jste chtěli ignorovat, můžete přidat @DynamoDBIgnore anotace.

S Widget třída s poznámkami, nyní můžeme aktualizovat GetWidgetHandler třída používat DynamoDBMapper, který je uveden v seznamu 4.

Výpis 4. GetWidgetHandler.java (aktualizováno pomocí DynamoDBMapper)

 balíček 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; veřejná třída GetWidgetHandler implementuje RequestHandler {@Override public Widget handleRequest (WidgetRequest widgetRequest, kontextový kontext) {// Vytvořit připojení k klientovi DynamoDB AmazonDynamoDB = AmazonDynamoDBClientBuilder.defaultClient (); // Vytvořte mapovač DynamoDBMapper mapovač = nový DynamoDBMapper (klient); // Načtení widgetu pomocí ID Widget widget = mapper.load (Widget.class, widgetRequest.getId ()); if (widget == null) {// Nenašli jsme widget s tímto ID, proto vraťte prázdný Widget context.getLogger (). log ("Nebyl nalezen žádný widget s ID:" + widgetRequest.getId () + "\ n "); vrátit nový Widget (); } // Vrátit widget vrátit widget; }} 

V dřívější verzi (část 1) GetWidgetHandler vytvořili jsme AmazonDynamoDB například pomocí a AmazonDynamoDBClientBuilder.defaultClient () volání. Nyní použijeme tohoto klienta k inicializaci a DynamoDBMapper instance místo.

Třída DynamoDBMapper poskytuje přístup k provádění dotazů, načítání objektů podle ID, ukládání objektů, mazání objektů atd. V tomto případě projdeme DynamoDBMapper třída widgetu (Widget.class) a jeho primární klíč. Pokud má DynamoDB a Widget se zadaným primárním klíčem jej vrátí; pokud ne, vrátí null.

Znovu sestavte a znovu nahrajte nový soubor JAR otevřením řídicího panelu funkce Lambda a poté klikněte na ikonu Kód kartu a stiskněte nahrát. Když znovu nahrajete a následně zavoláte svou funkci, AWS Lambda vytvoří nový kontejner pro nový soubor JAR a předá jej instanci EC2. Měli byste očekávat, že první běh bude pomalý.

Pokud náhodou narazíte na OutOfMemoryError když znovu otestujete svou funkci, vyberte Konfigurace kartu a otevřete sekci Upřesnit nastavení. Zde můžete zvýšit paměť, jak je uvedeno níže.

Steven Haines
$config[zx-auto] not found$config[zx-overlay] not found