NodeJS tətbiqetməsini serversiz etmək

Serversiz də mənim kimi sevdiyinizi ümid edirəm, çünki bu eyni mövzuda başqa bir yazıdır.

Sadə bir serversiz REST API'sə, AWS: Lambda + API Gateway-də quraşdırmanız olduqca aydındır.

Bəs arxanızdakı digər (mikro) xidmətlər necə olacaq? Bütün tətbiq kodlarınızı tək monolitik AWS Lambda funksiyasına bağlamaq ən yaxşı fikir deyil.

Çətinlik

Tətbiq modullarını sadəcə bir-biri ilə əlaqə qurmalı olan serversiz mikroservislər kimi təmin etmək istəyirik. Xidmətlər arasında əlaqə tercihen bir növ ACL ilə tənzimlənməlidir.

Cəhd 1. API Gateway

Problemi həll etməyə çalışarkən düşündüyüm ilk fikir budur: API Gateway vasitəsilə bütün mikroservisləri göstərməyiniz kifayətdir. Problem budur ... yaradılan API-lər hər kəsə açıqdır.

Niyə problem var? Məsələn, giriş icazəsi ilə məhdudlaşdırılsa da, bir faturalandırma xidmətinin dünyanın hər hansı bir yerində olmasını istəmirik.

Yaxşı, API-ni özəl edə bilərsiniz, amma təhlükəsizlik qaydaları olduqca məhduddur:

API'nizin etibarlı bir şəkildə çağırılmasına icazə vermək üçün API Gateway Resurs Policies istifadə edə bilərsiniz:
* Müəyyən bir AWS hesabının istifadəçisi * Göstərilən mənbə IP ünvanı aralıkları və ya CIDR blokları * Müəyyən edilmiş xüsusi xüsusi buludlar (VPC) və ya VPC uç nöqtələri (istənilən hesabda)

Bu, bu cür xidmətlər arasındakı rabitəni idarə etməyi olduqca çətinləşdirir. Bunu etmənin yeganə yolu xidmətləri ayrı-ayrı VPC-lərə yerləşdirməkdir, bu da çox işdir.

Təcrübə 2. Lambda

Niyə hər bir mikroservisi ayrı bir AWS Lambda-ya qoymuruq? Bu problemi həll edəcəkmi?

Bəli, həqiqətən serversiz bir mikroservisdir və xidmətlərarası girişi optimallaşdırmaq üçün IAM siyasətlərindən istifadə edə bilərsiniz. Lakin, bu "asan" deyil.

Bu günlərdə bir çatdırılma vahidi kimi kiçik bir rol oynamağın normal olduğunu bilirəm. Xidmətinizin birdən çox son nöqtəsi / metodu / funksiyası olması halında, birdən çox lambda kimi təqdim etmək yaxşıdır.

Faydalarını başa düşürəm, ancaq baxım və inkişaf asanlığını qurban verirsiniz. Həm də bir xidmətin Lambda funksiyaları dəsti olaraq ifşa edilməsi fikrini çox sevmirəm. Faturalandırma ilə məşğul olan bir neçə ayrı funksiyanı təsəvvür edin? Artıq məhdud bir kontekst deyil. Belə bir dənəcikliyin faydalı ola biləcəyi hallar olsa da, nadir bir haldır.

3. Şişman Lambda cəhd edin

Həqiqətən bir Lambda olaraq bir sıra son nöqtələr təmin edə bilərikmi (əlbəttə ki, API şlüzəsi olmadan)?

Bunu edə bilsəydik, əvvəlki seçimin bütün üstünlüklərindən istifadə edərdik, ancaq yerləşdirmə vahidlərimizin dənəcikliyini də seçə bilərik.

İstədiyim budur: tətbiq edə biləcəyiniz hər hansı bir xidmət üsulları olan sadə, köhnə bir JS obyekti olmalıdır. Nesnənizlə AWS Lambda arasında bir neçə sətir yapışqan kodu əlavə edərək bunu etmək olduqca asandır.

Budur mənim tətbiqim: aws-rpc. Bu nodejs modulu, yalnız bir obyekt ötürdüyünüz lambdaHandler funksiyasını ifşa edir və avtomatik olaraq lambda əldə edə bilən bütün istifadəçilər üçün təqdim olunur:

{lambdaHandler} 'aws-rpc' dən idxal etmək; {TestServiceImpl} './TestServiceImpl' dən idxal edin;
// bu sizin quruluş vahidinizdir // lambda işləyicisi funksiyası ixrac const işləyicisi = lambdaHandler (yeni TestServiceImpl ()) olaraq təyin etdiyiniz budur;

İndi sadəcə "işləyicini" AWS Lambda kimi təqdim edə bilərsiniz. Metodlara necə zəng etmək olar:

'./TestService' -dən {TestService} idxal edin;
const client = createClient üçün gözləyin ("LambdaName", "test"); console.log (client.test () gözləyin);

Xahiş edirik unutmayın ki, müştəri stub obyekti üçün metodlar yarada bilmək üçün, nümunədəki kimi createClient üçün bütün metod adlarını keçməlisiniz.

Bu, JS-də TypeScript interfeysləri ilə bağlı iş vaxtı məlumatı olmadığı üçün lazımdır. Bunu mücərrəd dərslərlə həyata keçirə bilərdim, amma ¯ \ _ (ツ) _ / ¯-dən xoşum gəlmir.

Bonus! Hamısını yerli olaraq edə bilərsiniz!

Yerli inkişaf mühitinizin mümkün qədər rahat olmasının çox vacib olduğunu düşünürəm. Bu səbəbdən, AWS üçün bir şey təmin etmədən xidməti və müştərini yerli olaraq idarə etmək imkanı da əlavə etdim (bax runService və createClient funksiyaları). Nümunələri GitHub deposunda tapa bilərsiniz.

Xülasə

Bulud provayderlərinin təqdim etdiyi xidmətlərdə itirdiyiniz və infrastrukturunuzu yenidən qurduğunuz zaman bunu etmək çox asandır.

Həmişə düşünə biləcəyim ən sadə və açıq həlli seçirəm. Ayrıca, bir çox texnika və təcrübənin digər platformalardan yenidən istifadə edilə biləcəyini daima unutmayın (cəsarətli NodeJS Lambda fikri, Java dünyasının qalın eynəklərindən ilham alır).

Bu mövzunu bəyəndinizsə, aşağıdakıları da oxuyun:

  • Ən yaxşı serversiz memarlıq qurmağı öyrənməlisiniz
  • Pulsuz bir serversiz CI / CD boru kəməri necə qurulur: 3 sadə nümunə
  • Bölgələrdə DinamoDB-nin asanlıqla təkrarlanması
  • Çox bölgəli bir tətbiqetmə necə qurulur (və sıfır ödə)
  • Java Veb Tətbiqini Serversiz edin

Şərhlər, bəyənmələr və paylaşımlar çox qiymətləndirilir. Aşağıdan yuxarıya, altüst olmaq!