Jak vytvořit libovolnou aplikaci NodeJS bez serverů

Doufám, že máte rádi Serverless stejně jako já, protože toto je další příspěvek na toto téma.

Nyní, když mluvíme o jednoduchém REST API bez serveru, vaše nastavení je zcela zřejmé na AWS: Lambda + API Gateway.

Ale co další (mikro) služby, které váš backend může mít? Víte, není to nejlepší nápad, dát celý kód aplikace do jediné monolitické funkce AWS Lambda.

Výzva

Chceme snadno nasadit aplikační moduly jako mikroservisy bez serverů, které také musí vzájemně komunikovat. Přednostně by komunikace mezi službami měla být regulována nějakým druhem ACL.

Pokus 1. Gateway API

Toto je první myšlenka, kterou jsem měl, když jsem se snažil problém vyřešit: jen odhalte všechny mikroskopické služby prostřednictvím API Gateway. Problém je… Vytvořená rozhraní API jsou veřejná.

Proč je to problém? Například nechceme, aby byla fakturační služba vystavena celému světu, i když je přístup omezen pomocí nějakého oprávnění.

Rozhraní API můžete nastavit jako soukromé, ale zásady zabezpečení jsou dosti omezené:

Pomocí zásad prostředků brány API můžete bezpečně vyvolat vaše API:
* uživatelé z určeného účtu AWS
* zadané rozsahy zdrojových IP adres nebo bloky CIDR
* zadané virtuální privátní cloud (VPC) nebo koncové body VPC (v libovolném účtu)

Proto je docela obtížné řídit komunikaci mezi těmito službami. Jediným způsobem, jak toho dosáhnout, je vložení služeb do samostatných VPC, příliš mnoho práce.

Pokus 2. Lambda

Proč jsme do mikroservisu nezařadili samostatnou AWS Lambdu? Vyřeší to problém?

Ano, ve skutečnosti to bude mikroservis bez serverů a vy budete moci použít politiky IAM k vyladění přístupů mezi službami, ale ... Není to „snadné“.

Vím, že v dnešní době je zcela normální, že jako jednotka rozmístění máte malou funkci. A v případě, že vaše služba obsahuje více než 1 koncový bod / metodu / funkci, považuje se za vhodné nasadit ji jako více Lambdas.

Chápu jeho výhody, ale obětujete snadnost údržby a vývoje. Také se mi opravdu nelíbí myšlenka nasazení služby jako sady funkcí Lambda. Představte si několik samostatných funkcí, které se zabývají fakturací? Už to není omezený kontext. I když existují případy, kdy může být taková granularita užitečná, ale je to vzácný případ.

Pokus 3. Fat Lambda

Můžeme skutečně nasadit sadu koncových bodů jako jednu Lambdu (samozřejmě bez použití API Gateway)?

Pokud bychom to dokázali, získali bychom všechny výhody předchozí možnosti, ale mohli bychom si také vybrat granularitu našich nasazovacích jednotek.

Způsob, jakým to chci, je následující: každá implementovatelná služba by měla být jednoduchý obyčejný starý objekt JS s metodami. To je docela triviální dosáhnout přidáním několika řádků lepidla kód mezi váš objekt a AWS Lambda.

Tady je moje implementace: aws-rpc. Tento modul nodejs odhaluje funkci lambdaHandler, kde právě předáváte objekt, a je automaticky vystaven každému, kdo má přístup k Lambda:

importovat {lambdaHandler} z 'aws-rpc';
importovat {TestServiceImpl} z './TestServiceImpl';
// toto je vaše jednotka nasazení
// to je to, co určíte jako funkci obsluhy Lambdy
export const handler = lambdaHandler (nový TestServiceImpl ());

Nyní můžete nasadit „handler“ jako AWS Lambda. Takto vyvoláte její metody:

importovat {TestService} z './TestService';
const client = await createClient  ("LambdaName", "test");
console.log (čeká client.test ());

Vezměte prosím na vědomí, že abyste mohli generovat metody pro klientský objekt se zakázaným inzerováním, musíte předat všechny názvy metod pro createClient, jak jsme to udělali v příkladu.

To je nutné, protože JS nemá žádné runtime informace o rozhraních TypeScript. Mohl bych to implementovat pomocí abstraktních tříd, ale nelíbí se mi to ¯ \ _ (ツ) _ / ¯.

Bonus! Můžete to všechno spustit lokálně!

Věřím, že je velmi důležité mít prostředí místního rozvoje co nejpohodlnější. Proto jsem také přidal možnost spustit službu a klienta lokálně, aniž bych cokoli nasazoval na AWS (viz funkce runService a createClient). Příklady najdete v úložišti na GitHubu.

souhrn

Je velmi snadné se ztratit ve službách, které nabízejí poskytovatelé cloudu, a přepracovat vaši infrastrukturu.

Vždy volím nejjednodušší a nejjednodušší řešení, na které si vzpomenu. Také si vždy pamatujte, že mnoho technik a postupů lze znovu použít z jiných platforem (myšlenka tlustého NodeJS Lambda je inspirována tzv. Tlustými nádobami ze světa Java).

Pokud se vám toto téma líbilo, podívejte se také na tyto:

  • Musíte se naučit, jak vytvořit nejlepší serverless architekturu
  • Jak vytvořit zdarma serverless CI / CD pipeline: 3 snadné příklady
  • Jak snadno replikovat DynamoDB napříč regiony
  • Jak si vyrobit multiregionální aplikaci (a platit nula)
  • Vytvořte libovolnou Java Web App bez serveru

Komentáře, hodnocení a sdílené položky jsou vysoce hodnoceny. Na zdraví!