Minulú jeseň sme spustili experiment, ktorý sme dlho odkladali: jeden nový klientsky projekt sme celý postavili na Pulumi s TypeScriptom, zatiaľ čo zvyšok našej infraštruktúry ostal na Terraforme. Nie víkendové demo — produkčný projekt s AWS účtom, CI/CD a on-call službou, šesť mesiacov. Úprimne sme čakali, že po ňom začneme sťahovať na Pulumi všetko. Nezačali sme. Toto je zápis o tom, prečo.
Píšeme to z pozície firmy, ktorá stavia a spravuje cloudovú infraštruktúru pre klientov — teda z tej istej praxe, z ktorej vznikol starší text o zámerne nudnom Terraforme. Tento naň nadväzuje: vtedy sme obhajovali nudu vo vnútri jedného nástroja, teraz sme si ňou vybrali medzi dvoma.
Čo robí Pulumi naozaj lepšie
Začnime poctivo, lebo internetové porovnania toto často zamlčia: Pulumi má tri veci, ktoré nám reálne chýbajú dodnes. Po prvé, skutočný jazyk. Cyklus, podmienka a zdieľaná funkcia v TypeScripte sú prosto lepšie než HCL akrobacia s count, for_each a dynamic blokmi — kus infraštruktúry, ktorý mal v Terraforme osemdesiat riadkov trikov, mal v Pulumi dvadsať riadkov čitateľného kódu. Po druhé, secrets v state súbore sú šifrované automaticky, nie ako dodatočná disciplína. Po tretie, unit testy nad infraštruktúrou: na projekte sme mali test, že žiadny S3 bucket nemôže vzniknúť verejný — spúšťal sa v CI za sekundy, bez cloudu.
Kde nás to začalo bolieť
Prvý problém je paradoxne ten istý skutočný jazyk. Traja seniorní ľudia písali tri štýly infraštruktúry: jeden triedy a factory funkcie, druhý čisté funkcie s config objektmi, tretí jednoducho dlhý skript. Všetko legitímny TypeScript, všetko prešlo review — ale po pol roku vyzeral infra repozitár ako tri projekty zošité dokopy. HCL tento problém nemá, lebo v ňom tri štýly napísať nejdú. Druhý problém: infra repo zdedilo celý npm ekosystém — dependabot, lockfile konflikty, minor verzie SDK každé dva týždne. Infraštruktúrny kód, ktorý sa nemení, zrazu vyžadoval údržbu len preto, aby stál na mieste.
A tretia vec, ktorú si uvedomíte až v praxi: veľká časť Pulumi providerov je bridge nad Terraform providermi. Keď sme narazili na bug v správaní ALB listenera, issue aj fix žili v Terraform provideri a dokumentácia, ktorá nás zachránila, bola Terraformová. Platili sme daň za abstrakciu nad nástrojom, ktorý sme už vedeli používať priamo.
Rozhodujúci faktor: odovzdanie
Nič z toho by samo nerozhodlo. Rozhodlo to, čo je pre nás na konci každého projektu: odovzdanie. Infraštruktúru, ktorú postavíme, preberá skôr či neskôr niekto na strane klienta — interný admin, budúci dodávateľ, niekedy jeden človek na čiastočný úväzok. Terraform s plochým HCL prečíta ktokoľvek z nich po jednom víkende. Pulumi projekt v TypeScripte s abstrakciami od troch autorov vyžaduje TypeScript vývojára, ktorý zároveň rozumie infraštruktúre — a presne tento človek u našich klientov spravidla nesedí. Obmedzenosť HCL, na ktorú sme roky nadávali, sa pri odovzdávaní ukázala ako jeho najcennejšia vlastnosť: je to strop na šikovnosť.
Obmedzenosť HCL nie je nedostatok. Je to strop na šikovnosť — a infraštruktúra je presne to miesto, kde strop na šikovnosť chcete.
Kedy by sme Pulumi predsa odporučili
Aby to nevyznelo ako odsudok: ten pilotný projekt sme na Pulumi nechali a beží spokojne dodnes. Pulumi by sme zvolili znova v troch situáciách. Keď infraštruktúru dlhodobo vlastní produktový tím, ktorý žije v TypeScripte a nikdy ju nebude odovzdávať. Keď je infraštruktúra skutočne dynamická — napríklad provisioning izolovaného prostredia pre každého tenanta, kde sa HCL naozaj láme. A keď tím chce infra testovať rovnakými nástrojmi ako aplikáciu. Nič z toho nie je typický profil našich zákaziek — preto default ostáva Terraform.
Ak práve riešite, na čom postaviť infraštruktúru — alebo máte Terraform, ktorý sa za roky rozrástol do stavu, keď sa ho každý bojí dotknúť — ozvite sa. Toto rozhodnutie je lacné na začiatku a drahé o tri roky, a my sme si oba konce toho účtu už zaplatili.