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 HainesPo 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 HainesTeraz uvidíte stránku zobrazenú na obrázku 3.
Steven HainesPomenujte 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.
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 HainesDynamoDB 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.
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.