Ako si vyrobiť ľubovoľnú aplikáciu NodeJS bez serverov

Dúfam, že máte radi serverless, rovnako ako ja, pretože toto je ďalší príspevok na túto tému.

Ak teraz hovoríme o jednoduchom REST API bez serverov, vaše nastavenie je úplne zrejmé na AWS: Lambda + API Gateway.

Ale čo iné (mikro) služby, ktoré môže mať váš backend? Viete, nie je to najlepší nápad umiestniť všetok váš aplikačný kód do jedinej monolitickej funkcie AWS Lambda.

Výzva

Chceme ľahko nasadiť aplikačné moduly ako mikroservisy bez serverov, ktoré tiež musia navzájom komunikovať. Komunikácia medzi službami by mala byť pokiaľ možno regulovaná nejakým druhom ACL.

Pokus 1. Gateway API

Toto je prvá myšlienka, ktorú som mal, keď som sa snažil problém vyriešiť: iba odhalte všetky mikroprocesy prostredníctvom rozhrania API Gateway. Problém je… Vytvorené API sú verejné.

Prečo je to problém? Napríklad nechceme, aby bola fakturačná služba vystavená celému svetu, aj keď je prístup obmedzený pomocou nejakého druhu autorizácie.

Rozhranie API môžete nastaviť ako súkromné, ale pravidlá zabezpečenia sú dosť obmedzené:

Zásady prostriedkov rozhrania API Gateway môžete použiť na bezpečné vyvolanie rozhrania API:
* používatelia z určeného účtu AWS
* zadané rozsahy zdrojových IP adries alebo bloky CIDR
* zadané virtuálne súkromné ​​oblaky (VPC) alebo koncové body VPC (na ľubovoľnom účte)

Preto je veľmi problematické riadiť komunikáciu medzi takýmito službami. Jediným spôsobom, ako to dosiahnuť, je umiestniť služby do samostatných VPC, príliš veľa práce.

Pokus 2. Lambda

Prečo sme do mikroservisu nezaradili samostatnú AWS Lambdu? Vyrieši sa tým problém?

Áno, v skutočnosti to bude mikroservis bez serverov a vy budete môcť použiť politiky IAM na vyladenie prístupov medzi službami, ale ... Nie je to „ľahké“.

Viem, že v súčasnosti je normálne mať malú funkciu ako jednotka nasadenia. V prípade, že má vaša služba viac ako 1 koncový bod / metódu / funkciu, považuje sa za vhodné nasadiť ju ako viacero Lambdas.

Chápem jeho výhody, ale obetujete ľahkú údržbu a vývoj. Naozaj sa mi nepáči myšlienka nasadenia služby ako súboru funkcií Lambda. Predstavte si niekoľko samostatných funkcií týkajúcich sa fakturácie? Už to nie je obmedzený kontext. Aj keď existujú prípady, keď takáto granularita môže byť užitočná, ale je to zriedkavý prípad.

Pokus 3. Tuk Lambda

Môžeme skutočne nasadiť skupinu koncových bodov ako jednu Lambdu (samozrejme bez použitia API Gateway)?

Keby sme to dokázali, dostali by sme všetky výhody predchádzajúcej možnosti, ale mohli by sme si tiež zvoliť granularitu našich nasadzovacích jednotiek.

Spôsob, akým to chcem, je nasledujúci: každá nasaditeľná služba by mala byť jednoduchý obyčajný starý objekt JS s metódami. Toto je celkom triviálne dosiahnuť pridaním niekoľkých riadkov kódu lepidla medzi váš objekt a AWS Lambda.

Tu je moja implementácia: aws-rpc. Tento modul nodejs odhaľuje funkciu lambdaHandler, kde stačí prejsť objekt, a je automaticky vystavený každému, kto má prístup k Lambda:

importovať {lambdaHandler} z 'aws-rpc';
importovať {TestServiceImpl} z './TestServiceImpl';
// Toto je vaša jednotka nasadenia
// to je to, čo zadáte ako funkciu obsluhy Lambdy
export const handler = lambdaHandler (nový testServiceImpl ());

Teraz môžete nasadiť „handler“ ako AWS Lambda. Takto sa odvolávate na jej metódy:

importovať {TestService} z './TestService';
const client = await createClient  ("LambdaName", "test");
console.log (čaká sa na klienta.test ());

Všimnite si, že aby ste mohli generovať metódy pre objekt stub klienta, musíte odovzdať všetky názvy metód pre createClient, ako sme to urobili v príklade.

Je to potrebné, pretože JS nemá žiadne runtime informácie o rozhraniach TypeScript. Mohol by som ho implementovať pomocou abstraktných tried, ale nepáči sa mi to ¯ \ _ (ツ) _ / ¯.

Bonus! Môžete to všetko spustiť lokálne!

Som presvedčený, že je veľmi dôležité mať čo najpohodlnejšie prostredie miestneho rozvoja. Preto som tiež pridal možnosť spustiť službu a klienta lokálne bez nasadenia čohokoľvek na AWS (pozri funkcie runService a createClient). Príklady nájdete v úložisku na GitHub.

zhrnutie

Je veľmi ľahké stratiť sa v službách, ktoré ponúkajú poskytovatelia cloudu, a preinvestovať vašu infraštruktúru.

Vždy si vyberám najjednoduchšie a najpresnejšie riešenie, ktoré dokážem vymyslieť. Nezabudnite tiež, že mnoho techník a postupov je možné opakovane použiť z iných platforiem (myšlienka tuku NodeJS Lambda je inšpirovaná tzv. Tučnými nádobami zo sveta Java).

Ak sa vám táto téma páčila, pozrite si aj tieto:

  • Musíte sa naučiť, ako vytvoriť najlepšiu bez serverovej architektúry
  • Ako vytvoriť bezplatný bezserverový kanál CI / CD: 3 jednoduché príklady
  • Ako ľahko replikovať DynamoDB vo všetkých regiónoch
  • Ako vytvoriť multiregionálnu aplikáciu (a platiť nulovo)
  • Zmeňte akúkoľvek webovú aplikáciu Java na serveri

Komentáre, hodnotenia „Páči sa mi“ a zdieľané položky sú vysoko oceňované. Na zdravie!