Terraform repozitáre, ktoré spravujeme cez viacero klientov, vyzerajú dosť podobne. Žiadne dva nie sú identické — to by sme klamali — ale štyri pravidlá držíme prakticky bez výnimky od roku 2019. Hovoríme im „nudný Terraform”. Doslova. Keď nový inžinier pridá niečo elegantné, prvá otázka je, či to vieme spraviť trošku menej elegantne.
Toto je krátky zoznam toho, čo robíme — a jedna vec, ktorú sme rok skúšali a potom potichu zrušili.
Pravidlo 1: jeden stav na jedno prostredie
Žiaden zdieľaný state medzi staging a produkciou. Žiadne workspace triky. Každé prostredie má vlastný state file v S3 s DynamoDB lockom. Áno, znamená to pár stoviek riadkov duplikovaného kódu. Áno, predtým sme skúšali šikovnejšie veci. Áno, vždy nás v noci raz zobudili.
Cena je tá duplikácia. Benefit je, že žiadne ráno nezačalo vetou „prečo sa to apply-lo proti staging-u, keď som mal vybraný production workspace”.
Pravidlo 2: žiaden vlastný modul, kým si ho nepýta druhý projekt
Pokušenie napísať generický modul po prvom použití je obrovské. Najmä keď je problém na 80 % rovnaký. Tých zvyšných 20 % je miesto, kde žijú všetky bugy.
Pravidlo znie: dvakrát skopíruj, raz abstrahuj. Druhý projekt nám vždy ukáže rozdiely, ktoré sme po prvom nevideli. Tretí projekt môže byť modul. Ak sa nedostaneme k tretiemu projektu, modul nepotrebujeme.
Pravidlo 3: tajomstvá nikdy nežijú v Terraforme
Žiaden API key, žiadne DB heslo v `.tf` súbore — ani v `terraform.tfvars`. Tajomstvá vždy idú cez secret manager (AWS Secrets Manager, GCP Secret Manager, Vault) a Terraform iba číta ich ARN alebo path. Provisioning hesla pre databázu funguje tak, že Terraform vyrobí resource, vloží náhodné heslo do secret manageru a do databázy ho zapíše samostatný step.
Toto pravidlo nám raz zachránilo klienta pred reálnym leakom. Niekto omylom pushol `.tfvars` na verejný GitHub repozitár. V súbore nebolo nič citlivé — pretože nič citlivé sa do neho nikdy nedostalo.
Pravidlo 4: plan ide do PR
Žiaden apply bez code review. Pull request musí v popise obsahovať výstup `terraform plan` — automaticky cez GitHub Actions. Reviewer pozerá plan, nie diff súborov. Diff je len ako sa to píše. Plan je čo to skutočne urobí.
Veľa zlých zmien vyzerá v diffe nevinne. Plan ich okamžite ukáže: drop_resource, force_replace, premapovanie IAM rolí. Tých dvadsať sekúnd, kým CI generuje plan, je najlepšie investovaný čas v celom workflowe.
Experiment, ktorý sme zrušili
V roku 2022 sme rok experimentovali s Terragruntom. Idea bola pekná: DRY pre Terraform, zdieľané backendy, automatická generácia provider blokov, hierarchia prostredí.
Po roku sme to potichu odložili. Nie preto, že by Terragrunt bol zlý nástroj — nie je. Ale mali sme tím šiestich seniorných inžinierov a iba dvaja z nich Terragrunt skutočne ovládali. Keď bol jeden na dovolenke a druhý na inom projekte, ladenie bolelo. „Nudný Terraform” bol jediný spoločný jazyk, ktorý všetci ovládali.
Pravidlo, ktoré z toho vzniklo: nepridávame nástroj, ktorý kompletne neovláda aspoň polovica tímu. Veľmi konzervatívne pravidlo. Šetrí nervy presne v tých momentoch, keď ich potrebujeme najviac.
Elegantná infraštruktúra je elegantná dovtedy, kým ju nemusíš ladiť o tretej ráno. Potom je to len infraštruktúra, ktorú ladíš o tretej ráno.
Keď príde nový inžinier a chce pridať fancier helper alebo vlastný Terraform provider, nehovoríme nie automaticky. Hovoríme: prevezmeš to na on-call. Ak je odpoveď áno, väčšinou má dobrý dôvod. Ak je odpoveď „ehm”, vrátime sa k nudnému kódu.