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 HainesNå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 HainesNu kan du se siden vist i figur 3.
Steven HainesGiv din tabel et navn (i dette tilfælde "Widget"), og indstil den primære nøgle til id
efterlader 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.
Vi opretter manuelt en post i den nye widget-tabel, så klik på Opret vare knappen vist i figur 5.
Steven HainesDynamoDB 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.
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.