AI

オープンソースIaC比較:OpenTofu vs Pulumi vs Crossplane でインフラをコード管理する

オープンソースラボ編集部2026年6月13日

オープンソースInfrastructure as Code比較:OpenTofu vs Pulumi vs Crossplane でインフラをコード管理する

「インフラをコードで管理する(Infrastructure as Code, IaC)」はクラウドインフラの再現性・バージョン管理・自動化の基盤です。HashiCorp TerraformのBSLライセンス変更後、OpenTofu・Pulumi・Crossplaneがオープンソースの代替として注目されています。

TerraformからOpenTofuへ移行する理由

HashiCorpは2023年8月にTerraformのライセンスをMPL 2.0からBSL 1.1(Business Source License)に変更しました。BSLでは商用目的でTerraformと競合するサービスの構築が制限されます。OpenTofuはLinux Foundation傘下でTerraformをフォークしたプロジェクトで、完全なオープンソース(MPL 2.0)として開発が続いています。

主要ツールの概要

OpenTofu

Terraformと100%互換のオープンソースIaCツールです。既存のTerraformコード・プロバイダー・モジュールをそのまま使えます。

# OpenTofuのインストール(macOS)
brew install opentofu

# Windowsはscoopで
scoop install opentofu

# 既存のTerraformコードをそのまま使える
tofu init
tofu plan
tofu apply

# 状態ファイルのマイグレーション(terraform → opentofu)
tofu init -migrate-state
# main.tf (TerraformのコードがそのままOpenTofuで動く)
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
  backend "s3" {
    bucket = "my-tfstate-bucket"
    key    = "prod/terraform.tfstate"
    region = "ap-northeast-1"
  }
}

provider "aws" {
  region = "ap-northeast-1"
}

resource "aws_vpc" "main" {
  cidr_block           = "10.0.0.0/16"
  enable_dns_hostnames = true

  tags = {
    Name        = "main-vpc"
    Environment = var.environment
  }
}

resource "aws_subnet" "public" {
  count             = 2
  vpc_id            = aws_vpc.main.id
  cidr_block        = cidrsubnet(aws_vpc.main.cidr_block, 8, count.index)
  availability_zone = data.aws_availability_zones.available.names[count.index]
}

Pulumi

インフラをPython・TypeScript・Go・Java・C#などの汎用プログラミング言語で定義するIaCツールです。条件分岐・ループ・型システム・IDEの補完が使えます。

# PulumiでAWSリソースをPythonで定義
import pulumi
import pulumi_aws as aws

config = pulumi.Config()
environment = config.get("environment") or "dev"

# VPCの作成
vpc = aws.ec2.Vpc(
    "main-vpc",
    cidr_block="10.0.0.0/16",
    enable_dns_hostnames=True,
    tags={"Environment": environment},
)

# サブネットをループで作成(HCLのcount相当)
availability_zones = aws.get_availability_zones(state="available")
subnets = []
for i, az in enumerate(availability_zones.names[:2]):
    subnet = aws.ec2.Subnet(
        f"public-subnet-{i}",
        vpc_id=vpc.id,
        cidr_block=f"10.0.{i}.0/24",
        availability_zone=az,
        map_public_ip_on_launch=True,
    )
    subnets.append(subnet)

# EKSクラスターの作成
cluster = aws.eks.Cluster(
    "my-cluster",
    role_arn=eks_role.arn,
    vpc_config=aws.eks.ClusterVpcConfigArgs(
        subnet_ids=[subnet.id for subnet in subnets],
    ),
)

# エクスポート(terraform outputに相当)
pulumi.export("vpc_id", vpc.id)
pulumi.export("cluster_endpoint", cluster.endpoint)

Crossplane

Kubernetesネイティブの「コントロールプレーンフレームワーク」です。Kubernetesのカスタムリソース(CRD)を使ってAWS・GCP・Azureのリソースを管理します。GitOps(ArgoCD/Flux)と自然に統合できます。

# CrossplaneでAWS RDSインスタンスをKubernetesリソースとして管理
apiVersion: database.aws.crossplane.io/v1beta1
kind: RDSInstance
metadata:
  name: my-postgres
  namespace: production
spec:
  forProvider:
    region: ap-northeast-1
    dbInstanceClass: db.t3.micro
    dbName: myapp
    engine: postgres
    engineVersion: "15"
    masterUsername: admin
    masterUserPasswordSecretRef:
      name: rds-password
      namespace: production
      key: password
    multiAZ: false
    storageEncrypted: true
    allocatedStorage: 20
  providerConfigRef:
    name: aws-provider
  writeConnectionSecretToRef:
    name: rds-connection
    namespace: production

機能比較表

比較項目OpenTofuPulumiCrossplane
言語HCLPython/TS/Go等Kubernetes YAML
Terraform互換✅ 100%
プログラミング言語サポート✅ 10+
Kubernetes統合⚠️⚠️✅ ネイティブ
GitOps統合✅ 最適
ステート管理Kubernetes etcd
プロバイダー数3000+1000+200+
ドリフト検知
マルチクラウド
学習コスト低(HCL)中(既存言語)高(K8s知識必要)
ライセンスMPL 2.0Apache 2.0Apache 2.0
GitHub Stars23k+22k+9k+

TerraformからOpenTofuへの移行手順

# 1. TerraformのステートをOpenTofuで読み込む
tofu init

# 2. stateファイルのバージョン確認
tofu state list

# 3. planで差分がないことを確認
tofu plan

# 4. CI/CDのterraformコマンドをtofuに置き換え
# Before: terraform plan / terraform apply
# After:  tofu plan     / tofu apply

IaCツール・DevOpsツールはDevOpsカテゴリ(/categories/devops)で一覧でき、セキュリティとコンプライアンスのツールはセキュリティカテゴリ(/categories/security)でも探せます。

FAQ

Q. TerraformからOpenTofuへの移行は難しいですか?

A. 非常に簡単です。OpenTofuは100%Terraform互換を目指しており、既存の.tfファイル・プロバイダー・モジュール・バックエンド設定をそのまま使えます。terraformコマンドをtofuに置き換えるだけで動作します。Terraform Enterprise・Terraform Cloudからの移行は追加設定が必要ですが、OSS版の移行は数分で完了します。

Q. PulumiのTypeScriptとHCLはどちらが書きやすいですか?

A. ユースケースによります。TypeScript/Pythonで書くPulumiは条件分岐・ループ・関数・型チェックが使えるため、複雑なインフラロジック(「本番環境だけmulti-AZにする」「タグリストをループ処理する」)を書くのが容易です。HCL(OpenTofu)は宣言的でシンプルなリソース定義に向いており、インフラ専任チームよりDevチームが読みやすい傾向があります。

Q. CrossplaneはTerraformの代替になりますか?

A. ユースケースが異なります。CrossplaneはKubernetes上でクラウドインフラを管理するのに特化しており、GitOps・マルチクラスター環境に最適化されています。一方でTerraform/OpenTofuはKubernetes以外のインフラ(EC2・S3・Lambda等)の管理も得意です。KubernetesネイティブでGitOpsを使いたい場合はCrossplane、汎用IaCはOpenTofu、という使い分けが現実的です。

Q. IaCのベストプラクティスは何ですか?

A. 主要なプラクティス: リモートstateバックエンドの使用(S3+DynamoDB等)・StateのLock機能の有効化・環境ごとのworkspace分離・モジュール化によるDRY原則・PR/MRでのplan結果レビュー・Tflint/Terrascanによる静的解析。特にCIでのplan自動実行(git push→PRに差分コメント)は品質向上に効果的です。

まとめ

ユースケース推奨ツール
Terraformからの移行OpenTofu
汎用プログラミング言語でIaCPulumi
Kubernetes GitOpsでクラウド管理Crossplane
新規プロジェクトのIaC基盤OpenTofu

関連外部リソース

他の記事も読む

Let's Build Together

OSS導入、自社だけで悩まない。

ツール選定から構築・運用・AI活用まで、オープンソースラボ運営元のClasslessが伴走します。初回のご相談は無料です。