オープンソース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
機能比較表
| 比較項目 | OpenTofu | Pulumi | Crossplane |
|---|---|---|---|
| 言語 | HCL | Python/TS/Go等 | Kubernetes YAML |
| Terraform互換 | ✅ 100% | ❌ | ❌ |
| プログラミング言語サポート | ❌ | ✅ 10+ | ❌ |
| Kubernetes統合 | ⚠️ | ⚠️ | ✅ ネイティブ |
| GitOps統合 | ✅ | ✅ | ✅ 最適 |
| ステート管理 | ✅ | ✅ | Kubernetes etcd |
| プロバイダー数 | 3000+ | 1000+ | 200+ |
| ドリフト検知 | ✅ | ✅ | ✅ |
| マルチクラウド | ✅ | ✅ | ✅ |
| 学習コスト | 低(HCL) | 中(既存言語) | 高(K8s知識必要) |
| ライセンス | MPL 2.0 | Apache 2.0 | Apache 2.0 |
| GitHub Stars | 23k+ | 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 |
| 汎用プログラミング言語でIaC | Pulumi |
| Kubernetes GitOpsでクラウド管理 | Crossplane |
| 新規プロジェクトのIaC基盤 | OpenTofu |