Як зрабіць прыкладанне NodeJS без сервера

Спадзяюся, вы любіце Serverless гэтак жа, як і я, бо гэта чарговы пост па тэме.

Калі гэта просты серверны REST API, ваша налада ў AWS: Lambda + API Gateway даволі відавочная.

Але як наконт іншых (мікра) паслуг, якія можа мець ваш бэкэнд? Ведаеце, размяшчэнне ўсяго кода прыкладання ў адзінай маналітнай функцыі лямбда-рэкламы AWS - не лепшая ідэя.

Выклік

Мы хочам прадаставіць модулі прыкладанняў проста як бязсерверныя мікрасэрвісы, якія таксама павінны мець зносіны паміж сабой. Сувязь паміж службамі павінна рэгулявацца тыпам ACL.

Спроба 1. Шлюз API

Гэта першая думка, якая ўзнікла ў мяне пры спробе вырашыць праблему: проста выстаўце ўсе мікрасэрвісы праз API-шлюз. Праблема ў тым, што API, якія ствараюцца, з'яўляюцца агульнадаступнымі.

Чаму гэта праблема? Напрыклад, мы не хочам, каб плацежная служба была даступная па ўсім свеце, нават калі доступ абмежаваны аўтарызацыяй.

Ну, вы можаце зрабіць API прыватным, але рэкамендацыі па бяспецы даволі абмежаваныя:

Вы можаце выкарыстоўваць палітыку рэсурсаў API шлюза, каб дазволіць бяспечна выклікаць ваш API:
* Карыстальнік пэўнага ўліковага запісу AWS * Указаныя дыяпазоны IP-адрасоў крыніцы альбо блокі CIDR * Пазначаныя віртуальныя прыватныя воблакі (VPC) або канчатковыя кропкі VPC (у любым уліковым запісе)

Гэта даволі абцяжарвае кіраванне сувяззю паміж такімі службамі. Адзіны спосаб зрабіць гэта тут - размясціць службы ў асобных VPC, што занадта шмат працы.

Эксперымент 2. Лямбда

Чаму б нам проста не змясціць кожную мікраслужбу ў асобную лямбду AWS? Ці вырашыць гэта праблему?

Так, гэта сапраўды бяссерверная мікраслужба, і вы можаце выкарыстоўваць палітыкі IAM для аптымізацыі міжслужбовага доступу. Аднак гэта не "проста".

Я ведаю, што ў наш час цалкам нармальна выконваць ролю пастаўшчыка. У выпадку, калі ваша служба мае больш за адну канчатковую кропку / метад / функцыю, добра прадаставіць яе ў выглядзе некалькіх лямбд.

Я разумею перавагі, але вы ахвяруеце прастатой абслугоўвання і распрацоўкі. Акрамя таго, мне не вельмі падабаецца ідэя выстаўляць службу як набор лямбда-функцый. Уявіце сабе некалькі асобных функцый, якія займаюцца білінгам? Гэта ўжо не абмежаваны кантэкст. Хоць бываюць выпадкі, калі такая дэталізацыя можа быць карыснай, гэта рэдкі выпадак.

Паспрабуйце 3. Тлушч Лямбда

Ці можам мы на самой справе прадставіць шэраг канчатковых кропак у выглядзе адной лямбды (вядома, без шлюза API)?

Калі б мы змаглі зрабіць гэта, мы б у поўнай меры скарысталіся папярэднім варыянтам, але мы маглі б таксама абраць дэталізацыю нашых блокаў разгортвання.

Вось што я хачу: любая служба, якую можна разгарнуць, павінна быць простым, старамодным аб'ектам JS з метадамі. Зрабіць гэта даволі проста, дадаўшы некалькі радкоў клею паміж аб'ектам і лямбдай AWS.

Вось мая рэалізацыя гэтага: aws-rpc. Гэты модуль nodejs выкрывае функцыю lambdaHandler, дзе вы перадаяце толькі адзін аб'ект, і яна аўтаматычна становіцца даступнай для ўсіх карыстальнікаў, якія могуць атрымаць доступ да лямбда:

імпартаваць {lambdaHandler} з 'aws-rpc'; Імпартаваць {TestServiceImpl} з './TestServiceImpl';
// гэта ваша пастановачная адзінка // гэта вы ўказваеце як функцыю лямбда-апрацоўшчыка export const handler = lambdaHandler (new TestServiceImpl ());

Цяпер вы можаце проста даць "апрацоўшчык" як AWS Lambda. Як выклікаць метады:

Імпартаваць {TestService} з './TestService';
const client = чакаць createClient ("LambdaName", "test"); console.log (чакаць client.test ());

Звярніце ўвагу, што для таго, каб мець магчымасць генераваць метады для кліенцкага аб'екта заглушкі, вы павінны перадаць усе імёны метадаў createClient, як у прыкладзе.

Гэта неабходна, паколькі JS не мае інфармацыі пра час выканання інтэрфейсаў TypeScript. Я мог бы рэалізаваць гэта з абстрактнымі класамі, але мне не падабаецца ¯ \ _ (ツ) _ / ¯.

Бонус! Вы можаце зрабіць усё гэта лакальна!

Я думаю, што вельмі важна, каб ваша мясцовае развіццё было максімальна камфортным. Па гэтай прычыне я таксама дадаў магчымасць запуску службы і кліента лакальна без неабходнасці прадастаўляць што-небудзь для AWS (гл. Функцыі runService і createClient). Вы можаце знайсці прыклады ў сховішчы GitHub.

Рэзюмэ

Зрабіць гэта вельмі проста, калі вы згубіцеся ў паслугах, якія прапануюць хмарныя правайдэры, і капітальна адрамантуюць інфраструктуру.

Я заўсёды выбіраю самае простае і відавочнае рашэнне, якое мне падаецца. Акрамя таго, заўсёды майце на ўвазе, што многія метады і практыкі могуць быць выкарыстаны паўторна з іншых платформаў (ідэя смелага NodeJS Lambda натхнёная так званымі смелымі акулярамі з свету Java).

Калі вам спадабалася гэтая тэма, прачытайце таксама наступнае:

  • Вам трэба даведацца, як стварыць лепшую безсерверную архітэктуру
  • Як стварыць бясплатны трубаправод CI / CD без сервера: 3 простыя прыклады
  • Прастата тыражавання DynamoDB па рэгіёнах
  • Як стварыць мультырэгіянальнае дадатак (і плаціць нуль)
  • Зрабіце Java Web App бяссерверным

Каментарыі, лайкі і долі вельмі шануюцца. Дагары нагамі!