Wéi eng NodeJS App Serverlos ze maachen

Hoffen Dir hutt Serverless sou gär wéi ech, well dëst ass e weidere Post zum Thema.

Wann et en einfache Server-manner REST API ass, ass Äre Setup an AWS: Lambda + API Gateway relativ evident.

Awer wéi iwwer aner (Mikro) Servicer Äre Backend kann hunn? Dir wësst, all Ären Uwendungscode an eng eenzeg monolithesch AWS Lambda Funktioun ze wéckelen ass net déi bescht Iddi.

D'Erausfuerderung

Mir wëllen Uwendungsmoduler einfach als serverlos Mikroservicer ubidden, déi och matenee musse kommunizéieren. Kommunikatioun tëscht Servicer soll am léifsten duerch eng Aart ACL geregelt ginn.

Versuch 1. API Gateway

Dëst ass den éischte Gedanken, deen ech hat beim Versuch de Problem ze léisen: just all Mikroservicer duerch API Gateway aussetzen. De Problem ass ... d'APIen erstallt sinn ëffentlech.

Firwat ass dat e Problem? Zum Beispill wëlle mir net datt e Rechnungsservice iwwerall op der Welt verfügbar ass, och wann den Zougang duerch Autorisatioun limitéiert ass.

Gutt, Dir kënnt d'API privat maachen, awer d'Sécherheetsrichtlinnen sinn zimlech limitéiert:

Dir kënnt API Gateway Ressource Politiken benotze fir datt Är API sécher opgeruff gëtt vun:
* Benotzer vun engem spezifeschen AWS Kont * Spezifizéiert IP Adress Adressen oder CIDR Blocen * Spezifizéiert virtuell privat Wolleken (VPCs) oder VPC Endpunkter (an all Kont)

Dëst mécht et relativ schwéier d'Kommunikatioun tëscht sou Servicer ze kontrolléieren. Deen eenzege Wee fir dëst hei ze maachen ass d'Servicer a getrennte VPCen ze setzen, wat ze vill Aarbecht ass.

Experiment 2. Lambda

Firwat setze mir net all Mikroservice an eng separat AWS Lambda? Wäert dëst de Problem léisen?

Jo, et ass wierklech e serverlose Mikroservice, an Dir kënnt IAM Politik benotze fir den Inter-Service Zougang ze optimiséieren. Dëst ass awer net "einfach".

Ech weess et ass ganz normal dës Deeg eng kleng Roll als Liwwerunitéit ze hunn. Am Fall wou Äre Service méi wéi een Endpunkt / Method / Funktioun huet, ass et gutt et als méi Lambdas ze bidden.

Ech verstinn d'Virdeeler, awer Dir maacht Affer vun der Ënnerhalung an der Entwécklung. Och ech hunn d'Iddi net gär e ​​Service ausgesat ze hunn als e Set vu Lambda Funktiounen. Stellt Iech e puer eenzel Funktiounen vir, déi mat der Rechnung ëmgoen? Et ass net méi e limitéierte Kontext. Wärend et Fäll si wou sou Granularitéit nëtzlech ka sinn, ass et e rare Fall.

Probéiert 3. Fett Lambda

Kënne mir tatsächlech eng Rei Endpunkter als eenzeg Lambda ubidden (natierlech ouni API Gateway)?

Wa mir dëst kéinte maachen, géife mir d'Virdeeler vun der fréierer Optioun voll ausnotzen, awer mir kéinten och d'Granularitéit vun eisen Asazunitéiten wielen.

Hei ass wat ech wëll gesinn: All Service deen Dir implementéiert sollt en einfachen, alen JS Objet mat Methode sinn. Dëst ass relativ einfach ze realiséieren andeems Dir e puer Zeilen u Kleebcode tëscht Ärem Objet an der AWS Lambda bäisetzt.

Hei ass meng Ëmsetzung dovun: aws-rpc. Dëst Nodejs Modul exponéiert d'LambdaHandler Funktioun wou Dir nëmmen een Objet weidergitt, an et gëtt automatesch fir all Benotzer verfügbar déi Zougang zum Lambda hunn:

importéiert {lambdaHandler} vun 'aws-rpc'; Importéiert {TestServiceImpl} vun './TestServiceImpl';
// dëst ass Är Inszenéierungseenheet // dat ass wat Dir uginn als Lambda Handler Funktioun Export Const Handler = lambdaHandler (neien TestServiceImpl ());

Elo kënnt Dir einfach den "Handler" als AWS Lambda ubidden. Wéi nennt een d'Methoden:

Importéiert {TestService} vun './TestService';
const Client = waart op createClient ("LambdaName", "Test"); console.log (waart op client.test ());

Maacht weg datt fir Methoden fir de Client Stub Objet ze generéieren, musst Dir all Methodennimm weiderginn fir Client ze kreéieren wéi am Beispill.

Dëst ass noutwendeg well JS keng Runtime Informatioun iwwer TypeScript Interfaces huet. Ech kéint et mat abstrakte Klassen ëmsetzen, awer ech hunn ¯ \ _ (ツ) _ / ¯ net gär.

Bonus! Dir kënnt alles lokal maachen!

Ech mengen et ass ganz wichteg datt Äert lokalt Entwécklungsëmfeld esou bequem wéi méiglech ass. Aus dësem Grond hunn ech och d'Fäegkeet derbäigesat de Service an de Client lokal ze lafen ouni eppes fir AWS mussen zur Verfügung ze stellen (kuck Funktiounen runService an createClient). Dir fannt Beispiller am GitHub Repository.

Resumé

Et ass ganz einfach ze maachen wann Dir an de Servicer verluer geet déi Cloud Ubidder ubidden an Är Infrastruktur iwwerschaffen.

Ech wielen ëmmer déi einfachst an explizitst Léisung un déi ech denken kann. Denkt och ëmmer drun datt vill Techniken a Praktiken aus anere Plattformen weiderbenotzt kënne ginn (d'Iddi vum fett NodeJS Lambda ass inspiréiert vu sougenannte fett Brëller aus der Java Welt).

Wann Dir dëst Thema gär hutt, liest och folgend:

  • Dir musst léieren wéi Dir déi bescht serverlos Architektur baut
  • Wéi bauen ech eng gratis Serverlos CI / CD Pipeline: 3 einfach Beispiller
  • Einfach Replikatioun vun DynamoDB iwwer Regiounen
  • Wéi bauen ech eng multiregional Uwendung (a bezuelt Null)
  • Maacht Java Web App Serverlos

Kommentarer, Likes an Shares si ganz appréciéiert. D'ënnescht d'iewecht!