Terraform vs Pulumi - które narzędzie IaC pasuje do Twojego zespołu w 2026?
Wybór narzędzia IaC to decyzja, z którą zespół żyje latami. Migracja między Terraform a Pulumi jest możliwa, ale kosztowna - wymaga przepisania setek lub tysięcy linii kodu infrastruktury. Dlatego warto podejść do tego wyboru strategicznie.
Jeśli nie znasz jeszcze koncepcji Infrastructure as Code, zacznij od naszego przeglądu narzędzi IaC, który obejmuje również CloudFormation, CDK i Terragrunt. Ten artykuł zakłada, że rozumiesz podstawy IaC i zastanawiasz się konkretnie: Terraform czy Pulumi?
Krótkie wprowadzenie
Terraform
Stworzony przez HashiCorp w 2014 roku. Używa własnego języka deklaratywnego - HashiCorp Configuration Language (HCL). Jest open-source (licencja BSL od 2023, fork OpenTofu pod MPL). Obsługuje ponad 3000 providerów (AWS, Azure, GCP, Cloudflare, Datadog, Kubernetes i wiele więcej).
Pulumi
Stworzony w 2017 roku. Pozwala definiować infrastrukturę w popularnych językach programowania: TypeScript/JavaScript, Python, Go, C#, Java. Jest open-source (Apache 2.0). Obsługuje te same providery co Terraform (używa tych samych pluginów pod spodem za pomocą bridge’a terraform-bridge).
Porównanie języków
To fundamentalna różnica między oboma narzędziami i główny czynnik decyzyjny.
| Aspekt | Terraform (HCL) | Pulumi (TypeScript/Python/Go/C#) |
|---|---|---|
| Typ języka | Deklaratywny, domenowy (DSL) | Imperatywny, ogólnego przeznaczenia |
| Krzywa uczenia się | Nowy język do nauki, ale prosty | Znany język, ale nowy kontekst |
| Pętle i warunki | count, for_each, dynamic blocks (ograniczone) | Natywne pętle, if/else, funkcje |
| Testowanie | Terratest (Go), terraform test (wbudowany) | Standardowe frameworki testowe (pytest, Jest, Go test) |
| IDE support | Dobry (VS Code extension, LSP) | Doskonały (pełny IntelliSense, autocomplete, typy) |
| Refaktoryzacja | Ograniczona (brak typów, brak interfejsów) | Pełna (klasy, interfejsy, dziedziczenie) |
| Czytelność | Wysoka dla prostych konfiguracji | Zależy od programisty (może być bardzo zwięzły lub bardzo złożony) |
Kiedy HCL wystarczy
HCL jest wystarczający dla większości typowych scenariuszy infrastrukturalnych: definiowanie VPC, instancji EC2, baz danych RDS, klastra EKS. Deklaratywność jest jego siłą - czytasz plik .tf i od razu widzisz, jaki jest pożądany stan infrastruktury.
resource "aws_instance" "api" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t3.medium"
subnet_id = aws_subnet.private.id
tags = {
Name = "api-server"
Environment = "production"
}
}
Kiedy potrzebujesz języka ogólnego
Pulumi jest mocniejszy, gdy infrastruktura wymaga złożonej logiki:
- Dynamiczne generowanie zasobów na podstawie konfiguracji (np. N środowisk z różną topologią)
- Integracja z zewnętrznymi API podczas wdrażania zasobów
- Współdzielenie kodu infrastrukturalnego z kodem aplikacji (monorepo)
- Skomplikowane transformacje danych (parsowanie JSON/YAML, walidacja schematów)
import * as aws from "@pulumi/aws";
const environments = ["dev", "staging", "production"];
const vpcs = environments.map(env => new aws.ec2.Vpc(`vpc-${env}`, {
cidrBlock: env === "production" ? "10.0.0.0/16" : "10.1.0.0/16",
tags: { Name: `vpc-${env}`, Environment: env },
}));
Zarządzanie stanem (state management)
Oba narzędzia śledzą stan infrastruktury w pliku stanu (state file). Różnice dotyczą sposobu przechowywania i zarządzania nim.
| Aspekt | Terraform | Pulumi |
|---|---|---|
| Domyślne przechowywanie | Lokalny plik (terraform.tfstate) | Pulumi Cloud (SaaS) lub self-hosted backend |
| Remote state | S3 + DynamoDB, Azure Blob, GCS, Terraform Cloud | Pulumi Cloud, S3, Azure Blob, GCS |
| Locking | Wbudowany (DynamoDB, Consul, itp.) | Wbudowany (Pulumi Cloud) lub zewnętrzny |
| Encryption at rest | Zależy od backendu (S3 SSE, itp.) | Wbudowany (secrets provider w state) |
| State operations | terraform state mv, rm, import, pull | pulumi state delete, unprotect, import |
| Drift detection | terraform plan (pokazuje drift) | pulumi preview (pokazuje drift) |
Ważna różnica: sekrety w state
Terraform przechowuje sekrety (hasła do baz danych, klucze API) w stanie jako plaintext. Zabezpieczenie wymaga szyfrowania backendu (np. S3 z SSE-KMS). Pulumi natywnie szyfruje sekrety w stanie - nawet jeśli ktoś uzyska dostęp do pliku stanu, sekrety są zaszyfrowane.
// Pulumi - secret jest automatycznie szyfrowany w state
const dbPassword = new pulumi.Config().requireSecret("dbPassword");
W Terraform musisz sam zadbać o to, by backend był zaszyfrowany, a dostęp do state file ograniczony przez IAM.
Więcej o zarządzaniu stanem w Terraform przeczytasz w naszym runbooku o Terraform state drift i bezpiecznym force-unlock.
Ekosystem i moduły
| Aspekt | Terraform | Pulumi |
|---|---|---|
| Rejestr modułów | Terraform Registry (3000+ providerów, 15000+ modułów) | Pulumi Registry (150+ natywnych pakietów + bridge z providerów TF) |
| Moduły community | Ogromna baza (10+ lat ekosystemu) | Mniejsza, ale rosnąca |
| Dystrybucja modułów | Terraform Registry, Git, S3 | npm, PyPI, Go modules, NuGet |
| Wersjonowanie | source + version constraints | Standardowe semver z package managera |
| Prywatne moduły | Terraform Cloud/Enterprise lub Git | Prywatny npm/PyPI registry |
Terraform ma wyraźną przewagę w ekosystemie. Przez 10+ lat istnienia zgromadził ogromną bazę gotowych modułów na każdy scenariusz. Pulumi nadrabia za pomocą terraform-bridge (automatyczny import providerów TF), ale moduły społeczności są mniej dojrzałe.
Dla większości zespołów to nie jest problem blokujący - oba narzędzia obsługują tych samych providerów chmurowych. Różnica polega na dostępności gotowych, przetestowanych rozwiązań na typowe wzorce.
CI/CD i integracja z pipeline’ami
Oba narzędzia integrują się z pipeline’ami CI/CD, ale w różny sposób:
Terraform:
# GitHub Actions
- name: Terraform Plan
run: terraform plan -out=tfplan
- name: Terraform Apply
run: terraform apply tfplan
if: github.ref == 'refs/heads/main'
Pulumi:
# GitHub Actions
- name: Pulumi Preview
uses: pulumi/actions@v5
with:
command: preview
- name: Pulumi Up
uses: pulumi/actions@v5
with:
command: up
if: github.ref == 'refs/heads/main'
Obie integracje są dojrzałe. Terraform ma więcej gotowych przykładów i dokumentacji CI/CD ze względu na dłuższe istnienie. Pulumi oferuje natywne GitHub Actions z lepszym podglądem zmian w PR (Pulumi Cloud generuje automatyczne komentarze z diffem infrastruktury).
Koszty
| Aspekt | Terraform | Pulumi |
|---|---|---|
| Open-source (samodzielne) | Darmowy (BSL lub OpenTofu MPL) | Darmowy (Apache 2.0) |
| Managed state + collaboration | Terraform Cloud: od $0 (do 500 zasobów) do $0.00014/h/zasób | Pulumi Cloud: od $0 (do 200 zasobów) do $0.0005/zasób/godzinę |
| Enterprise | Terraform Enterprise: custom pricing | Pulumi Business/Enterprise: od $399/mies. |
| Self-hosted state | S3 + DynamoDB: ~$1-5/mies. | S3 backend: ~$1-5/mies. |
W praktyce: jeśli używasz self-hosted state (S3 + DynamoDB dla Terraform, S3 dla Pulumi), oba narzędzia są praktycznie darmowe pod względem licencji. Koszty rosną, gdy potrzebujesz zarządzanych funkcji współpracy (zarządzanie zespołami, policy-as-code, logi audytu).
Kiedy wybrać Terraform
- Zespół nie ma silnego doświadczenia programistycznego - HCL jest prostszy do nauki niż TypeScript/Python w kontekście IaC
- Potrzebujesz maksymalnego ekosystemu modułów - szukasz gotowych rozwiązań na każdy scenariusz
- Organizacja już ma doświadczenie z Terraform - krzywa uczenia się wynosi zero
- Infrastruktura jest stosunkowo prosta (typowe zasoby chmurowe bez złożonej logiki)
- Chcesz korzystać z OpenTofu (fork open-source po zmianie licencji HashiCorp)
- Planujesz użyć Terraform Cloud/Enterprise do governance i compliance
Kiedy wybrać Pulumi
- Zespół składa się z doświadczonych programistów (TypeScript/Python), którzy nie chcą uczyć się nowego języka
- Infrastruktura wymaga złożonej logiki (dynamiczne generowanie środowisk, integracja z API)
- Chcesz współdzielić kod między infrastrukturą a aplikacją (monorepo, wspólne typy)
- Testowanie infrastruktury jest priorytetem - standardowe frameworki testowe są wygodniejsze niż Terratest
- Pracujesz w ekosystemie .NET lub Java (Terraform nie ma natywnego wsparcia dla tych języków)
- Zależy Ci na natywnym szyfrowaniu sekretów w state bez dodatkowej konfiguracji
Czy można łączyć oba narzędzia?
Tak. Częsty wzorzec:
- Terraform dla bazowej infrastruktury sieciowej (VPC, subnety, route tables) - rzadko się zmienia, prosta konfiguracja
- Pulumi dla warstwy aplikacyjnej (Kubernetes manifesty, Lambda functions, dynamiczne środowiska) - wymaga więcej logiki
Pulumi może czytać outputy Terraform state (StackReference do remote state). Nie jest to idealne rozwiązanie, ale działa w dużych organizacjach, gdzie różne zespoły preferują różne narzędzia.
Migracja między narzędziami
Z Terraform do Pulumi
Pulumi oferuje komendę pulumi convert --from terraform, która automatycznie konwertuje pliki HCL do wybranego języka. Konwersja nie jest idealna (wymaga ręcznego poprawienia w wielu miejscach), ale przyspiesza migrację o 60-70%.
Można też importować istniejący state: pulumi import pozwala przejąć zasoby z Terraform state bez ich odtwarzania.
Z Pulumi do Terraform
Trudniejsze - nie ma automatycznego konwertera. Wymaga ręcznego przepisania kodu do HCL. Dobra strategia: eksportuj state, użyj terraform import do przejęcia zasobów, pisz HCL od zera.
IaC wspomagane przez AI: które narzędzie lepiej współpracuje z agentami AI?
W 2026 roku agenci AI potrafią generować kod infrastruktury na poziomie produkcyjnym. Narzędzia takie jak GitHub Copilot, Amazon Q i autonomiczni agenci infrastruktury tworzą moduły Terraform i programy Pulumi na podstawie wymagań w języku naturalnym. Ale generowanie kodu to dopiero połowa historii. Trudniejsze pytania to: które narzędzie daje agentowi lepsze zabezpieczenia i które bezpieczniej zawiedzie, gdy agent popełni błąd?
Jakość generowania kodu
| Aspekt | Terraform (HCL) | Pulumi (TypeScript/Python/Go/C#) |
|---|---|---|
| Dostępne dane treningowe | Ogromne (10+ lat publicznych plików .tf na GitHub) | Mniejszy korpus IaC, ale ogromny korpus języków ogólnych |
| Niezawodność generowania | Wysoka - ograniczona składnia oznacza mniej ścieżek halucynacji | Wysoka - LLM-y doskonale radzą sobie z TypeScript/Python ogólnie |
| Walidacja przed apply | terraform validate + plan (łapie większość błędów) | Sprawdzanie typów w compile-time łapie błędy przed planem |
| Ryzyko halucynacji | Niższe (DSL ma ograniczoną powierzchnię) | Wyższe (język ogólny pozwala na bardziej kreatywne pomyłki) |
| Samokorekta | Agent czyta output planu i koryguje | Agent czyta błędy kompilatora i koryguje (szybsza pętla feedbacku) |
Przewaga Terraform przy generowaniu przez AI: HCL jest małym, przewidywalnym językiem. LLM generujący HCL ma mniej sposobów na popełnienie błędu niż generujący dowolny TypeScript. Deklaratywna natura oznacza, że output jest zawsze opisem pożądanego stanu, nigdy sekwencją imperatywną, która mogłaby mieć efekty uboczne. Dostępnych jest też znacznie więcej danych treningowych Terraform.
Przewaga Pulumi przy generowaniu przez AI: Systemy typów wyłapują błędy w compile-time. Gdy agent AI generuje program Pulumi w TypeScript, kompilator natychmiast flaguje nieprawidłowe nazwy właściwości, złe typy i brakujące wymagane pola. To daje agentowi szybszą pętlę feedbacku do samokorekty bez dotykania cloud API.
Bezpieczeństwo stanu i governance
Tu rozmowa o AI robi się poważna. Generowanie kodu jest proste. Bezpieczne wdrażanie jest trudne.
| Kwestia | Terraform | Pulumi |
|---|---|---|
| Walidacja przed apply | terraform plan generuje czytelny diff | pulumi preview generuje podobny diff |
| Policy-as-code | HashiCorp Sentinel, OPA/Rego, Checkov, tfsec | Pulumi CrossGuard (policy-as-code w tym samym języku), OPA |
| Analiza blast radius | Plan pokazuje liczbę zasobów; zewnętrzne narzędzia (Spacelift, env0) dodają scoring ryzyka | Preview pokazuje liczbę zasobów; Pulumi Deployments dodaje workflow review |
| State locking | DynamoDB lock (bezpieczeństwo single-writer) | Pulumi Cloud lock (wbudowany) |
| Drift detection | terraform plan wykrywa drift na żądanie | pulumi refresh wykrywa drift na żądanie |
| Rollback | Brak natywnego rollbacka (ponowne zastosowanie poprzedniego stanu) | Brak natywnego rollbacka (ponowne zastosowanie poprzedniego stanu) |
Żadne z narzędzi nie ma wbudowanego trybu “AI sandbox”. Jeśli agent ma credentiale i uruchomi terraform apply lub pulumi up, dotyka prawdziwej infrastruktury. Warstwa bezpieczeństwa musi być zewnętrzna: bramy CI/CD, sprawdzanie policy-as-code, workflow zatwierdzania lub dedykowany agent governance, który ewaluuje plan przed zastosowaniem.
Ryzyko driftu w setupach multi-agent
Gdy wielu agentów AI (lub agenci plus ludzie) operuje na tej samej infrastrukturze, drift staje się krytycznym trybem awarii:
- Agent A generuje i wdraża zmianę VPC
- Agent B czyta nieaktualny stan i planuje sprzeczną zmianę security group
- Człowiek robi ręczny fix w konsoli o 2 w nocy
- Teraz istnieją trzy prawdy: to co napisał Agent A, to przeciwko czemu planował Agent B, i to co faktycznie istnieje
Oba narzędzia radzą sobie z tym przez state locking (tylko jeden writer naraz), ale locking nie zapobiega logicznym konfliktom między osobno planowanymi zmianami. W setupach multi-agent potrzebujesz warstwy orkiestracji powyżej narzędzia IaC, która serializuje zmiany i waliduje intencję przed zastosowaniem.
Praktyczna rekomendacja
| Scenariusz | Lepszy wybór | Dlaczego |
|---|---|---|
| AI generuje IaC do human review | Terraform | HCL jest łatwiejszy do czytania i diffowania w PR. Reviewerzy widzą czysty pożądany stan. |
| AI generuje I wdraża autonomicznie | Pulumi | Type safety łapie błędy przed wywołaniami cloud API. Krok kompilacji działa jako pierwszy guardrail. |
| Wielu agentów dotyka tej samej infry | Oba + orkiestracja | Żadne narzędzie nie rozwiązuje koordynacji multi-agent natywnie. Potrzebujesz warstwy governance. |
| Regulowane środowiska (finanse, healthcare) | Terraform + Sentinel/OPA | Bardziej dojrzały ekosystem policy-as-code. Audytorzy znają Terraform. |
Luka governance
Oba narzędzia zakładają, że człowiek jest w pętli. Output plan/preview jest zaprojektowany do czytania i zatwierdzania przez człowieka. Gdy to agent AI czyta i zatwierdza, potrzebujesz:
- Scoring blast radius - kwantyfikacja ile zasobów i zależności dotyczy zmiana
- Wymuszanie polityk w momencie apply - nie w review PR kilka dni później
- Ciągłe wykrywanie driftu - nie tylko gdy ktoś ręcznie uruchomi plan
- Ślad audytu - który agent dokonał jakiej zmiany, z jakim promptem, o jakiej porze
To nie są funkcje Terraform ani Pulumi. To wyzwania platform engineering, które siedzą powyżej obu narzędzi. Narzędzie IaC jest warstwą wykonawczą. Warstwa governance jest tym, co czyni AI-driven infrastructure bezpieczną.
Macierz decyzyjna
| Scenariusz | Rekomendacja | Uzasadnienie |
|---|---|---|
| Startup, 2-3 inżynierów, szybki wzrost | Pulumi | Programiści już znają TypeScript/Python, szybszy start |
| Enterprise, 10+ zespołów, governance | Terraform | Większy ekosystem, łatwiej znaleźć ludzi, HashiCorp Sentinel/OPA |
| Istniejący Terraform, zespół zadowolony | Terraform | Nie naprawiaj czegoś, co działa |
| Monorepo (infra + app w jednym repo) | Pulumi | Współdzielone typy, jeden package manager |
| Multi-cloud, prosta infrastruktura | Terraform | Najlepsze wsparcie multi-provider |
| Platforma danych z dynamiczną logiką | Pulumi | Generowanie pipeline'ów na podstawie konfiguracji |
| Zespół DevOps/SRE (ops-first) | Terraform | HCL jest standardem w świecie ops |
| Zespół platform engineering (dev-first) | Pulumi | Programiści budują platformę w znanym języku |
| Agenci AI generują + wdrażają IaC | Pulumi | Type safety łapie błędy agenta w compile-time, przed apply |
| Agenci AI generują IaC do human review | Terraform | HCL jest łatwiejszy do czytania i zatwierdzania w diffie PR |
Podsumowanie
Terraform i Pulumi rozwiązują ten sam problem - automatyczne tworzenie infrastruktury na podstawie kodu. Różnią się podejściem do języka, co wpływa na cały workflow: pisanie, testowanie, refaktoryzację i onboarding nowych osób.
Terraform to bezpieczny wybór: ogromny ekosystem, łatwo znaleźć ludzi, prosta składnia dla typowych scenariuszy. W workflow wspomaganych przez AI jego ograniczona składnia zmniejsza ryzyko halucynacji, a output planu jest łatwy do review przez człowieka. Ograniczenia pojawiają się przy złożonej logice i gdy agenci potrzebują bezpieczeństwa compile-time.
Pulumi to wybór dla zespołów programistycznych: znany język, pełne wsparcie IDE, natywne testowanie. W workflow wspomaganych przez AI systemy typów wyłapują pomyłki agenta zanim cokolwiek dotknie chmury. Ograniczenia to mniejszy ekosystem i wyższy próg wejścia dla osób bez doświadczenia programistycznego.
W obu przypadkach, gdy agenci AI piszą i wdrażają Twój kod infrastruktury, samo narzędzie ma mniejsze znaczenie niż warstwa governance wokół niego. Policy-as-code, analiza blast radius i wykrywanie driftu to prawdziwe warstwy bezpieczeństwa i siedzą powyżej obu narzędzi.
Oba narzędzia są produkcyjnie sprawdzone i wspierane przez aktywne społeczności. Zły wybór nie istnieje - istnieje tylko lepsze dopasowanie do Twojego zespołu i poziomu automatyzacji AI.
Więcej o tym, jak Terraform wygląda w produkcyjnej architekturze, przeczytasz w naszym artykule o budowaniu skalowalnej architektury z AWS, Terraform i Kubernetes.
Potrzebujesz pomocy z IaC?
Projektujemy infrastrukturę jako kod z Terraform i Pulumi. Umów się na bezpłatną 30-minutową konsultację techniczną.
Najczęściej zadawane pytania
Czy Pulumi jest lepszy od Terraform?
Nie obiektywnie. Pulumi daje więcej mocy języka (pętle, typy, testy), ale Terraform ma większy ekosystem i prostszą składnię dla typowych zadań. Wybór zależy od umiejętności zespołu i złożoności infrastruktury.
Czy OpenTofu zastąpi Terraform?
OpenTofu to fork Terraform pod licencją MPL (open-source). Funkcjonalnie jest kompatybilny z Terraform 1.5.x. Dla zespołów, które nie chcą zależności od HashiCorp BSL, OpenTofu jest bezpośrednim zamiennikiem. Nie wpływa to na porównanie z Pulumi - różnice językowe pozostają takie same.
Czy mogę użyć Pulumi z istniejącym Terraform state?
Tak. Pulumi obsługuje import zasobów z Terraform state. Możesz stopniowo migrować zasób po zasobie bez przestoju. Komenda pulumi import przejmuje zasób do Pulumi state.
Które narzędzie jest szybsze?
Oba wykonują operacje cloud API z podobną prędkością (bo używają tych samych providerów). Różnice są minimalne i wynikają z implementacji CLI, a nie z samego tworzenia zasobów. Dla dużych stanów (1000+ zasobów) oba mogą być wolne - wtedy warto podzielić stan na mniejsze stacks/workspaces.
Czy Terraform jest wymagany do pracy w DevOps?
Jest najpopularniejszym narzędziem IaC i pojawia się w większości ofert pracy DevOps/SRE. Znajomość Terraform jest de facto standardem rynkowym. Pulumi jest akceptowany, ale rzadziej wymagany. Jeśli szukasz pracy - ucz się Terraform. Jeśli budujesz produkt - wybierz to, co pasuje do zespołu.
Które narzędzie jest lepsze dla infrastruktury generowanej przez AI?
To zależy od workflow. Jeśli AI generuje kod, który człowiek reviewuje i zatwierdza w PR, Terraform jest lepszy - HCL jest łatwy do czytania, a ograniczona składnia zmniejsza ryzyko halucynacji. Jeśli agent AI generuje i wdraża infrastrukturę autonomicznie, Pulumi ma przewagę - system typów łapie błędy w compile-time zanim cokolwiek dotknie chmury. W obu przypadkach potrzebujesz warstwy governance (policy-as-code, analiza blast radius) powyżej narzędzia IaC, aby zapewnić bezpieczeństwo.