2026 年の IaC パノラマ

2023 年に、HashiCorp は Terraform のライセンスを MPL 2.0 (オープンソース) から ビジネス ソース ライセンス (BSL 1.1)、世界で最も白熱した議論の 1 つを引き起こした DevOps。 OSI 定義によれば、BSL はオープンソースではありません: 商用利用は禁止されています HashiCorp の直接の競合他社によるものです。コミュニティの反応は次のとおりでした 即時: オープンソース フォーク オープン豆腐、その後 Linux Foundation に寄付されました。

2026 年、市場は 3 つの明確な立場に落ち着いています。Terraform は 32.8%の市場シェア その巨大なインストールベースのおかげで、IaC ツールの中でもトップクラスの人気を誇っています。 プロバイダーとモジュールのエコシステム。 OpenTofu は、 ~8% 主に認定されたオープンソース ライセンスを必要とする環境で。プルミ そしてで育ちました ~15% 開発者のエクスペリエンスとネイティブ テストに重点を置いています。 CloudFormation、CDK、Bicep、Ansible によってパノラマが完成します。

何を学ぶか

  • HashiCorp BSL ライセンス変更の歴史と影響
  • OpenTofu: Terraform の互換性、現在のステータス、ロードマップ
  • Pulumi: 「リアルコードとしてのインフラストラクチャ」パラダイム、長所と短所
  • 技術比較表: 機能、ライセンス、エコシステム、テスト
  • 意思決定マトリックス: 各ツールをいつ選択するか
  • Terraform から OpenTofu への移行: 段階的な手順

HashiCorpのライセンス変更: その意味

2023 年に HashiCorp が採用したビジネス ソース ライセンス (BSL 1.1) には次の条項があります key: このソフトウェアを使用して、競合する商用製品を提供することはできません。 ハシコーポレーションと実際には、これは次のことを意味します。

# 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: オープンソース フォーク

オープン豆腐 (以前の OpenTF) と保持された Terraform フォーク Gruntwork、Spacelift、Env0、Scalr、その他数十社の貢献による Linux Foundation からの提供 他人の。定められた目標: Terraform が追加された場合でも、Terraform との互換性を維持すること HCP がビジネス モデルを保護するために実装できない機能。

互換性と相違点

# 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

OpenTofu の独自の機能 (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."
  }
}

Terraform から 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: リアルコードとしてのインフラストラクチャ

Pulumi は根本的に異なるアプローチを採用しています。宣言型 DSL (HCL) の代わりに、 使う 本物のプログラミング言語 — TypeScript、Python、Go、C#、Java。 これは重大な意味を持ちます。ループ、条件分岐、関数、npm/pip モジュール、 Jest/pytest と言語ツールチェーン全体を使用したネイティブ テスト。

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);

Pulumi を使用したネイティブ テスト

Terraform に対する Pulumi の最も具体的な利点はテストです。 Terratest や外部フレームワークを使用せず、標準の Jest/pytest/Go テストを使用してテストします。

// 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-/);
  });
});

比較表: Terraform vs OpenTofu vs Pulumi

機能ごとの比較 (2026 年)

特徴 テラフォーム オープン豆腐 プルミ
ライセンス BSL1.1 MPL 2.0 アパッチ2.0
言語 HCL HCL TS/Python/Go/C#
AWSプロバイダー 1200以上のリソース TFと同じ ~900 リソース
ネイティブテスト テラフォームテスト (1.6+) 豆腐テスト ジェスト/pytest/Go
状態の暗号化 バックエンドのみ ネイティブ (1.7+) プルミクラウド
学習曲線 低い 低い 平均
コミュニティとドキュメント 素晴らしい 良い 良い

意思決定マトリックス: いつどれを選択するか

# 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)

相互運用性: Pulumi での Terraform プロバイダーの使用

// 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

結論

この競争には絶対的な勝者はいません。各ツールは状況に応じて優れています。 違う。 Terraform は、最も豊富なエコシステムを備えた市場リーダーであり続けています。 OpenTofuへ オープンソース ライセンスとの Terraform 互換性を求めるユーザーにとっては合理的な選択です。 Pulumi とインフラストラクチャの統合を望む開発者中心のチームの未来 単一のコードパラダイムでのアプリケーションを実現します。

完全なシリーズ: Terraform と IaC

  • 第01条 — ゼロからの Terraform
  • 第02条 — 再利用可能な Terraform モジュール
  • 第03条 — Terraform 状態とリモート バックエンド
  • 第04条 — CI/CD の Terraform
  • 第05条 — IaC テスト
  • 第06条 — IaC セキュリティ
  • 第07条 — Terraform マルチクラウド
  • 第08条 — Terraform の GitOps
  • 第09条(本) — Terraform vs Pulumi vs OpenTofu: 比較 2026
  • 第10条 — Terraform エンタープライズ パターン