Kako napraviti bilo koji NodeJS App Server bez usluge

Nadam se da volite Serverless koliko i ja jer je ovo još jedan post na tu temu.

Ako govorimo o jednostavnom REST API-u bez poslužitelja, vaše je postavljanje sasvim očito na AWS: Lambda + API Gateway.

Ali kako je s drugim (mikro) uslugama koje vaš backkend može imati? Znate, nije najbolja ideja svu svoju aplikacijsku šifru staviti u jednu monolitnu AWS Lambda funkciju.

Izazov

Želimo lako implementirati aplikacijske module kao mikroserver bez poslužitelja, koji također trebaju međusobno komunicirati. Poželjno je da komunikacija između službi bude regulirana nekim vrstama ACL-a.

Pokušaj 1. Gateway API

Ovo je prva misao koju sam imao kada sam pokušavao riješiti problem: samo izložiti sve mikroservise putem API Gatewaya. Problem je ... Stvoreni API-ji su javni.

Zašto je to problem? Na primjer, ne želimo imati račun za naplatu da bi bio izložen cijelom svijetu, čak i ako je pristup ograničen uporabom neke vrste autorizacije.

Pa, API možete učiniti privatnim, ali sigurnosna pravila prilično su ograničena:

Pomoću pravila resursa Gateway API-ja možete omogućiti siguran pristup API-ju:
* korisnici s određenog AWS računa
* specificirani izvori IP adrese ili blokovi CIDR
* određene virtualne privatne oblake (VPC) ili krajnje točke VPC (na bilo kojem računu)

To čini problematičnu kontrolu komunikacije između takvih usluga. Jedini način da se to postigne je stavljanje usluga u odvojene VPC-ove, previše posla.

Pokušaj 2. Lambda

Zašto jednostavno ne stavimo svaku mikroservis u zasebnu AWS Lambda? Hoće li to riješiti problem?

Da, u stvari će to biti mikroservis bez poslužitelja i moći ćete koristiti IAM pravila kako biste prilagodili pristupe između usluga, ali ... Nije "lako".

Znam da je u današnje vrijeme sasvim normalno da ima malu funkciju kao jedinice za razmještanje. U slučaju da vaša usluga ima više od jedne krajnje točke / metode / funkcije, smatra se da je u redu instalirati je kao više Lambda.

Razumijem njegove prednosti, ali vi žrtvujete lakoću održavanja i razvoja. Također, stvarno mi se ne sviđa ideja o raspoređivanju usluge kao skupa Lambda funkcija. Zamislite, nekoliko zasebnih funkcija koje se bave naplatom? To više nije ograničen kontekst. Iako postoje slučajevi gdje takva preciznost može biti korisna, ali to je rijedak slučaj.

Pokušaj 3. Masna lambda

Možemo li doista rasporediti skup krajnjih točaka kao jedinstvena Lambda (bez upotrebe API-ja Gateway, naravno)?

Ako bismo to uspjeli, dobili bismo sve prednosti prethodne opcije, ali također bismo mogli odabrati detaljnost naših jedinica za razmještaj.

Želim da slijedi: svaka razmjestiva usluga treba biti jednostavan običan stari JS objekt s metodama. To je prilično trivijalno postići ako dodate nekoliko redaka koda ljepila između vašeg objekta i AWS Lambda.

Evo moje implementacije toga: aws-rpc. Ovaj nodejs modul otkriva lambdaHandler funkciju, gdje samo prosljeđujete objekt, i automatski je izložen svima koji imaju pristup Lambda:

import {lambdaHandler} iz 'aws-rpc';
import {TestServiceImpl} iz './TestServiceImpl';
// ovo je vaša jedinica za implementaciju
// ovo je ono što vi odredite kao funkcija Lambda za upravljanje
export const handler = lambdaHandler (novi TestServiceImpl ());

Sada možete jednostavno razmjestiti "handler" kao AWS Lambda. Evo kako se pozivate na njegove metode:

import {TestService} iz './TestService';
const client = čekajte createClient  ("LambdaName", "test");
console.log (čekajte client.test ());

Imajte na umu da kako biste mogli generirati metode za objekt klijenta, morate proći sve nazive metoda createClient, kao što smo to učinili u primjeru.

Ovo je potrebno jer JS nema nikakve podatke o izvođenju o TypeScript sučeljima. Mogla bih ga implementirati pomoću apstraktnih klasa, ali ne sviđa mi se ¯ \ _ (ツ) _ / ¯.

Bonus! Možete pokrenuti sve lokalno!

Smatram da je vrlo važno da vam lokalno razvojno okruženje bude što ugodnije. Zbog toga sam dodao i mogućnost lokalnog pokretanja usluge i klijenta bez ikakvog raspoređivanja na AWS (vidi funkcije runService and createClient). Primjere potražite u spremištu na GitHub-u.

Sažetak

To se vrlo lako može izgubiti u uslugama koje nude pružatelji usluga oblaka i prejako nadgraditi vašu infrastrukturu.

Uvijek biram najjednostavnije i najeksplicitnije rješenje koje mogu smisliti. Također, uvijek imajte na umu da se mnoge tehnike i postupci mogu ponovo upotrijebiti s drugih platformi (ideja masne NodeJS Lambda nadahnuta je takozvanim staklenkama za masnoće iz svijeta Java).

Ako vam se svidjela ova tema, pogledajte i ove:

  • Morate naučiti kako napraviti najbolju arhitekturu bez poslužitelja
  • Kako stvoriti besplatni CI / CD cjevovod bez poslužitelja: 3 jednostavna primjera
  • Kako jednostavno ponoviti DynamoDB u svim regijama
  • Kako napraviti višeregionalnu prijavu (i platiti nula)
  • Uključite bilo koji Java Web App Server bez servera

Komentari, lajkovi i dionice vrlo su cijenjeni. Živjeli!