Programmering

Serverløs computing med AWS Lambda, del 2

Den første halvdel af denne artikel præsenterede en oversigt over serverløs computing med AWS Lambda, herunder bygning, implementering og test af AWS Lambda-funktioner i et eksempel på en Java-applikation. I del 2 lærer du, hvordan du integrerer Lambda-funktioner med en ekstern database, i dette tilfælde DynamoDB. Vi bruger derefter AWS SDK til at påberåbe Lambda-funktioner fra vores eksempel Java-applikation.

AWS Lambda og DynamoDB

DynamoDB er en NoSQL-dokumentbutik, der hostes af Amazon Web Services (AWS). DynamoDB definerer dataabstraktioner som tabeller, der accepterer almindelige databasefunktioner såsom indsættelse, hentning, forespørgsel, opdatering og sletning. Som med mange andre NoSQL-databaser er DynamoDBs skema ikke rettet, så nogle elementer i den samme tabel kan have felter, som andre ikke har.

En af DynamoDBs bedste funktioner er den differentierede prismodel. I modsætning til AWS Relational Database Service (RDS), hvor AWS administrerer din database ved hjælp af EC2-forekomster, som du betaler for, er DynamoDB pay-as-you-go. Du betaler for det lager, du bruger, og gennemstrømningen af ​​dine forespørgsler, men du betaler ikke direkte for nogen underliggende virtuelle maskiner. Derudover giver AWS dig et gratis niveau, der understøtter op til 25 GB plads med tilstrækkelig kapacitet til at udføre op til 200 millioner anmodninger om måneden.

I serverløs computing med AWS Lambda, del 1, udviklede vi en enkel, serverløs Java-applikation ved hjælp af Lambda-funktioner. Du kan når som helst downloade kildekoden til GetWidgetHandler-applikationen. Hvis du ikke allerede har læst del 1, foreslår jeg, at du gør dig bekendt med applikationskoden og eksempler fra denne artikel, inden du fortsætter.

Vores første skridt er at opsætte DynamoDB-databasen i vores AWS-konsol. Derefter opdaterer vi get-widget funktion fra del 1 for at hente en widget fra en DynamoDB-tabel.

Opsæt DynamoDB-databasen i AWS

Vi starter med at oprette DynamoDB-tabellen. Klik på AWS-konsollen Tjenester og vælg DynamoDB fra databasesektionen som vist i figur 1.

Steven Haines

Når du er lanceret, ser du DynamoDB-dashboardet. Klik på Opret tabel knappen for at begynde at oprette dit bord, vist i figur 2.

Steven Haines

Nu kan du se siden vist i figur 3.

Steven Haines

Giv din tabel et navn (i dette tilfælde "Widget"), og indstil den primære nøgle til idefterlader det som en Snor. Trykker på skab når du er færdig, leder du dig til siden DynamoDB-tabeller. Hvis du har brug for at navigere til denne side i fremtiden, skal du vælge Tjenester -> DynamoDBog klik på Tabeller.

Steven Haines

Vi opretter manuelt en post i den nye widget-tabel, så klik på Opret vare knappen vist i figur 5.

Steven Haines

DynamoDB udfylder siden Opret vare forud med id Mark. Indtast et id, der er let at huske, såsom "1". Tryk derefter på plus (+) ud for det nye id og tilføj et andet felt, der hedder navn. Indtast en værdi for navn felt, såsom "Widget 1". Trykke Gemme når du er færdig.

Opdater GetWidgetHandler-klassen

Med data i vores database er den næste ting, vi skal gøre, at opdatere GetWidgetHandler klasse fra del 1. Vi starter med at tilføje DynamoDB-afhængighed til vores originale POM-fil. Den opdaterede pom.xml filen vises i liste 1.

Liste 1. pom.xml (opdateret med DynamoDB-afhængighed)

 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-skygge -plugin 2.3 falsk pakke skygge 

Liste 1 tilføjer aws-java-sdk-dynamodb afhængighed af POM-filen fra del 1. Liste 2 viser den opdaterede GetWidgetHandler klasse.

Liste 2. GetWidgetHandler.java (opdateret til at indlæse data fra DynamoDB)

 pakke com.javaworld.awslambda.widget.handlers; importer com.amazonaws.services.dynamodbv2.AmazonDynamoDB; importer com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder; importer com.amazonaws.services.dynamodbv2.document.DynamoDB; importer com.amazonaws.services.dynamodbv2.document.Item; import com.amazonaws.services.dynamodbv2.document.Table; importer 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; offentlig klasse GetWidgetHandler implementerer RequestHandler {@Override public Widget handleRequest (WidgetRequest widgetRequest, Context context) {// returner ny Widget (widgetRequest.getId (), "My Widget" + widgetRequest.getId ()); // Opret en forbindelse til DynamoDB AmazonDynamoDB-klient = AmazonDynamoDBClientBuilder.defaultClient (); DynamoDB dynamoDB = ny DynamoDB (klient); // Få en henvisning til widget-tabellen Table table = dynamoDB.getTable ("Widget"); // Få vores vare efter ID Item item = table.getItem ("id", widgetRequest.getId ()); hvis (item! = null) {System.out.println (item.toJSONPretty ()); // Returner et nyt widget-objekt returner ny widget (widgetRequest.getId (), item.getString ("navn")); } ellers {returner ny widget (); }}} 

Hovedgrænsefladen til DynamoDB er DynamoDB objekt. For at skabe en DynamoDB For eksempel har vi brug for en DynamoDB-klient. Da vores Lambda-funktion kører i AWS, behøver vi ikke give legitimationsoplysninger, så vi kan bruge standardklienten. Bemærk, at vi kun kan spørge databasen uden legitimationsoplysninger, fordi get-widget-rolle fra del 1 har dynamodb: GetItem tilladelse.

Fra DynamoDB vi kan f.eks. ringe getTable ("Widget") at hente en Bord eksempel. Så kan vi ringe getItem () på den Bord eksempel ved at sende den den primære nøgle til det element, vi vil hente. Hvis der er et element med den angivne primære nøgle, returnerer det et gyldigt svar; ellers vender det tilbage nul. Det Vare klasse giver adgang til reaktionsparametrene, så vi afslutter implementeringen ved at oprette en ny Widget objekt med dets navn indlæst fra DynamoDB.

download Hent koden Hent koden til det opdaterede GetWidgetHandler-program. Oprettet af Steven Haines til JavaWorld.

Forespørgsel på DynamoDB med DynamoDBMapper

Der er flere API'er til forespørgsel på DynamoDB, fra et RESTful service-opkald til lavt niveau interface ovenfor til et par grænseflader på højere niveau. En af de mere populære grænseflader er DynamoDBMapper. Denne grænseflade giver en lignende konstruktion, som du kan finde, når du kortlægger objekter til relationsdata i et værktøj som dvale. Lad os kort gennemgå, hvordan man henter en Widget fra DynamoDB ved hjælp af DynamoDBMapper API.

Den første ting, vi skal gøre, er at tilføje et par kommentarer til Widget klasse, som er vist i liste 3.

Annonce 3. Widget.java (opdateret med DynamoDBMapper-kommentarer)

 pakke 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") offentlig klasse-widget {privat streng-id; privat strengnavn; offentlig widget () {} offentlig widget (streng-id) {this.id = id; } offentlig widget (streng-id, strengnavn) {this.id = id; dette.navn = navn; } @DynamoDBHashKey (attributeName = "id") offentlig streng getId () {return id; } public void setId (String id) {this.id = id; } @DynamoDBAttribute (attributnavn = "navn") offentlig String getName () {returnavn; } public void setName (String name) {this.name = name; }} 

Det DynamoDBTabel annotation angiver navnet på den DynamoDB-tabel, som Widget Kort. Det DynamoDBHashKey annotation identificerer den primære nøgle til Widget bord. Og DynamoDBA-attribut annotation identificerer andre klasseattributter, der kortlægges til databaseattributter i DynamoDB. Hvis du havde andre attributter, som du ville ignorere, kunne du tilføje @DynamoDBIgnorer kommentar.

Med Widget klasse bemærket, kan vi nu opdatere GetWidgetHandler klasse til at bruge DynamoDBMapper, som er vist i liste 4.

Fortegnelse 4. GetWidgetHandler.java (opdateret med DynamoDBMapper)

 pakke com.javaworld.awslambda.widget.handlers; importer com.amazonaws.services.dynamodbv2.AmazonDynamoDB; importer com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder; importer com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper; importer 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; offentlig klasse GetWidgetHandler implementerer RequestHandler {@Override public Widget handleRequest (WidgetRequest widgetRequest, Context context) {// Opret en forbindelse til DynamoDB AmazonDynamoDB-klient = AmazonDynamoDBClientBuilder.defaultClient (); // Byg en kortlægger DynamoDBMapper-kortlægger = ny DynamoDBMapper (klient); // Indlæs widget efter ID Widget widget = mapper.load (Widget.class, widgetRequest.getId ()); hvis (widget == null) {// Vi fandt ikke en widget med dette id, så returner en tom Widget-kontekst. getLogger (). log ("Ingen widget fundet med ID:" + widgetRequest.getId () + "\ n "); returner ny widget (); } // Returner widget til returnering af widget; }} 

I den tidligere (del 1) version af GetWidgetHandler vi skabte en AmazonDynamoDB eksempel ved hjælp af en AmazonDynamoDBClientBuilder.defaultClient () opkald. Nu bruger vi denne klient til at initialisere en DynamoDBMapper eksempel i stedet.

Klassen DynamoDBMapper giver adgang til at udføre forespørgsler, indlæse objekter efter ID, gemme objekter, slette objekter osv. I dette tilfælde passerer vi DynamoDBMapper widgetens klasse (Widget.klasse) og dens primære nøgle. Hvis DynamoDB har en Widget med den angivne primære nøgle vil den returnere den; hvis ikke vil det returnere nul.

Genopbyg og upload derefter din nye JAR-fil igen ved at åbne dit Lambda-funktions dashboard, og klik derefter på Kode fanen og tryk på Upload. Når du uploader og derefter kalder din funktion, opretter AWS Lambda en ny container til den nye JAR-fil og skubber den til en EC2-forekomst. Du bør forvente, at det første løb går langsomt.

Hvis du tilfældigvis støder på en OutOfMemoryError når du tester din funktion igen, skal du vælge Konfiguration fanen og åbn sektionen Avancerede indstillinger. Her kan du øge din hukommelse som vist nedenfor.

Steven Haines