サイトアイコンmaita tomoya dev io

Terraform vs CloudFormation vs Pulumi vs CDK: IaCツール選定

devops-tools

Terraform vs CloudFormation vs Pulumi vs CDK: IaCツール選定

はじめに

Infrastructure as Code(IaC)は、インフラ構成をコードで管理する手法です。手作業でのインフラ構築は再現性が低く、ミスが起きやすい。IaCを使えば、インフラの構築・変更・削除をコードベースで管理でき、バージョン管理やレビューも可能になります。

身近な例えで理解するIaC

IaCは「設計図」のようなものです。

手作業でインフラを構築する = 口頭の指示で家を建てるようなもの(毎回微妙に違う家ができる) IaCでインフラを構築する = 詳細な設計図を元に家を建てるようなもの(何度建てても同じ家ができる)

各ツールの例え:

  • Terraform = 汎用設計図。どの工務店(クラウド)でも使える標準的な書き方
  • CloudFormation = AWS専用設計図。AWS純正で安心だが、AWS以外では使えない
  • Pulumi = プログラミング言語で書ける設計図。TypeScriptやPythonでインフラを定義
  • CDK = AWSの設計図をプログラミング言語で書けるようにしたもの。内部的にはCloudFormationに変換される

各ツールの概要

Terraform

HashiCorp社が開発するオープンソースのIaCツール。HCL(HashiCorp Configuration Language)で記述。

特徴:

  • マルチクラウド対応(AWS、GCP、Azure、その他多数)
  • 宣言的な記述
  • State管理(tfstate)
  • 豊富なプロバイダーエコシステム
  • Plan/Applyのワークフロー(変更の事前確認が可能)

CloudFormation

AWS純正のIaCサービス。JSON/YAMLで記述。

特徴:

  • AWS完全対応(新サービスに最も早く対応)
  • 追加コストなし(AWS利用料のみ)
  • スタック管理(リソースのグループ化)
  • ドリフト検出(手動変更の検知)
  • Change Sets(変更の事前確認)

Pulumi

プログラミング言語でインフラを定義できるIaCツール。

特徴:

  • TypeScript、Python、Go、C#、Java等で記述可能
  • マルチクラウド対応
  • 条件分岐やループなどプログラミングの機能をフル活用
  • テストフレームワークとの統合
  • Pulumi AI(自然言語からインフラコードを生成)

AWS CDK(Cloud Development Kit)

AWSのインフラをプログラミング言語で定義し、CloudFormationテンプレートに変換するツール。

特徴:

  • TypeScript、Python、Java、C#、Go対応
  • 高レベルのコンストラクト(L2/L3)で簡潔な記述
  • CloudFormationの全機能を利用可能
  • AWS公式が提供するベストプラクティスパターン
  • cdk diffで変更の事前確認

比較表

基本機能

項目TerraformCloudFormationPulumiCDK
記述言語HCLJSON/YAMLTypeScript, Python等TypeScript, Python等
マルチクラウド対応AWSのみ対応AWSのみ
State管理tfstate(S3等で管理)AWSが管理Pulumi Cloud/自己管理AWSが管理(CFn)
プレビューterraform planChange Setspulumi previewcdk diff
ドリフト検出terraform planドリフト検出機能pulumi refreshドリフト検出(CFn)
モジュール化ModulesNested StacksコンポーネントConstructs
学習コスト中(HCL習得)低〜中(YAML)低(既知の言語)低(既知の言語)
エコシステム最大級AWS公式成長中AWS公式

料金比較

ツール無料枠有料プラン
Terraform(CLI)無料(OSS)---
Terraform Cloud500リソースまで無料$0.00014/リソース/時間〜
CloudFormation完全無料---
Pulumi(CLI)無料(OSS)---
Pulumi Cloud個人無料$1.10/リソース/月〜
CDK完全無料---

コード量の比較(VPC + サブネット + EC2の作成例)

ツール概算行数特徴
Terraform40-60行HCLで明示的に記述
CloudFormation80-120行YAML/JSONで冗長になりがち
Pulumi30-50行プログラミング言語の簡潔さ
CDK20-40行L2コンストラクトで大幅に短縮

コード例の比較

S3バケットの作成

Terraform:

resource "aws_s3_bucket" "my_bucket" {
  bucket = "my-unique-bucket-name"
}

resource "aws_s3_bucket_versioning" "my_bucket" {
  bucket = aws_s3_bucket.my_bucket.id
  versioning_configuration {
    status = "Enabled"
  }
}

CloudFormation:

Resources:
  MyBucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: my-unique-bucket-name
      VersioningConfiguration:
        Status: Enabled

Pulumi (TypeScript):

import * as aws from '@pulumi/aws'

const bucket = new aws.s3.Bucket('my-bucket', {
  bucket: 'my-unique-bucket-name',
  versioning: {
    enabled: true,
  },
})

CDK (TypeScript):

import * as s3 from 'aws-cdk-lib/aws-s3'

const bucket = new s3.Bucket(this, 'MyBucket', {
  bucketName: 'my-unique-bucket-name',
  versioned: true,
})

判断フローチャート

[IaCツール選定]
    |
    v
[マルチクラウドが必要?]
    |
    +-- はい --> [チームのプログラミングスキルが高い?]
    |               |
    |               +-- はい --> Pulumi
    |               |           (TypeScript/Python等で記述)
    |               |
    |               +-- いいえ --> Terraform
    |                              (HCLは比較的学びやすい)
    |
    +-- いいえ(AWSのみ)
         |
         v
    [チームのプログラミングスキルが高い?]
         |
         +-- はい --> [既存のCloudFormation資産がある?]
         |               |
         |               +-- はい --> CDK(CloudFormationと共存可能)
         |               |
         |               +-- いいえ --> CDK or Pulumi
         |
         +-- いいえ
              |
              v
         [シンプルな構成?]
              |
              +-- はい --> CloudFormation(追加ツール不要)
              |
              +-- いいえ --> Terraform(モジュールエコシステム活用)

State管理の重要性

Stateとは

IaCツールが管理するインフラの「現在の状態」を記録したファイル。このファイルをもとに、コードの変更内容と実際のインフラの差分を計算する。

Terraformのtfstate

Terraformではterraform.tfstateファイルにState情報が保存される。

チーム開発でのState管理:

方式説明推奨度
ローカルファイルデフォルト。チーム開発には不向き個人開発のみ
S3 + DynamoDBS3にState保存、DynamoDBでロック管理推奨
Terraform CloudHashiCorp提供のマネージドサービス推奨
その他(GCS、Azure Blob等)各クラウドのストレージを利用

S3バックエンドの設定例:

terraform {
  backend "s3" {
    bucket         = "my-terraform-state"
    key            = "prod/terraform.tfstate"
    region         = "ap-northeast-1"
    dynamodb_table = "terraform-lock"
    encrypt        = true
  }
}

CloudFormation/CDKのState管理

CloudFormationはAWSがStateを管理するため、開発者がState管理を気にする必要がない。これはCloudFormation/CDKの大きなメリットの一つ。


ユースケース別の推奨

スタートアップ(AWSのみ)

推奨: CDK

  • TypeScriptで直感的に記述
  • L2コンストラクトで簡潔
  • AWS公式のベストプラクティスが組み込まれている

マルチクラウド環境

推奨: Terraform

  • AWS、GCP、Azure全てに対応
  • プロバイダーエコシステムが最も充実
  • 業界標準として最も普及

エンタープライズ(AWS)

推奨: CloudFormation or CDK

  • AWS公式サポート
  • 追加コストなし
  • AWSサービスへの対応が最速

SaaS/PaaS管理も含む

推奨: Terraform or Pulumi

  • Datadog、PagerDuty、GitHub等のSaaSリソースも管理可能
  • 例: TerraformでAWSインフラ + Datadogモニタリング + GitHub設定を一元管理

チーム規模別の運用パターン

1-3人チーム

ツール推奨構成
TerraformローカルState or Terraform Cloud(Free)
CDKデフォルト(CloudFormation管理)

5-20人チーム

ツール推奨構成
TerraformS3 + DynamoDB State、モジュール化、CI/CDパイプライン
CDKスタック分割、CI/CDパイプライン、cdk pipelines

50人以上

ツール推奨構成
TerraformTerraform Cloud/Enterprise、Sentinel(ポリシー)、ワークスペース分割
CDKマルチアカウント、cdk pipelines、Service Catalog

実際の企業での採用事例

Terraform

  • Uber: マルチクラウド環境のインフラ管理にTerraformを採用
  • Slack: AWSインフラの管理にTerraformを使用
  • 多くのSaaS企業がTerraformをデファクトスタンダードとして採用

CloudFormation

  • Amazon自身: AWS内部のサービスもCloudFormationで管理
  • エンタープライズのAWS環境で広く使用

Pulumi

  • Snowflake: クラウドインフラの管理にPulumiを採用
  • Mercedes-Benz: 自動車関連のクラウドインフラ管理

CDK

  • AWS内部チーム: 多くのAWSサービスチームがCDKを利用
  • Liberty Mutual: 保険業界のクラウドインフラにCDKを採用

IaCのベストプラクティス

プラクティス説明
小さな変更を頻繁に大きな変更は事故のリスクが高い
コードレビュー必須planの結果もレビューする
環境を分離dev/staging/prodでState/スタックを分ける
モジュール化再利用可能な単位に分割
シークレット管理コードにハードコードしない
CI/CDパイプライン手動適用を避ける
ドリフト検出手動変更を定期的に検知
タグ付け全リソースにコスト管理用のタグを付与

移行パスの考え方

CloudFormation → CDK

CDKはCloudFormationに変換されるため、段階的な移行が可能。既存のCloudFormationテンプレートをCDKにインポートすることもできる。

CloudFormation → Terraform

cf2tfなどのツールで変換可能だが、完全な自動変換は難しい。段階的に新規リソースからTerraformで管理し、既存リソースはterraform importで取り込む方法が現実的。

Terraform → Pulumi

Pulumiはpulumi importpulumi convertでTerraformからの移行をサポートしている。HCLからPulumiコードへの変換ツールも提供されている。


まとめ

ツールこんな時に使う一言で言うと
Terraformマルチクラウド、業界標準が欲しいIaCのデファクトスタンダード
CloudFormationAWSのみ、シンプルに始めたいAWS純正で安心
Pulumiプログラミング言語で書きたい開発者フレンドリーなIaC
CDKAWSのみ、プログラミング言語で書きたいCloudFormationの進化版

2025年現在、TerraformがIaC全体のデファクトスタンダードであり、CDKがAWS限定のプロジェクトで急速にシェアを拡大している。チームのスキルセットとプロジェクトの要件に合わせて選択しよう。


参考リンク