Programmering

Serverløs databehandling med AWS Lambda, del 2

Første halvdel av denne artikkelen presenterte en oversikt over serverløs databehandling med AWS Lambda, inkludert å bygge, distribuere og teste AWS Lambda-funksjoner i et eksempel på et Java-program. I del 2 lærer du hvordan du integrerer Lambda-funksjoner med en ekstern database, i dette tilfellet DynamoDB. Vi bruker deretter AWS SDK til å påkalle Lambda-funksjoner fra vårt eksempel Java-program.

AWS Lambda og DynamoDB

DynamoDB er en NoSQL-dokumentbutikk som er vert for Amazon Web Services (AWS). DynamoDB definerer dataabstraksjoner som tabeller, som godtar vanlige databasoperasjoner som innsetting, henting, spørring, oppdatering og sletting. Som med mange andre NoSQL-databaser, er ikke DynamoDBs skjema løst, så noen elementer i samme tabell kan ha felt som andre ikke gjør.

En av DynamoDBs beste funksjoner er den trinnvise prismodellen. I motsetning til AWS Relational Database Service (RDS), der AWS administrerer databasen din ved hjelp av EC2-forekomster du betaler for, er DynamoDB pay-as-you-go. Du betaler for lagring du bruker og gjennomstrømningen av spørsmålene dine, men du betaler ikke direkte for noen underliggende virtuelle maskiner. I tillegg gir AWS deg et gratis nivå som støtter opptil 25 GB plass, med nok kapasitet til å utføre opptil 200 millioner forespørsler per måned.

I serverløs databehandling med AWS Lambda, del 1, utviklet vi en enkel, serverløs Java-applikasjon ved bruk av Lambda-funksjoner. Du kan laste ned kildekoden for GetWidgetHandler-applikasjonen når som helst. Hvis du ikke allerede har lest del 1, foreslår jeg at du gjør deg kjent med applikasjonskoden og eksempler fra den artikkelen før du fortsetter.

Vårt første skritt er å sette opp DynamoDB-databasen i AWS-konsollen. Etter det oppdaterer vi få-widget funksjon fra del 1 for å hente en widget fra en DynamoDB-tabell.

Sett opp DynamoDB-databasen i AWS

Vi begynner med å lage DynamoDB-tabellen. Klikk på fra AWS-konsollen Tjenester og velg DynamoDB fra databaseseksjonen, som vist i figur 1.

Steven Haines

Når du er lansert, ser du DynamoDB-dashbordet. Klikk på Lag bord -knappen for å begynne å lage bordet, vist i figur 2.

Steven Haines

Nå ser du siden vist i figur 3.

Steven Haines

Gi bordet ditt et navn (i dette tilfellet "Widget") og sett hovednøkkelen til id, forlater det som en String. Pressing Skape når du er ferdig vil du lede deg til siden DynamoDB tabeller. Hvis du trenger å navigere til denne siden i fremtiden, velger du Tjenester -> DynamoDB, og klikk på Tabeller.

Steven Haines

Vi oppretter en oppføring manuelt i den nye widgettabellen, så klikk på Lag vare knappen vist i figur 5.

Steven Haines

DynamoDB vil forhåndsutfylle siden Opprett vare med id felt. Skriv inn en ID som er lett å huske, for eksempel "1". Trykk deretter på pluss (+) ved siden av den nye ID-en, og legg til et annet felt som heter Navn. Angi en verdi for Navn felt, for eksempel "Widget 1". trykk Lagre når du er ferdig.

Oppdater GetWidgetHandler-klassen

Med data i databasen vår, er det neste vi trenger å gjøre å oppdatere GetWidgetHandler klasse fra del 1. Vi begynner med å legge til DynamoDB-avhengighet i vår opprinnelige POM-fil. Den oppdaterte pom.xml filen vises i liste 1.

Oppføring 1. pom.xml (oppdatert med DynamoDB avhengighet)

 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 pakkeskygge 

Oppføring 1 legger til aws-java-sdk-dynamodb avhengighet til POM-filen fra del 1. Oppføring 2 viser den oppdaterte GetWidgetHandler klasse.

Oppføring 2. GetWidgetHandler.java (oppdatert for å laste inn 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; importer com.amazonaws.services.dynamodbv2.document.Table; importer com.amazonaws.services.lambda.runtime.Context; importer com.amazonaws.services.lambda.runtime.RequestHandler; importere com.javaworld.awslambda.widget.model.Widget; importere com.javaworld.awslambda.widget.model.WidgetRequest; offentlig klasse GetWidgetHandler implementerer RequestHandler {@Override public Widget handleRequest (WidgetRequest widgetRequest, Context context) {// returner ny Widget (widgetRequest.getId (), "Min widget" + widgetRequest.getId ()); // Opprett en forbindelse til DynamoDB AmazonDynamoDB-klient = AmazonDynamoDBClientBuilder.defaultClient (); DynamoDB dynamoDB = ny DynamoDB (klient); // Få en referanse til widget-tabellen Table table = dynamoDB.getTable ("Widget"); // Få varen vår etter ID Item item = table.getItem ("id", widgetRequest.getId ()); hvis (vare! = null) {System.out.println (item.toJSONPretty ()); // Returner et nytt widgetobjekt, returner nytt widget (widgetRequest.getId (), item.getString ("navn")); } annet {returner ny widget (); }}} 

Hovedgrensesnittet til DynamoDB er DynamoDB gjenstand. For å skape en DynamoDB For eksempel trenger vi en DynamoDB-klient. Fordi Lambda-funksjonen vår kjører i AWS, trenger vi ikke å oppgi legitimasjon, slik at vi kan bruke standardklienten. Merk at vi bare kan spørre databasen uten legitimasjon fordi få-widget-rolle fra del 1 har dynamodb: GetItem tillatelse.

Fra DynamoDB for eksempel kan vi ringe getTable ("Widget") å hente en Bord forekomst. Så kan vi ringe getItem ()Bord eksempel, ved å gi den den primære nøkkelen til varen vi vil hente. Hvis det er et element med den angitte primærnøkkelen, vil den returnere et gyldig svar; ellers kommer den tilbake null. De Punkt klasse gir tilgang til responsparametrene, så vi fullfører implementeringen ved å lage en ny Widget objekt med navnet lastet fra DynamoDB.

last ned Få koden Få koden for det oppdaterte GetWidgetHandler-programmet. Skapt av Steven Haines for JavaWorld.

Spørring av DynamoDB med DynamoDBMapper

Det er flere API-er for spørring av DynamoDB, fra en RESTful servicekall, til grensesnittet på lavt nivå ovenfor, til et par grensesnitt på høyere nivå. En av de mer populære grensesnittene er DynamoDBMapper. Dette grensesnittet gir en lignende konstruksjon som det du kan finne når du tilordner objekter til relasjonsdata i et verktøy som dvalemodus. La oss kort gjennomgå hvordan du henter en Widget fra DynamoDB ved hjelp av DynamoDBMapper API.

Det første vi trenger å gjøre er å legge til noen kommentarer i Widget klasse, som er vist i Listing 3.

Oppføring 3. Widget.java (oppdatert med DynamoDBMapper-merknader)

 pakke com.javaworld.awslambda.widget.model; importer com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAttribute; importer com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBHashKey; importer com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTable; @DynamoDBTable (tableName = "Widget") offentlig klasse Widget {privat streng-id; privat strengnavn; public Widget () {} public Widget (String id) {this.id = id; } offentlig widget (streng-id, strengnavn) {this.id = id; this.name = navn; } @DynamoDBHashKey (attributeName = "id") offentlig streng getId () {retur id; } public void setId (String id) {this.id = id; } @ DynamoDBAttribute (attributtnavn = "navn") offentlig String getName () {returnavn; } public void setName (String name) {this.name = name; }} 

De DynamoDBTable kommentar spesifiserer navnet på DynamoDB-tabellen som Widget kart. De DynamoDBHashKey kommentar identifiserer den primære nøkkelen til Widget bord. Og DynamoDBA-attributt kommentar identifiserer andre klasseattributter som tilordnes til databaseattributter i DynamoDB. Hvis du hadde andre attributter som du ønsket å ignorere, kan du legge til @DynamoDBIgnore kommentar.

Med Widget klasse merket, kan vi nå oppdatere GetWidgetHandler klasse for å bruke DynamoDBMapper, som er vist i oppføring 4.

Oppføring 4. GetWidgetHandler.java (oppdatert 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; importer com.amazonaws.services.lambda.runtime.RequestHandler; importere com.javaworld.awslambda.widget.model.Widget; importere com.javaworld.awslambda.widget.model.WidgetRequest; offentlig klasse GetWidgetHandler implementerer RequestHandler {@Override public Widget handleRequest (WidgetRequest widgetRequest, Context context) {// Opprett en forbindelse til DynamoDB AmazonDynamoDB-klient = AmazonDynamoDBClientBuilder.defaultClient (); // Bygg en kartlegger DynamoDBMapper-kartlegger = ny DynamoDBMapper (klient); // Last inn widgeten etter ID Widget-widget = mapper.load (Widget.class, widgetRequest.getId ()); hvis (widget == null) {// Vi fant ikke en widget med denne ID-en, så returner en tom Widget-kontekst. getLogger (). logg ("Ingen widget funnet med ID:" + widgetRequest.getId () + "\ n "); returner ny widget (); } // Returner widgeten for retur av widgeten; }} 

I den tidligere (del 1) versjonen av GetWidgetHandler vi opprettet en AmazonDynamoDB eksempel ved hjelp av en AmazonDynamoDBClientBuilder.defaultClient () anrop. Nå bruker vi den klienten til å initialisere en DynamoDBMapper forekomst i stedet.

DynamoDBMapper-klassen gir tilgang til å utføre spørringer, laste objekter etter ID, lagre objekter, slette objekter og så videre. I dette tilfellet passerer vi DynamoDBMapper widgetens klasse (Widget.klasse) og hovednøkkelen. Hvis DynamoDB har en Widget med den angitte primærnøkkelen vil den returnere den; hvis ikke vil den returnere null.

Bygg opp og last deretter opp den nye JAR-filen på nytt ved å åpne dashbordet til Lambda-funksjonen, og klikk deretter på Kode og trykk på Laste opp. Når du laster opp og deretter ringer til funksjonen din, vil AWS Lambda opprette en ny container for den nye JAR-filen og skyve den til en EC2-forekomst. Du bør forvente at den første løpeturen går sakte.

Hvis du tilfeldigvis støter på en OutOfMemoryError når du tester funksjonen din på nytt, velger du Konfigurasjon kategorien og åpne delen Avanserte innstillinger. Her kan du øke minnet ditt, som vist nedenfor.

Steven Haines