Hvernig á að búa til NodeJS app netlaust

Vona að þú elskir Serverless eins mikið og ég, þar sem þetta er önnur færsla um sama efni.

Ef þetta er einfalt, netlaust REST API er uppsetning þín í AWS: Lambda + API Gateway ansi augljós.

En hvað með aðrar (ör) þjónustur þínar geta haft? Þú veist að setja alla umsóknarkóðann þinn í eina einliða AWS Lambda aðgerð er ekki besta hugmyndin.

Áskorunin

Við viljum bjóða upp á forritseiningar einfaldlega sem netþjónustulítil örþjónusta sem einnig þurfa að eiga samskipti sín á milli. Samskipti milli þjónustu ættu helst að vera stjórnað af tegund ACL.

Tilraun 1. API Gateway

Þetta er fyrsta hugsunin sem ég hafði þegar ég reyndi að leysa vandamálið: afhjúpaðu bara allar örþjónustur í gegnum API Gateway. Vandamálið er ... forritaskilin sem verið er að búa til eru opinber.

Af hverju er það vandamál? Við viljum til dæmis ekki að greiðsluþjónusta sé til staðar hvar sem er í heiminum þó að aðgangur sé takmarkaður með heimild.

Jæja, þú getur gert API forritið en öryggisleiðbeiningarnar eru ansi takmarkaðar:

Þú getur notað API Gateway Resource Policies til að leyfa API þínu að vera kallað á öruggan hátt af:
* Notandi tiltekins AWS reiknings * Tilgreindir IP töluheimildir eða CIDR blokkir * Tilgreindir sýndar einkaský (VPC) eða VPC endapunktar (á hvaða reikningi sem er)

Þetta gerir það nokkuð erfitt að stjórna samskiptum milli slíkra þjónustu. Eina leiðin til að gera þetta hér er að setja þjónustu í aðskildar VPC, sem er of mikil vinna.

Tilraun 2. Lambda

Af hverju setjum við ekki bara hverja örþjónustu í sérstaka AWS Lambda? Mun þetta leysa vandamálið?

Já, það er örugglega netþjónustulaus örþjónusta og þú getur notað IAM stefnur til að hámarka aðgang milli þjónustu. Þetta er þó ekki „auðvelt“.

Ég veit að það er alveg eðlilegt þessa dagana að hafa örlítið hlutverk sem afhendingareining. Ef þjónustan þín hefur fleiri en einn endapunkt / aðferð / aðgerð er allt í lagi að veita hana sem margar lambadýr.

Ég skil ávinninginn, en þú fórnar auðveldu viðhaldi og þróun. Einnig líkar mér ekki mjög sú hugmynd að láta þjónustuna verða fyrir hendi sem safn af Lambda-aðgerðum. Ímyndaðu þér nokkrar aðskildar aðgerðir sem fjalla um innheimtu? Það er ekki lengur takmarkað samhengi. Þó að það séu tilfelli þar sem slíkt korn getur verið gagnlegt, þá er það sjaldgæft tilfelli.

Prófaðu 3. Feita Lambda

Getum við í raun útvegað fjölda endapunkta sem eina Lambda (án API gáttar, auðvitað)?

Ef við gætum gert þetta myndum við taka alla kosti fyrri valkostar, en við gætum líka valið nákvæmni dreifieininga okkar.

Þetta er það sem ég vil: Sérhver þjónusta sem þú getur framkvæmt ætti að vera einfaldur, gamall JS hlutur með aðferðum. Þetta er frekar auðvelt að ná með því að bæta við nokkrum línum af límkóða milli hlutar þíns og AWS Lambda.

Hér er mín framkvæmd á því: aws-rpc. Þessi nodejs eining afhjúpar lambdaHandler aðgerðina þar sem þú sendir aðeins einn hlut og hún er sjálfkrafa gerð aðgengileg öllum notendum sem hafa aðgang að lambda:

flytja inn {lambdaHandler} frá 'aws-rpc'; Flytja inn {TestServiceImpl} frá './TestServiceImpl';
// þetta er sviðsetningareining þín // þetta er það sem þú tilgreinir sem lambda meðhöndlunaraðgerð útflutnings const meðhöndlun = lambdaHandler (nýr TestServiceImpl ());

Nú getur þú einfaldlega útvegað „meðhöndlara“ sem AWS Lambda. Hvernig á að kalla aðferðirnar:

Flytja inn {TestService} frá './TestService';
const viðskiptavinur = bíddu eftir createClient ("LambdaName", "próf"); console.log (bíddu eftir client.test ());

Vinsamlegast athugaðu að til að geta búið til aðferðir fyrir viðskiptavininn stub mótmæla, verður þú að senda öll aðferðarheiti til að búa til Client eins og í dæminu.

Þetta er nauðsynlegt vegna þess að JS hefur engar upplýsingar um keyrslu á TypeScript tengi. Ég gæti framkvæmt það með óhlutbundnum flokkum, en mér líkar ekki ¯ \ _ (ツ) _ / ¯.

Bónus! Þú getur gert þetta allt á staðnum!

Ég held að það sé mjög mikilvægt að þróunarumhverfi þitt á staðnum sé eins þægilegt og mögulegt er. Af þessum sökum hef ég einnig bætt við möguleikanum á að keyra þjónustuna og viðskiptavininn á staðnum án þess að þurfa að útvega neitt fyrir AWS (sjá aðgerðir runService og createClient). Þú getur fundið dæmi í GitHub geymslunni.

Yfirlit

Það er mjög auðvelt að gera þegar þú týnist í þjónustunni sem skýveitur bjóða upp á og endurskoðar innviði þína.

Ég vel alltaf einfaldustu og skýrustu lausnina sem mér dettur í hug. Hafðu einnig alltaf í huga að hægt er að endurnýta margar aðferðir og venjur frá öðrum vettvangi (hugmyndin um djarfa NodeJS Lambda er innblásin af svokölluðum djörfum gleraugum frá Java heiminum).

Ef þér líkar þetta efni skaltu lesa eftirfarandi líka:

  • Þú verður að læra hvernig á að byggja upp bestu netlausu arkitektúrinn
  • Hvernig byggja á upp ókeypis netlausa CI / CD leiðslu: 3 einföld dæmi
  • Auðveld eftirmynd DynamoDB yfir svæði
  • Hvernig á að byggja upp fjölsvæðisforrit (og borga núll)
  • Gerðu Java Web App netþjón

Athugasemdir, líkar og deilingar eru mjög vel þegnar. Botninn upp!