Programovanie

Výpočty bez servera s AWS Lambda, časť 2

Prvá polovica tohto článku predstavila prehľad výpočtov bez serverov s AWS Lambda, vrátane zostavenia, nasadenia a testovania funkcií AWS Lambda v ukážkovej aplikácii Java. V časti 2 sa dozviete, ako integrovať funkcie Lambda do externej databázy, v tomto prípade DynamoDB. Potom použijeme AWS SDK na vyvolanie funkcií Lambda z našej ukážkovej aplikácie Java.

AWS Lambda a DynamoDB

DynamoDB je ukladací priestor dokumentov NoSQL, ktorý je hostený službou Amazon Web Services (AWS). DynamoDB definuje dátové abstrakcie ako tabuľky, ktoré prijímajú bežné databázové operácie, ako je vkladanie, načítanie, dopytovanie, aktualizácia a mazanie. Rovnako ako v mnohých iných databázach NoSQL nie je schéma DynamoDB opravená, takže niektoré položky v tej istej tabuľke môžu obsahovať polia, ktoré iné nie.

Jednou z najlepších funkcií DynamoDB je jeho stupňovitý cenový model. Na rozdiel od služby AWS Relational Database Service (RDS), v ktorej AWS spravuje vašu databázu pomocou inštancií EC2, za ktoré platíte, je DynamoDB priebežne platený. Platíte za úložisko, ktoré používate, a výkonnosť vašich dotazov, neplatíte však priamo za žiadne podkladové virtuálne stroje. AWS vám navyše poskytuje bezplatnú vrstvu podporujúcu až 25 GB priestoru s dostatočnou priepustnosťou na vykonanie až 200 miliónov požiadaviek mesačne.

Pri výpočtoch bez servera s AWS Lambda, časť 1, sme vyvinuli jednoduchú aplikáciu Java bez servera využívajúcu funkcie Lambda. Zdrojový kód pre aplikáciu GetWidgetHandler si môžete kedykoľvek stiahnuť. Ak ste si 1. časť ešte nečítali, predtým, ako budete pokračovať, navrhujem oboznámiť sa s kódom aplikácie a príkladmi z tohto článku.

Naším prvým krokom je nastavenie databázy DynamoDB v našej konzole AWS. Potom aktualizujeme get-widget funkcia z časti 1 na získanie widgetu z tabuľky DynamoDB.

Nastavte databázu DynamoDB v AWS

Začneme vytvorením tabuľky DynamoDB. Na konzole AWS kliknite na Služby a vyberte DynamoDB z časti databázy, ako je to znázornené na obrázku 1.

Steven Haines

Po spustení sa zobrazí informačný panel DynamoDB. Kliknite na ikonu Vytvorte tabuľku tlačidlo na začatie vytvárania tabuľky, znázornené na obrázku 2.

Steven Haines

Teraz uvidíte stránku zobrazenú na obrázku 3.

Steven Haines

Pomenujte svoju tabuľku (v tomto prípade „Widget“) a nastavte primárny kľúč na id, ponechávajúc to ako a String. Lisovanie Vytvoriť keď skončíte, nasmeruje vás na stránku tabuliek DynamoDB. Ak v budúcnosti budete musieť prejsť na túto stránku, vyberte ikonu Služby -> DynamoDBa kliknite na Tabuľky.

Steven Haines

Položku v novej tabuľke widgetov vytvoríme manuálne, takže kliknite na ikonu Vytvoriť položku tlačidlo zobrazené na obrázku 5.

Steven Haines

DynamoDB vopred vyplní stránku Vytvoriť položku znakom id lúka. Zadajte ľahko zapamätateľné ID, napríklad „1“. Ďalej stlačte plus (+) vedľa nového ID a pridajte ďalšie pole s názvom názov. Zadajte hodnotu pre názov pole, napríklad „Widget 1“. Stlačte Uložiť keď skončíte.

Aktualizujte triedu GetWidgetHandler

S údajmi v našej databáze je potrebné aktualizovať ďalšie GetWidgetHandler triedy z časti 1. Začneme pridaním závislosti DynamoDB do nášho pôvodného súboru POM. Aktualizované pom.xml súbor je uvedený v zozname 1.

Zoznam 1. pom.xml (aktualizované so závislosťou 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 falošného odtieňa balenia 

Zoznam 1 pridáva aws-java-sdk-dynamodb závislosť na súbore POM z časti 1. Výpis 2 zobrazuje aktualizované GetWidgetHandler trieda.

Zoznam 2. GetWidgetHandler.java (aktualizované, aby sa načítali údaje 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; verejná trieda GetWidgetHandler implementuje RequestHandler {@Override public Widget handleRequest (WidgetRequest widgetRequest, kontextový kontext) {// vrátiť nový Widget (widgetRequest.getId (), "My Widget" + widgetRequest.getId ()); // Vytvorte pripojenie k klientovi DynamoDB AmazonDynamoDB = AmazonDynamoDBClientBuilder.defaultClient (); DynamoDB dynamoDB = nový DynamoDB (klient); // Získajte odkaz na tabuľku widgetov Table table = dynamoDB.getTable ("Widget"); // Získať našu položku podľa ID Položka item = table.getItem ("id", widgetRequest.getId ()); if (item! = null) {System.out.println (item.toJSONPretty ()); // Vrátiť nový objekt Widget vrátiť nový Widget (widgetRequest.getId (), item.getString ("meno")); } else {navrat novu Widget (); }}} 

Hlavným rozhraním pre DynamoDB je DynamoDB objekt. Za účelom vytvorenia DynamoDB napríklad potrebujeme klienta DynamoDB. Pretože naša funkcia Lambda pobeží v AWS, nemusíme uvádzať poverenia, takže môžeme použiť predvoleného klienta. Upozorňujeme, že v databáze budeme môcť vyhľadávať iba údaje bez poverení, pretože get-widget-role z časti 1 má dynamodb: GetItem povolenie.

Z DynamoDB napríklad môžeme zavolať getTable ("Widget") získať a Tabuľka inštancia. Potom môžeme zavolať getItem () na Tabuľka inštancia, ktorá mu odovzdá primárny kľúč položky, ktorú chceme načítať. Ak existuje položka so zadaným primárnym kľúčom, vráti platnú odpoveď; inak sa to vráti nulový. The Položka trieda poskytuje prístup k parametrom odozvy, takže implementáciu dokončíme vytvorením nového Widget objekt s názvom načítaným z DynamoDB.

stiahnuť Získajte kód Získajte kód pre aktualizovanú aplikáciu GetWidgetHandler. Vytvoril Steven Haines pre JavaWorld.

Dopytovanie DynamoDB pomocou DynamoDBMapper

Existuje niekoľko rozhraní API na dopytovanie DynamoDB, od volania služby RESTful cez vyššie uvedené nízkoúrovňové rozhranie až po niekoľko rozhraní na vyššej úrovni. Jedným z najobľúbenejších rozhraní je DynamoDBMapper. Toto rozhranie poskytuje podobný konštrukt, aký môžete nájsť pri mapovaní objektov na relačné údaje v nástroji, ako je napríklad Hibernate. Poďme stručne preskúmať, ako získať a Widget z DynamoDB pomocou DynamoDBMapper API.

Prvá vec, ktorú musíme urobiť, je pridať niekoľko poznámok k Widget triedy, ktorá je uvedená v zozname 3.

Zoznam 3. Widget.java (aktualizované s anotáciami 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") verejná trieda Widget {súkromné ​​ID reťazca; súkromné ​​meno reťazca; public Widget () {} public Widget (String id) {this.id = id; } verejný widget (ID reťazca, názov reťazca) {this.id = id; this.name = meno; } @DynamoDBHashKey (attributeName = "id") public String getId () {return id; } public void setId (ID reťazca) {this.id = id; } @DynamoDBAttribute (attributeName = "name") public String getName () {návratové meno; } public void setName (názov reťazca) {this.name = name; }} 

The DynamoDBTable anotácia určuje názov tabuľky DynamoDB, ku ktorej Widget mapy. The DynamoDBHashKey anotácia identifikuje primárny kľúč súboru Widget stôl. A DynamoDBAttribute anotácia identifikuje ďalšie atribúty triedy, ktoré sa mapujú na atribúty databázy v DynamoDB. Ak ste mali ďalšie atribúty, ktoré ste chceli ignorovať, môžete pridať @DynamoDBIgnore anotácia.

Vďaka Widget trieda s poznámkami, teraz môžeme aktualizovať GetWidgetHandler triedy používať DynamoDBMapper, ktorý je uvedený v zozname 4.

Výpis 4. GetWidgetHandler.java (aktualizované pomocou 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; verejná trieda GetWidgetHandler implementuje RequestHandler {@Override public Widget handleRequest (WidgetRequest widgetRequest, kontextový kontext) {// Vytvoriť spojenie s klientom DynamoDB AmazonDynamoDB = AmazonDynamoDBClientBuilder.defaultClient (); // Zostavenie mapovača DynamoDBMapper mapovač = nový DynamoDBMapper (klient); // Načítanie widgetu pomocou ID Widget widget = mapper.load (Widget.class, widgetRequest.getId ()); if (widget == null) {// Nenašli sme widget s týmto ID, preto vráťte prázdny Widget context.getLogger (). log ("S ID sa nenašla žiadna miniaplikácia:" + widgetRequest.getId () + "\ n "); vrátiť nový Widget (); } // Vrátiť widget vrátiť widget; }} 

V bývalej (časť 1) verzii GetWidgetHandler vytvorili sme AmazonDynamoDB napríklad pomocou a AmazonDynamoDBClientBuilder.defaultClient () hovor. Teraz použijeme tohto klienta na inicializáciu a DynamoDBMapper inštancie.

Trieda DynamoDBMapper poskytuje prístup na vykonávanie dotazov, načítanie objektov podľa ID, ukladanie objektov, mazanie objektov atď. V tomto prípade minieme DynamoDBMapper trieda widgetu (Widget.trieda) a jeho primárny kľúč. Ak má DynamoDB a Widget so zadaným primárnym kľúčom ho vráti; ak nie, vráti nulu.

Znovu vytvorte a potom znova nahrajte nový súbor JAR otvorením hlavného panela funkcií Lambda a následným kliknutím na ikonu Zákonníka kartu a stlačte Nahrať. Keď znova nahráte a následne zavoláte svoju funkciu, AWS Lambda vytvorí nový kontajner pre nový súbor JAR a odošle ho do inštancie EC2. Mali by ste očakávať, že prvý beh bude pomalý.

Ak náhodou narazíte na OutOfMemoryError pri opätovnom testovaní svojej funkcie vyberte ikonu Konfigurácia kartu a otvorte sekciu Rozšírené nastavenia. Tu môžete zvýšiť svoju pamäť, ako je uvedené nižšie.

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