AI

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から自動同期>

機能比較表

比較項目OpenTofuPulumiCrossplane
Terraform互換✅ 100%❌(要書き直し)
汎用言語サポート❌(HCLのみ)✅(Python・TS・Go)❌(YAML)
Kubernetes Native✅ 最強
GitOps統合✅(ArgoCD/Flux)
GitHub Stars24k+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マニフェスト(RDSInstanceS3BucketEKSCluster等)をコミット②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・テスト重視ならPulumiKubernetes中心・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

関連外部リソース

他の記事も読む

Let's Build Together

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

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