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 HainesPo 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 HainesNyní uvidíte stránku zobrazenou na obrázku 3.
Steven HainesPojmenujte 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.
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 HainesDynamoDB 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.
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.