IaC比較:OpenTofu vs Pulumi vs Crossplane でクラウドインフラを管理する
オープンソースラボ編集部 ・ 2026年6月14日
IaC比較:OpenTofu vs Pulumi vs Crossplane でクラウドインフラを管理する
**インフラストラクチャ・アズ・コード(IaC)**はクラウドリソース(サーバー・ネットワーク・データベース・Kubernetes)をコードで宣言・管理するアプローチです。HashiCorp Terraformが長らくデファクトスタンダードでしたが、2023年のBSL(非OSS)ライセンス変更により、OSSフォーク・代替ツールへの移行が加速しています。OpenTofu(Terraformフォーク・CNCF)・Pulumi(汎用プログラミング言語でIaC)・Crossplane(Kubernetes Native IaC)の3つが2026年の主要OSS IaCツールです。
OSS IaCツールを使う理由
- Terraformライセンス問題: 2023年にHashiCorpがTerraformをBSL(Business Source License)に変更→商用利用制限
- インフラ再現性: Prod・Stag・Devを同一コードから再現→「動いたから本番にコピー」を廃止
- ドリフト検出: コードとクラウドの実際の状態の差分を自動検出して修正
- コラボレーション: GitでPRレビュー・承認フロー→インフラ変更の事故を防ぐ
主要ツールの概要
OpenTofu
2023年公開(CNCF Sandbox)、Go製のOSSです。GitHubスター24k+。HashiCorp TerraformのOSSフォークで、Terraformと100%互換(同じHCL構文・同じプロバイダー)で使えます。Terraform 1.5.5から分岐してCNCFの中立なガバナンス下で開発が継続されています。
# main.tf: OpenTofu/Terraform(HCL)でAWS + Kubernetes環境を構築
terraform {
required_version = ">= 1.6"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
backend "s3" {
bucket = "my-tofu-state"
key = "prod/terraform.tfstate"
region = "ap-northeast-1"
}
}
provider "aws" {
region = var.aws_region
}
variable "aws_region" {
default = "ap-northeast-1"
}
variable "environment" {
default = "production"
}
# VPC
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
version = "~> 5.0"
name = "${var.environment}-vpc"
cidr = "10.0.0.0/16"
azs = ["ap-northeast-1a", "ap-northeast-1c", "ap-northeast-1d"]
private_subnets = ["10.0.1.0/24", "10.0.2.0/24", "10.0.3.0/24"]
public_subnets = ["10.0.101.0/24", "10.0.102.0/24", "10.0.103.0/24"]
enable_nat_gateway = true
tags = { Environment = var.environment }
}
# EKS クラスター
module "eks" {
source = "terraform-aws-modules/eks/aws"
version = "~> 20.0"
cluster_name = "${var.environment}-eks"
cluster_version = "1.31"
vpc_id = module.vpc.vpc_id
subnet_ids = module.vpc.private_subnets
eks_managed_node_groups = {
main = {
min_size = 2
max_size = 10
desired_size = 3
instance_types = ["t3.medium"]
}
}
tags = { Environment = var.environment }
}
# RDS PostgreSQL
resource "aws_db_instance" "main" {
identifier = "${var.environment}-postgres"
engine = "postgres"
engine_version = "16.3"
instance_class = "db.t3.medium"
allocated_storage = 100
db_name = "myapp"
username = "admin"
password = var.db_password
vpc_security_group_ids = [aws_security_group.rds.id]
db_subnet_group_name = aws_db_subnet_group.main.name
multi_az = true
storage_encrypted = true
skip_final_snapshot = false
final_snapshot_identifier = "${var.environment}-final-snapshot"
tags = { Environment = var.environment }
}
output "eks_cluster_endpoint" {
value = module.eks.cluster_endpoint
}
output "rds_endpoint" {
value = aws_db_instance.main.endpoint
}
# OpenTofu ワークフロー
tofu init # プロバイダーとモジュールをダウンロード
tofu plan # 変更計画を表示(実際には変更しない)
tofu apply # インフラを作成・更新
tofu destroy # インフラを削除
# Terraformから移行(互換性100%)
sed -i 's/terraform/tofu/g' Makefile # コマンドを置換するだけ
# HCLファイル・tfstateはそのまま利用可能
Pulumi
2017年公開、Go製のOSSです。GitHubスター22k+。Python・TypeScript・Go・Java・C#などの汎用プログラミング言語でインフラをコード化するIaCフレームワークです。HCLを学ばずにTypeScriptでAWS・GCP・Kubernetes・CloudflareリソースをAPIで定義でき、既存プログラミングスキルを流用できます。
// index.ts: Pulumi TypeScript でAWS + Kubernetes環境を構築
import * as pulumi from '@pulumi/pulumi'
import * as aws from '@pulumi/aws'
import * as eks from '@pulumi/eks'
import * as k8s from '@pulumi/kubernetes'
const config = new pulumi.Config()
const environment = config.get('environment') ?? 'production'
// VPC
const vpc = new aws.ec2.Vpc('main-vpc', {
cidrBlock: '10.0.0.0/16',
enableDnsHostnames: true,
tags: { Name: `${environment}-vpc`, Environment: environment },
})
// EKS クラスター(Pulumi EKS コンポーネント)
const cluster = new eks.Cluster('main-cluster', {
vpcId: vpc.id,
instanceType: 't3.medium',
desiredCapacity: 3,
minSize: 2,
maxSize: 10,
tags: { Environment: environment },
})
// RDS Aurora PostgreSQL
const dbSubnetGroup = new aws.rds.SubnetGroup('main-db', {
subnetIds: cluster.core.privateSubnetIds,
})
const dbCluster = new aws.rds.Cluster('postgres', {
clusterIdentifier: `${environment}-aurora-postgres`,
engine: aws.rds.EngineType.AuroraPostgresql,
engineVersion: '16.4',
masterUsername: 'admin',
masterPassword: config.requireSecret('dbPassword'),
dbSubnetGroupName: dbSubnetGroup.name,
storageEncrypted: true,
tags: { Environment: environment },
})
// Kubernetes Namespace + Deployment(PulumiのK8sプロバイダー)
const provider = new k8s.Provider('k8s-provider', { kubeconfig: cluster.kubeconfig })
const ns = new k8s.core.v1.Namespace('app-ns', { metadata: { name: 'myapp' } }, { provider })
const deployment = new k8s.apps.v1.Deployment('app', {
metadata: { namespace: ns.metadata.name, name: 'myapp' },
spec: {
replicas: 3,
selector: { matchLabels: { app: 'myapp' } },
template: {
metadata: { labels: { app: 'myapp' } },
spec: { containers: [{ name: 'myapp', image: 'myapp:latest', ports: [{ containerPort: 3000 }] }] },
},
},
}, { provider })
export const clusterEndpoint = cluster.core.cluster.endpoint
export const dbEndpoint = dbCluster.endpoint
# Pulumi ワークフロー
pulumi stack init production # スタック(環境)を初期化
pulumi preview # 変更計画を表示
pulumi up # インフラを作成・更新
pulumi destroy # インフラを削除
# 言語別セットアップ
pulumi new aws-python # Python
pulumi new aws-typescript # TypeScript
pulumi new aws-go # Go
Crossplane
2019年公開(Upbound)、Go製のOSSです。GitHubスター10k+。Kubernetes上でクラウドリソースをKubernetesカスタムリソース(CRD)として管理するIaCです。kubectl applyでAWS/GCP/Azureリソースを作成・管理し、GitOpsワークフロー(ArgoCD・FluxCD)と完全統合します。
# Crossplane: KubernetesマニフェストでRDS PostgreSQLを管理
apiVersion: database.aws.crossplane.io/v1beta1
kind: RDSInstance
metadata:
name: production-postgres
namespace: crossplane-system
spec:
forProvider:
region: ap-northeast-1
dbInstanceClass: db.t3.medium
engine: postgres
engineVersion: "16"
masterUsername: admin
allocatedStorage: 100
multiAZ: true
storageEncrypted: true
vpcSecurityGroupIds:
- sg-xxxxxxxxxxxxxxxxx
dbSubnetGroupName: my-subnet-group
writeConnectionSecretToRef:
namespace: crossplane-system
name: postgres-connection
providerConfigRef:
name: aws-provider
---
# 接続情報がSecretに自動格納 → アプリのSecretとして参照可能
apiVersion: v1
kind: Secret
metadata:
name: app-db-secret
namespace: myapp
data:
DATABASE_URL: <crossplaneのpostgres-connectionから自動同期>
機能比較表
| 比較項目 | OpenTofu | Pulumi | Crossplane |
|---|---|---|---|
| Terraform互換 | ✅ 100% | ❌(要書き直し) | ❌ |
| 汎用言語サポート | ❌(HCLのみ) | ✅(Python・TS・Go) | ❌(YAML) |
| Kubernetes Native | △ | △ | ✅ 最強 |
| GitOps統合 | △ | △ | ✅(ArgoCD/Flux) |
| GitHub Stars | 24k+ | 22k+ | 10k+ |
IaCはDevOpsカテゴリ/categories/devopsのGrafana Loki・Prometheus・Kubernetes等のインフラ全体をコード管理する中核ツールです。セキュリティカテゴリ/categories/securityのKeycloak・Vaultwardenを含むセキュリティインフラをOpenTofuで定義してGitHub ActionsでCI/CDデプロイするパターンが多くの組織で採用されています。
FAQ
Q. TerraformからOpenTofuへの移行手順は?
A. OpenTofuはTerraformと100%互換なのでコマンドを置き換えるだけで移行可能です。手順: ①OpenTofu CLIをインストール(brew install opentofuまたはGitHubリリースからバイナリ取得)②terraformコマンドをtofuに置き換え(.tfファイルの変更不要)③tofu init→既存のtfstateファイルをそのまま認識→tofu planでドリフトなし確認→tofu apply。注意点: ①HCL構文は完全互換②Terraformプロバイダー(AWS・GCP・Azure等)をそのまま使用可能③Terraform Cloudのリモートバックエンドは「Terraformの商用サービス」のためOpenTofuでは不使用→S3バックエンド・HCP Terraformは互換。移行メリット: ①BSLライセンス問題を回避②CNCFプロジェクトとしてベンダーロックイン回避③OpenTofu独自機能(プロバイダー関数・state暗号化)を将来的に活用。
Q. Pulumiで既存のTerraform tfstateをインポートするには?
A. pulumi convert --from terraformコマンドでHCLからPulumiコードに変換します。手順: ①pulumi convert --from terraform --language typescript --out pulumi/→既存.tfファイルをTypeScriptに自動変換②pulumi importで既存インフラをPulumiステートに取り込み③Pulumiのリソース定義と実際のクラウドリソースを紐付け。変換の精度: 単純なリソース定義は90%以上の精度で変換されますが、複雑なモジュール・動的ブロックは手修正が必要なケースもあり。Pulumiの利点: TypeScript/Python/Goで書けるので①ループ・条件分岐(for/if)が自然に書ける②ユニットテスト(vitest/pytest)でインフラコードをテスト③既存のnpm/pip パッケージを使ってインフラをプログラマブルに構成。
Q. CrossplaneでGitOps(ArgoCD)と統合したインフラ管理を実現するには?
A. CrossplaneリソースのYAMLマニフェストをGitリポジトリで管理してArgoCDで自動同期します。構成: ①GitリポジトリにCrossplaneマニフェスト(RDSInstance・S3Bucket・EKSCluster等)をコミット②ArgoCD ApplicationでGitリポジトリを監視→kubectl applyを自動実行③Crossplane ControllerがCRDをAWS APIに変換→実際のリソースを作成・更新・削除④ドリフト検出: GitのYAMLと実際のAWSリソースの差分をCrossplaneが継続監視→差分があれば自動修正(reconciliation loop)。利点: インフラとアプリケーションを同一のGitOpsワークフローで管理→kubectl applyだけでインフラ変更が完了→承認フロー(PRレビュー→ArgoCD Sync)がそのまま使える。
Q. OpenTofu・Pulumi・Crossplaneのどれを選べばいいですか?
A. Terraform既存資産の移行・HCL・大規模チームならOpenTofu、汎用言語活用・プログラマブルIaC・テスト重視ならPulumi、Kubernetes中心・GitOps・K8s NativeならCrossplaneが向いています。OpenTofu優位: ①Terraform移行が最も簡単(コマンド置換のみ)②最大のエコシステム(Terraformモジュール・プロバイダー)③チームのHCL知識をそのまま活用。Pulumi優位: ①Python/TypeScript/Goで書けるので開発者がIaCを書きやすい②条件分岐・ループ・テストが言語ネイティブに書ける③Automation APIでPythonからPulumiを呼び出してCI/CD統合が容易。Crossplane優位: ①Kubernetes上のすべてをYAMLで統一管理②ArgoCDとの完全統合③マルチクラウドのコントロールプレーンとして機能。
まとめ
| ユースケース | 推奨ツール |
|---|---|
| Terraform移行・HCL・最大エコシステム | OpenTofu |
| 汎用言語IaC・Python/TypeScript・テスト | Pulumi |
| Kubernetes Native・GitOps・マルチクラウド | Crossplane |