Programmēšana

Bez servera skaitļošana ar AWS Lambda, 2. daļa

Šī raksta pirmajā pusē tika sniegts pārskats par skaitļošanu bez serveriem ar AWS Lambda, tostarp AWS Lambda funkciju izveidi, izvietošanu un testēšanu Java piemērā. 2. daļā jūs uzzināsiet, kā integrēt Lambda funkcijas ar ārēju datu bāzi, šajā gadījumā DynamoDB. Pēc tam mēs izmantosim AWS SDK, lai izsauktu Lambda funkcijas no mūsu Java lietojumprogrammas piemēra.

AWS Lambda un DynamoDB

DynamoDB ir NoSQL dokumentu veikals, kuru mitina Amazon Web Services (AWS). DynamoDB datu abstrakcijas definē kā tabulas, kas pieņem kopīgas datu bāzes darbības, piemēram, ievietošanu, izgūšanu, vaicājumu, atjaunināšanu un dzēšanu. Tāpat kā daudzās citās NoSQL datu bāzēs, arī DynamoDB shēma nav fiksēta, tāpēc dažiem vienas tabulas vienumiem var būt lauki, kas citiem nav.

Viena no DynamoDB labākajām īpašībām ir daudzpakāpju cenu modelis. Atšķirībā no AWS Relāciju datu bāzes pakalpojuma (RDS), kurā AWS pārvalda jūsu datu bāzi, izmantojot EC2 gadījumus, par kuriem maksājat, DynamoDB ir maksas atalgojums. Jūs maksājat par izmantoto krātuvi un vaicājumu caurlaidi, bet tieši nemaksājat par visām pamatā esošajām virtuālajām mašīnām. Turklāt AWS nodrošina bezmaksas līmeni, kas nodrošina līdz pat 25 GB vietas, ar pietiekamu caurlaidspēju, lai izpildītu līdz 200 miljoniem pieprasījumu mēnesī.

Skaitļošanā bez servera ar AWS Lambda, 1. daļa, mēs izstrādājām vienkāršu Java bez aplikācijas lietojumprogrammu, izmantojot Lambda funkcijas. GetWidgetHandler lietojumprogrammas avota kodu varat lejupielādēt jebkurā laikā. Ja jūs vēl neesat izlasījis 1. daļu, iesaku pirms turpināt iepazīties ar lietojumprogrammas kodu un šī raksta piemēriem.

Pirmais solis ir DynamoDB datu bāzes iestatīšana AWS konsolē. Pēc tam mēs atjaunināsim get-widget funkcija no 1. daļas, lai izgūtu logrīku no DynamoDB tabulas.

Iestatiet DynamoDB datu bāzi AWS

Sāksim ar DynamoDB tabulas izveidošanu. No AWS konsoles noklikšķiniet uz Pakalpojumi un datu bāzes sadaļā izvēlieties DynamoDB, kā parādīts 1. attēlā.

Stīvens Heinss

Pēc palaišanas jūs redzēsiet DynamoDB informācijas paneli. Noklikšķiniet uz Izveidot tabulu pogu, lai sāktu veidot tabulu, kā parādīts 2. attēlā.

Stīvens Heinss

Tagad jūs redzēsiet lapu, kas parādīta 3. attēlā.

Stīvens Heinss

Piešķiriet savai tabulai nosaukumu (šajā gadījumā - logrīku) un iestatiet primāro atslēgu uz id, atstājot to kā Stīga. Spiešana Izveidot kad esat pabeidzis, jūs novirzīsit uz DynamoDB tabulu lapu. Ja jums nākotnē jādodas uz šo lapu, atlasiet Pakalpojumi -> DynamoDBun noklikšķiniet uz Galdi.

Stīvens Heinss

Mēs manuāli izveidosim ierakstu jaunajā logrīku tabulā, tāpēc noklikšķiniet uz Izveidot vienumu poga parādīta 5. attēlā.

Stīvens Heinss

DynamoDB iepriekš aizpildīs lapu Izveidot vienumu ar id laukā. Ievadiet viegli atceramu ID, piemēram, “1”. Pēc tam nospiediet plus (+) blakus jaunajam ID, pievienojot vēl vienu lauku ar nosaukumu nosaukums. Ievadiet vērtību nosaukums laukā, piemēram, "Widget 1". Nospiediet Saglabāt kad esat pabeidzis.

Atjauniniet klasi GetWidgetHandler

Tā kā dati ir mūsu datu bāzē, nākamā lieta, kas mums jādara, ir atjaunināt GetWidgetHandler klase no 1. daļas. Sāksim, pievienojot DynamoDB atkarību mūsu sākotnējam POM failam. Atjaunināts pom.xml fails ir parādīts 1. sarakstā.

Saraksts 1. pom.xml (atjaunināts ar atkarību no 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 tests org.apache.maven.plugins maven-compiler-plugin 2.0.2 $ {java.version} $ {java.version} org.apache.maven.plugins maven-shadow -spraudnis 2.3 viltus paketes tonis 

1. saraksts pievieno aws-java-sdk-dynamodb atkarība no POM faila no 1. daļas. 2. saraksts parāda atjaunināto GetWidgetHandler klasē.

2. saraksts GetWidgetHandler.java (atjaunināts, lai ielādētu datus no DynamoDB)

 pakete com.javaworld.awslambda.widget.handlers; importēt com.amazonaws.services.dynamodbv2.AmazonDynamoDB; importēt com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder; importēt com.amazonaws.services.dynamodbv2.document.DynamoDB; importēt com.amazonaws.services.dynamodbv2.document.Item; importēt com.amazonaws.services.dynamodbv2.document.Table; importēt com.amazonaws.services.lambda.runtime.Context; importēt com.amazonaws.services.lambda.runtime.RequestHandler; importēt com.javaworld.awslambda.widget.model.Widget; importēt com.javaworld.awslambda.widget.model.WidgetRequest; publiskā klase GetWidgetHandler īsteno RequestHandler {@Override public Widget handleRequest (WidgetRequest widgetRequest, Context context) {// atgriezt jaunu logrīku (widgetRequest.getId (), "Mans logrīks" + widgetRequest.getId ()); // Izveidojiet savienojumu ar DynamoDB AmazonDynamoDB klientu = AmazonDynamoDBClientBuilder.defaultClient (); DynamoDB dynamoDB = jauns DynamoDB (klients); // Iegūstiet atsauci uz logrīku tabulas tabulas tabulu = dynamoDB.getTable ("Logrīks"); // Iegūstiet mūsu vienumu pēc ID Vienuma vienums = table.getItem ("id", widgetRequest.getId ()); if (vienums! = null) {System.out.println (item.toJSONPretty ()); // Atgriezt jaunu logrīka objektu atgriezt jaunu logrīku (widgetRequest.getId (), item.getString ("nosaukums")); } else {return new Widget (); }}} 

Galvenā DynamoDB saskarne ir DynamoDB objekts. Lai izveidotu a DynamoDB mums, piemēram, ir nepieciešams DynamoDB klients. Tā kā mūsu Lambda funkcija darbosies AWS, mums nav jāsniedz akreditācijas dati, tāpēc mēs varam izmantot noklusējuma klientu. Ņemiet vērā, ka mēs varēsim vaicāt datu bāzē tikai bez akreditācijas datiem, jo get-widget-role no 1. daļas ir dynamodb: GetItem atļauju.

No DynamoDB Piemēram, mēs varam piezvanīt getTable ("logrīks") lai izgūtu a Tabula instancē. Tad mēs varam piezvanīt getItem () uz Tabula piemēram, nododot tā elementa primāro atslēgu, kuru vēlamies izgūt. Ja ir vienums ar norādīto primāro atslēgu, tas atgriezīs derīgu atbildi; pretējā gadījumā tas atgriezīsies nulle. The Lieta klase nodrošina piekļuvi atbildes parametriem, tāpēc mēs pabeidzam ieviešanu, izveidojot jaunu Logrīks objekts ar tā nosaukumu, kas ielādēts no DynamoDB.

lejupielāde Iegūstiet kodu Iegūstiet atjauninātās GetWidgetHandler lietojumprogrammas kodu. Izveidoja Steven Haines JavaWorld.

Vaicājums DynamoDB ar DynamoDBMapper

Ir vairākas API, lai vaicātu DynamoDB, sākot no RESTful servisa izsaukuma, līdz iepriekš norādītajam zema līmeņa interfeisam, līdz pāris augstāka līmeņa saskarnēm. Viena no populārākajām saskarnēm ir DynamoDBMapper. Šī saskarne nodrošina līdzīgu uzbūvi tam, ko jūs varētu atrast, objektus kartējot ar relācijas datiem tādā rīkā kā Hibernate. Īsi apskatīsim, kā iegūt a Logrīks no DynamoDB, izmantojot DynamoDBMapper API.

Pirmais, kas mums jādara, ir pievienot dažas anotācijas Logrīks klase, kas parādīta 3. sarakstā.

Saraksts 3. Widget.java (atjaunināts ar DynamoDBMapper anotācijām)

 pakete com.javaworld.awslambda.widget.model; importēt com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAttribute; importēt com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBHashKey; importēt com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTable; @DynamoDBTable (tableName = "Logrīks") public class Widget {private String id; privāts virknes nosaukums; public Widget () {} public Widget (String id) {this.id = id; } public Widget (String id, String name) {this.id = id; this.name = nosaukums; } @DynamoDBHashKey (attributeName = "id") public String getId () {return ID; } public void setId (String id) {this.id = id; } @DynamoDBAttribute (attributeName = "name") public String getName () {atgriešanās nosaukums; } public void setName (virknes nosaukums) {this.name = name; }} 

The DynamoDBTable anotācijā norāda DynamoDB tabulas nosaukumu, kurai Logrīks kartes. The DynamoDBHashKey anotācija identificē Logrīks tabula. Un DynamoDBAttribute anotācija identificē citus klases atribūtus, kas tiek piesaistīti DynamoDB datu bāzes atribūtiem. Ja jums būtu citi atribūti, kurus vēlaties ignorēt, varat tos pievienot @DynamoDBIgnore anotācija.

Ar Logrīks klases piezīmes, tagad mēs varam atjaunināt GetWidgetHandler klasei izmantot DynamoDBMapper, kas parādīts 4. sarakstā.

4. saraksts GetWidgetHandler.java (atjaunināts ar DynamoDBMapper)

 pakete com.javaworld.awslambda.widget.handlers; importēt com.amazonaws.services.dynamodbv2.AmazonDynamoDB; importēt com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder; importēt com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper; importēt com.amazonaws.services.lambda.runtime.Context; importēt com.amazonaws.services.lambda.runtime.RequestHandler; importēt com.javaworld.awslambda.widget.model.Widget; importēt com.javaworld.awslambda.widget.model.WidgetRequest; publiskā klase GetWidgetHandler īsteno RequestHandler {@Override public Widget handleRequest (WidgetRequest widgetRequest, konteksta konteksts) {// Izveidojiet savienojumu ar DynamoDB AmazonDynamoDB client = AmazonDynamoDBClientBuilder.defaultClient (); // Izveidojiet kartētāju DynamoDBMapper mapper = jauns DynamoDBMapper (klients); // Ielādējiet logrīku pēc ID Logrīka logrīks = mapper.load (Widget.class, widgetRequest.getId ()); if (widget == null) {// Mēs neatradām logrīku ar šo ID, tāpēc atgrieziet tukšu logrīka context.getLogger (). log. ("Logrīks ar ID nav atrasts:" + widgetRequest.getId () + "\ n "); atgriezt jaunu logrīku (); } // Atgrieziet logrīku atgriešanas logrīku; }} 

Iepriekšējā (1. Daļas) versijā GetWidgetHandler mēs izveidojām AmazonDynamoDB piemēram, izmantojot a AmazonDynamoDBClientBuilder.defaultClient () zvanu. Tagad mēs izmantosim šo klientu, lai inicializētu a DynamoDBMapper tā vietā.

Klase DynamoDBMapper nodrošina piekļuvi vaicājumu izpildei, objektu ielādēšanai pēc ID, objektu saglabāšanai, objektu dzēšanai utt. Šajā gadījumā mēs ejam garām DynamoDBMapper logrīka klase (Logrīks.klase) un tā galvenā atslēga. Ja DynamoDB ir a Logrīks ar norādīto primāro atslēgu to atgriezīs; ja nē, tas atgriezīsies nulle.

Pārbūvējiet un pēc tam atkārtoti augšupielādējiet jauno JAR failu, atverot Lambda funkcijas informācijas paneli, pēc tam noklikšķiniet uz Kods cilni un nospiediet Augšupielādēt. Kad atkārtoti augšupielādējat un pēc tam izsaucat savu funkciju, AWS Lambda izveidos jaunu konteineru jaunajam JAR failam un virzīs to uz EC2 instanci. Jums vajadzētu sagaidīt, ka pirmais brauciens būs lēns.

Ja gadās sastapties ar OutOfMemoryError atkārtoti pārbaudot savu funkciju, atlasiet Konfigurācija cilni un atveriet sadaļu Papildu iestatījumi. Šeit jūs varat palielināt atmiņu, kā parādīts zemāk.

Stīvens Heinss
$config[zx-auto] not found$config[zx-overlay] not found