Kuinka tehdä NodeJS App palvelimettomaksi

Toivon, että rakastat Serverlessiä yhtä paljon kuin minä, koska tämä on jälleen yksi viesti aiheesta.

Jos puhumme nyt yksinkertaisesta palvelimettomasta REST-sovellusliittymästä, asennuksesi on melko ilmeinen AWS: Lambda + API -yhdyskäytävällä.

Mutta entä muut (mikro) palvelut, joita taustallasi voi olla? Tiedätkö, ei ole paras idea laittaa kaikki sovelluskoodisi yhteen monoliittiseen AWS Lambda -toimintoon.

Haaste

Haluamme ottaa sovellusmoduulit helposti käyttöön palvelimettomina mikropalveluina, joiden on myös kommunikoitava keskenään. Edullisesti palveluiden välistä viestintää tulisi säädellä jonkinlaisella ACL: llä.

Yritys 1. API-yhdyskäytävä

Tämä on ensimmäinen ajatus, joka minulla oli yrittäessään ratkaisemaan ongelmaa: paljasta vain kaikki mikropalvelut API-yhdyskäytävän kautta. Ongelma on ... Luotut sovellusliittymät ovat julkisia.

Miksi tämä on ongelma? Emme esimerkiksi halua, että laskutuspalvelu paljastuu koko maailmalle, vaikka käyttöoikeutta rajoitettaisiin jonkinlaisella valtuutuksella.

Voit tehdä sovellusliittymästä yksityisen, mutta suojauskäytännöt ovat melko rajalliset:

Voit käyttää API Gateway -resurssikäytäntöjä antaaksesi sovellusliittymällesi turvallisen mahdollisuuden kutsua:
* tietyn AWS-tilin käyttäjät
* määritetyt lähteen IP-osoitealueet tai CIDR-lohkot
* määritetyt virtuaaliset yksityiset pilvet (VPC) tai VPC päätepisteet (missä tahansa tilissä)

Tämä tekee varsin hankalaksi hallita tällaisten palvelujen välistä viestintää. Ainoa tapa tehdä se täällä on sijoittamalla palvelut erillisiin VPC: iin, liian paljon työtä.

Yritys 2. Lambda

Miksi emme vain laita jokaista mikropalvelua erilliseen AWS-lambdaan? Ratkaiseeko tämä ongelman?

Kyllä, itse asiassa se on palvelimeton mikropalvelu, ja pystyt käyttämään IAM-käytäntöjä palveluiden välisten yhteyksien virittämiseen, mutta… Se ei ole ”helppoa”.

Tiedän, että tämä on nykyään melko normaalia, jos sillä on pieni tehtävä käyttöönottoyksikkönä. Ja siinä tapauksessa, että palvelussasi on enemmän kuin yksi päätepiste / menetelmä / toiminto, katsotaan, että se voidaan asentaa useaksi lambdaksi.

Ymmärrän sen edut, mutta uhraat helpon ylläpidon ja kehityksen. En todellakaan pidä ajatuksesta palvelun käyttöönotosta Lambda-toimintoina. Kuvitteletko useita erillisiä laskutukseen liittyviä toimintoja? Se ei ole enää rajoitettu konteksti. Vaikka joissakin tapauksissa tällainen rakeisuus voi olla hyödyllinen, se on kuitenkin harvinainen tapaus.

Yritä 3. Rasva Lambda

Voimmeko todella ottaa käyttöön joukon päätepisteitä yhtenä lambdana (tietysti käyttämättä API-yhdyskäytävää)?

Jos voisimme tehdä tämän, saisimme kaikki edellisen vaihtoehdon edut, mutta voisimme myös valita käyttöönottoyksikköjemme rakeisuuden.

Haluan sen seuraavan: Jokaisen asennettavan palvelun tulisi olla yksinkertainen vanha JS-objekti menetelmillä. Tämä on melko triviaalia saavuttaa lisäämällä muutama rivi liimauskoodia esineesi ja AWS Lambdan väliin.

Tässä on minun toteutus siihen: aws-rpc. Tämä nodejs-moduuli paljastaa lambdaHandler-toiminnon, jossa ohitat vain objektin, ja se altistetaan automaattisesti kaikille, jotka pääsevät Lambdaan:

tuo {lambdaHandler} tiedostosta 'aws-rpc';
tuo {TestServiceImpl} tiedostosta './TestServiceImpl';
// tämä on käyttöönottoyksikkösi
// tämä on mitä määrittelet Lambdan hoitajatoimintoksi
vienti const handler = lambdaHandler (uusi TestServiceImpl ());

Nyt voit asentaa vain “käsittelijän” AWS Lambda -sovellukseksi. Näin käytät sen menetelmiä:

tuo {TestService} tiedostosta './TestService';
const client = odota createClient  ("LambdaName", "test");
console.log (odota client.test ());

Huomaa, että voidaksesi luoda menetelmiä asiakaskohtaiselle objektille, sinun on läpäistävä kaikki menetelmänimet luoda createClient, kuten teimme esimerkissä.

Tämä vaaditaan, koska JS: llä ei ole ajonaikaista tietoa TypeScriptin rajapinnoista. Pystyin toteuttamaan sen käyttämällä abstrakteja luokkia, mutta en pidä siitä ¯ \ _ (ツ) _ / ¯.

Bonus! Voit ajaa kaiken paikallisesti!

Uskon, että on erittäin tärkeää, että paikallisella kehitysympäristölläsi on mahdollisimman mukava. Tästä syystä olen lisännyt myös mahdollisuuden palvelun ja asiakkaan suorittamiseen paikallisesti asentamatta mitään AWS: ään (katso toiminnot runService ja createClient). Katso esimerkkejä GitHub-arkistosta.

Yhteenveto

Tämä on erittäin helppo eksyä pilvipalvelujen tarjoajien palveluissa ja parantaa infrastruktuuriasi.

Valitsen aina yksinkertaisimman ja selkeimmän ratkaisun, jota voin ajatella. Muista myös, että monia tekniikoita ja käytäntöjä voidaan käyttää uudelleen muilta alustoilta (rasva NodeJS Lambdan idea on inspiroitunut Java-maailman ns. Rasvapurkeista).

Jos pidit tästä aiheesta, tutustu myös näihin:

  • Sinun on opittava tekemään paras palvelimeton arkkitehtuuri
  • Kuinka luoda ilmainen palvelimeton CI / CD-putkisto: 3 helppoa esimerkkiä
  • Kuinka helposti jäljitellä DynamoDB-aluetta eri alueilla
  • Kuinka luoda monikansallinen sovellus (ja maksaa nolla)
  • Tee kaikista Java Web App -palvelimista

Kommentit, tykkäykset ja osakkeet ovat erittäin arvostettuja. Kippis!