Terraform vs Pulumi vs OpenTofu: ostateczne porównanie 2026
Kompleksowe i bezstronne porównanie trzech najlepszych narzędzi IaC w 2026 r.: Terraform (HCL, 32,8% udziału w rynku), Pulumi (TypeScript/Python/Go) i OpenTofu (widelec open source). Kiedy wybrać który.
Panorama IaC w 2026 r
W 2023 roku HashiCorp zmienił licencję Terraform z MPL 2.0 (open-source) na Licencja Business Source (BSL 1.1), która wywołała jedną z najbardziej gorących debat na świecie DevOps. BSL nie jest oprogramowaniem typu open source zgodnie z definicją OSI: wykorzystanie komercyjne jest zabronione przez bezpośrednich konkurentów HashiCorp. Odpowiedź społeczności była taka natychmiastowe: rozwidlenie open source OtwórzTofu, a następnie przekazany Fundacji Linux.
W 2026 r. rynek ustabilizował się na trzech wyraźnych pozycjach: Terraform utrzymuje 32,8% udziału w rynku wśród narzędzi IaC dzięki ogromnej bazie zainstalowanych rozwiązań oraz ekosystem dostawców i modułów; OpenTofu podbiło ~8% głównie w środowiskach wymagających certyfikowanych licencji open source; Pulumi i dorastał w ~15% skupiając się na doświadczeniu programistów i testach natywnych. CloudFormation, CDK, Bicep i Ansible uzupełniają panoramę.
Czego się nauczysz
- Historia i konsekwencje zmiany licencji HashiCorp BSL
- OpenTofu: Zgodność z Terraformem, aktualny stan i plan działania
- Pulumi: paradygmat „infrastruktura jako prawdziwy kod”, zalety i wady
- Tabela porównawcza techniczna: funkcje, licencje, ekosystem, testowanie
- Matryca decyzyjna: kiedy wybrać każde narzędzie
- Migracja z Terraform do OpenTofu: procedura krok po kroku
Zmiana licencji HashiCorp: co to oznacza
Licencja Business Source (BSL 1.1) przyjęta przez HashiCorp w 2023 roku zawiera klauzulę klucz: Nie wolno używać oprogramowania do oferowania konkurencyjnego produktu komercyjnego z HashiCorp. W praktyce oznacza to:
# Cosa e CONSENTITO con la BSL HashiCorp:
# - Uso interno in azienda per gestire infrastruttura propria
# - Contribuire al codebase Terraform
# - Creare moduli e provider Terraform
# - Usare Terraform in CI/CD per i tuoi progetti
# - Formazione e certificazioni
# Cosa NON e CONSENTITO senza licenza commerciale:
# - Offrire Terraform as a Service (competitor di Terraform Cloud/Enterprise)
# - Costruire un prodotto SaaS che "wrappa" Terraform come core feature
# e compete con HCP Terraform
# - Le piattaforme come Spacelift, Env0, Scalr devono gestire questa zona grigia
# Data conversione a Apache 2.0: non annunciata (BSL diventa Apache 2.0 dopo 4 anni
# dalla release di ogni versione, quindi Terraform 1.5 -> Apache 2.0 nel 2027)
# Chi ha BIFORCATO:
# - OpenTofu (Linux Foundation, ex OpenTF) — replica di Terraform pre-BSL
# - OpenTofu segue Terraform con ~2-4 version lag
# - Attuale: OpenTofu 1.8.x vs Terraform 1.9.x
OpenTofu: rozwidlenie open source
OtwórzTofu (dawniej OpenTF) i zachowany widelec Terraform od Linux Foundation przy wsparciu Gruntwork, Spacelift, Env0, Scalr i kilkudziesięciu innych. Wyznaczony cel: pozostać kompatybilnym z Terraformem w miarę dodawania funkcje, których HCP może nie wdrożyć w celu ochrony modelu biznesowego.
Kompatybilność i różnice
# OpenTofu e un drop-in replacement per Terraform
# I file .tf sono identici: nessuna modifica richiesta per la maggior parte dei casi
# Installazione OpenTofu
# Via brew (macOS/Linux):
brew install opentofu
# Via script ufficiale:
curl --proto '=https' --tlsv1.2 -fsSL https://get.opentofu.org/install-opentofu.sh | \
sh -s -- --install-method standalone
# Verifica versione
tofu version
# OpenTofu v1.8.3
# on linux_amd64
# Comandi identici a Terraform (solo "tofu" invece di "terraform"):
tofu init
tofu plan
tofu apply
tofu destroy
# Stessa sintassi HCL, stessi provider, stesso state file format
Unikalne funkcje OpenTofu (nie w Terraform)
# 1. Encrypted State (OpenTofu 1.7+)
# Terraform richiede un backend esterno per la cifratura dello state
# OpenTofu supporta encryption nativa nel backend
terraform {
encryption {
key_provider "pbkdf2" "my_key" {
passphrase = var.state_encryption_key
}
method "aes_gcm" "my_method" {
keys = key_provider.pbkdf2.my_key
}
state {
method = method.aes_gcm.my_method
}
plan {
method = method.aes_gcm.my_method
}
}
}
# 2. Provider Functions (OpenTofu 1.7+, porting in Terraform 1.8)
# Funzioni custom definite nei provider (entrambi supportano ora)
# 3. Variable validation con references ad altre variabili
variable "max_instances" {
type = number
}
variable "min_instances" {
type = number
validation {
# OpenTofu: puoi referenziare altre variabili nella validation
condition = var.min_instances <= var.max_instances
error_message = "min_instances deve essere <= max_instances."
}
}
Migracja z Terraform do OpenTofu
# Migrazione in 5 passi (praticamente indolore)
# 1. Backup dello state attuale
terraform state pull > backup_$(date +%Y%m%d).tfstate
# 2. Installa OpenTofu
brew install opentofu
# 3. Testa in un ambiente non-prod
cd environments/dev
tofu init # Legge lo stesso .terraform.lock.hcl (OpenTofu e compatibile)
tofu plan # Verifica che il plan sia identico a terraform plan
# 4. Se tutto ok, migra il .terraform.lock.hcl
# OpenTofu usa un formato leggermente diverso per il lock file
tofu providers lock \
-platform=linux_amd64 \
-platform=darwin_amd64 \
-platform=darwin_arm64
# 5. Aggiorna le pipeline CI/CD
# Sostituisci "terraform" con "tofu" negli script
# Aggiorna le action GitHub se usi hashicorp/setup-terraform:
# usa opentofu/setup-opentofu invece
# Nel CI/CD (GitHub Actions):
# - name: Setup OpenTofu
# uses: opentofu/setup-opentofu@v1
# with:
# tofu_version: "1.8.x"
Pulumi: Infrastruktura jako prawdziwy kod
Pulumi przyjmuje radykalnie odmienne podejście: zamiast deklaratywnego DSL (HCL), używać prawdziwe języki programowania — TypeScript, Python, Go, C#, Java. Ma to głębokie implikacje: masz dostęp do pętli, warunków, funkcji, modułów npm/pip, testy natywne za pomocą Jest/pytest i całego zestawu narzędzi językowych.
Pulumi w TypeScript
// Pulumi - infrastruttura come TypeScript
import * as aws from "@pulumi/aws";
import * as pulumi from "@pulumi/pulumi";
const config = new pulumi.Config();
const environment = config.require("environment");
const instanceCount = config.requireNumber("instanceCount");
// VPC con subnet - stessa logica di Terraform ma con TypeScript
const vpc = new aws.ec2.Vpc("main", {
cidrBlock: "10.0.0.0/16",
enableDnsHostnames: true,
enableDnsSupport: true,
tags: {
Name: `${environment}-vpc`,
Environment: environment,
ManagedBy: "Pulumi",
},
});
// Crea subnet dinamicamente con un loop TypeScript nativo
// In Terraform useresti count o for_each
const publicSubnets = Array.from({ length: instanceCount }, (_, i) =>
new aws.ec2.Subnet(`public-${i}`, {
vpcId: vpc.id,
cidrBlock: `10.0.${i}.0/24`,
mapPublicIpOnLaunch: true,
tags: { Name: `${environment}-public-${i + 1}` },
})
);
// Output esportati
export const vpcId = vpc.id;
export const subnetIds = publicSubnets.map(s => s.id);
Testowanie natywne z Pulumi
Najbardziej konkretną przewagą Pulumi nad Terraformem jest testowanie: możesz pisać testowanie za pomocą standardowych testów Jest/pytest/Go, bez Terratestu i zewnętrznych frameworków.
// test/infra.test.ts — Unit test Pulumi con Jest
import * as pulumi from "@pulumi/pulumi";
import * as aws from "@pulumi/aws";
// Mock del provider AWS per i test (non fa chiamate reali)
pulumi.runtime.setMocks({
newResource: (args) => {
return {
id: `${args.name}-id`,
state: { ...args.inputs, id: `${args.name}-id` },
};
},
call: (args) => ({ outputs: {} }),
});
describe("VPC Infrastructure", () => {
let infra: typeof import("../index");
beforeAll(async () => {
infra = await import("../index");
});
test("VPC deve avere DNS abilitato", async () => {
const vpc = await infra.vpc;
const props = await vpc.enableDnsHostnames.apply(v => v);
expect(props).toBe(true);
});
test("Numero subnet deve corrispondere alla configurazione", async () => {
const subnets = await pulumi.all(infra.subnetIds).apply(ids => ids.length);
const expectedCount = Number(process.env.INSTANCE_COUNT || 2);
expect(subnets).toBe(expectedCount);
});
test("Subnet devono appartenere alla VPC", async () => {
const vpcId = await infra.vpcId;
// Verifica che ogni subnet abbia il VPC ID corretto
expect(vpcId).toBeDefined();
expect(vpcId).toMatch(/^vpc-/);
});
});
Tabela porównawcza: Terraform vs OpenTofu vs Pulumi
Porównanie poszczególnych funkcji (2026)
| Cechy | Terraforma | OtwórzTofu | Pulumi |
|---|---|---|---|
| Licencja | BSL 1.1 | MPL 2.0 | Apache 2.0 |
| Język | HCL | HCL | TS/Python/Go/C# |
| Dostawcy AWS | Ponad 1200 zasobów | To samo co TF | ~900 zasobów |
| Testy natywne | test terraformowy (1.6+) | próba tofu | Jest/pytest/Go |
| Szyfrowanie stanu | Tylko backend | Natywny (1.7+) | Chmura Pulumi |
| Krzywa uczenia się | Niski | Niski | Przeciętny |
| Społeczność i dokumenty | Doskonały | Dobry | Dobry |
Matryca decyzyjna: kiedy wybrać, który
# Scegli TERRAFORM se:
# - Hai gia un team con esperienza HCL e non vuoi riformare
# - Lavori in un contesto enterprise con vendor support HashiCorp
# - Hai bisogno del massimo ecosistema di provider e moduli
# - Non hai requisiti di licenza open-source certificata
# - Usi Terraform Cloud o HCP per il backend di stato
# Scegli OPENTOFU se:
# - La licenza BSL e un problema (healthcare, govtech, open-source aziende)
# - Vuoi drop-in replacement con garanzia open-source a lungo termine
# - Usi gia Terraform e vuoi minimizzare il costo di migrazione
# - Hai bisogno di state encryption nativa (feature non in Terraform)
# - Il tuo company legal ha approvato MPL 2.0 ma non BSL
# Scegli PULUMI se:
# - Il tuo team e composto da developer (non solo DevOps) abituati a TypeScript/Python
# - Hai logica di configurazione complessa: loop, condizionali, validazioni rich
# - Vuoi testing nativo con framework di test standard senza Terratest
# - Stai costruendo un Internal Developer Platform e vuoi API programmatiche
# - Hai bisogno di astrazioni di alto livello (Pulumi Component Resources)
Interoperacyjność: korzystanie z dostawcy Terraform w Pulumi
// Pulumi supporta tutti i provider Terraform via bridge
// Utile per provider non ancora disponibili nativamente in Pulumi
import * as pulumitf from "@pulumi/terraform";
// Usa qualsiasi provider Terraform (anche non ufficiale)
const provider = new pulumitf.Provider("custom-provider", {
version: "1.2.3",
// Equivalente di required_providers in Terraform
});
// Questa interoperabilita permette una migrazione graduale
// da Terraform a Pulumi senza dover aspettare che tutti i provider
// siano portati nativamente
Wnioski
W tej konkurencji nie ma absolutnego zwycięzcy: każde narzędzie wyróżnia się w kontekście inny. Terraform pozostaje liderem rynku z najbogatszym ekosystemem. OpenTofu e racjonalny wybór dla tych, którzy chcą kompatybilności Terraform z licencją typu open source. Pulumi i przyszłość dla zespołów skupionych na programistach, które chcą ujednolicić infrastrukturę i zastosowanie w jednym paradygmacie kodu.
Kompletna seria: Terraform i IaC
- Artykuł 01 — Terraformacja od zera
- Artykuł 02 — Moduły Terraformy wielokrotnego użytku
- Artykuł 03 — Stan Terraformu i zdalny backend
- Artykuł 04 — Terraforma w CI/CD
- Artykuł 05 — Testowanie IaC
- Artykuł 06 — Bezpieczeństwo IAC
- Artykuł 07 — Terraform Multi-Cloud
- Artykuł 08 — GitOps dla Terraforma
- Artykuł 09 (ten) — Terraform vs Pulumi vs OpenTofu: Porównanie 2026
- Artykuł 10 — Wzorce korporacyjne Terraform







