Na obsah stránky

Pulumi a esbuild

| |

Poslední tři měsíce jsem z velké části, stejně jako minulý rok, pracoval na Hlídači Shopů. Hodně úsilí jsme věnoval splácení technického dluhu, abychom mohli Hlídače snáze a rychleji (tj. levněji) rozšiřovat. Vytvořil jsem integrační a deployment pipeline, včetně popisu většiny infrastruktury pomocí IaC nástroje Pulumi. Dalším cílem bylo sjednocení code base extenze a webu, aby se daly snadno sdílet části logiky.

V první fázi bylo důležité mít co nejrychleji zdokumentovanou infrastrukturu a být schopní ji automatizovaně rozvíjet. Proto jsem zvolil integrovaný přístup, kdy aplikační a infrastrukturní kód jsou jedna code base, a Pulumi, dík své chytristice, rozhodne, kde se kód řízne a co se nasadí. Takže to byl takový TypeScriptový (dále TS) monolit.

Už během migrace původních lambdiček do Pulumi jsem narážel na takové to svědění, způsobené typovým sebeklamem. Často jsem musel uspokojovat kompilátor, kvůli jeho neschopné typové inferenci, nebo vyloženému ničení explicitně deklarovaných typů. Děkuju pěkně, ale mám lepší představy, jak bych mohl trávit svůj čas. Když pominu, že mám během kompilace TS víc času na čtení twitteru, tak jeho jedinou přidanou hodnotou je popis schémat, na který je vyloženě špatným nástrojem…

AWS vydalo novou verzi JS SDK – verzi třetí. Ta si klade za cíl modularizovat všeobjímající God knihovnu aws-sdk, na sadu specializovaných balíčků, které reflektují stav moderního JavaScriptu, takže obsahují plnohodnotné ESM s moderní syntaxí, ne ty hybridní blbiny pro webpacky v ES5, s kterýma se nedá nic jiného dělat, než nad tou hromádkou neštěstí brečet. Ano, nové AWS SDK obsahuje i plnohodnotné (ehm) TS soubory, protože je v nich napsáno. V praxi se však ukázalo, že je to cesta do pekla…

AWS oznámilo podporu Docker images pro nasazování AWS Lambda funkcí. Chvíli jsem uvažoval, že využiju schopnosti Dockeru mít popis build i runtime kontejnerů v jednom souboru a že každá lambda si tak snadno připraví (pomocí tsc) svoje výstupy a ty se pak nasadí do runtime jako jeden bundle…

O tom, že esbuild je pekelně rychlý a jednoduchý nástroj na kompilaci moderního JavaScriptu (aka ECMAScript 2020), jsem psal minule. Mimochodem umí stejně rychle konzumovat JSX, TS a TSX. Navíc má pěkné API použitelné i z JavaScriptu!

Pulumi má virtualizované balíčkování kódu pro deployment AWS Lambda funkcí. Krom toho, že si můžete nechat transparentně serializovat část kódu v podobě funkce, můžete si také nechat zabalit třeba adresář s kódem, který chcete nasadit. Ale ten už musí být nějak předpřipravený. V rámci virtualizace, ale dojdete až na úroveň, kde do archívu můžete strkat jakýkoliv string, nebo jeho Promise. To je krása opravdových abstrakcí…

JS API esbuildu umí, když mu nastavíte write: false, vracet výsledek bundlování jako, ta-dá, Promise of string. Takže, když si spustíme build service – kvůli optimalizacím na sdílený kód – a při vytváření popisu infrastruktury si necháme také připravit bundle dané funkce, můžeme ho rovnou nasadit. No, a protože to je esbuild a ne kombinace tsc a pulumi, tak je to rychlý nejen v build time, ale i v runtime. A to už se vyplatí!

Více o dopadech na latence jsem sepsal do vlákna na Twitteru, kde najdete i patřičné grafy.

PS: Na zrychlení má podíl nejen menší bundle, ale i nové AWS SDK, které k tomu zmenšení také přispívá, ale asi dělá i něco míň špatně.

Našli jste v článku chybu? Máte námět na reportáž? Založte mi ticket.