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 wkrótce w naszym dedykowanym artykule o zarządzaniu stanem Terraform - remote state, locking i drift.
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.
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 |
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. Ograniczenia pojawiają się przy złożonej logice.
Pulumi to wybór dla zespołów programistycznych: znany język, pełne wsparcie IDE, natywne testowanie. Ograniczenia to mniejszy ekosystem i wyższy próg wejścia dla osób bez doświadczenia programistycznego.
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.
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.