個人的な備忘録：CloudFormation と Terraform の設計思想と機能の違いを体系的にまとめてみた

## はじめに
クラウド環境の普及に伴い、インフラ管理の自動化が求められるようになりました。

**その中で、AWSのインフラをコード化するツールとして CloudFormation と Terraform は広く利用されています。**

:::note info
***どちらのツールもインフラの構築や管理を効率化しますが、設計思想や機能に違いがあります。***
:::

本記事では、これらのツールの違いを整理し、それぞれのメリット・デメリットを比較することで、どのような場面でどちらを選ぶべきかを考えます。

## 書こうと思ったきっかけ
私自身、AWSを利用する中で、インフラ構築を手作業で行うことの煩雑さを痛感しました。

変更管理の難しさや環境ごとの差異が発生するリスクを減らすため、CloudFormationやTerraformを導入することを検討しましたが、それぞれの違いが分かりづらく、どちらを選べばよいか悩んだ経験があります。

同じように「**どちらを選べばいいのか？**」と迷う方がいるのではないかと思い、CloudFormationとTerraformの違いを整理し、分かりやすく解説することにしました。

## いろいろな観点からまとめてみた

### 提供元と対応クラウド

| 項目           | CloudFormation | Terraform            |
|--------------|---------------|----------------------|
| 提供元       | AWS公式        | HashiCorp           |
| 対応クラウド | AWS専用        | AWS, Azure, GCP, OCI などマルチクラウド対応 |

- **CloudFormation** は **AWS専用** に最適化されており、AWSの最新機能に素早く対応。
- **Terraform** は **マルチクラウド対応** で、AWS以外のインフラも統一管理できる。

### 言語と記述方式

| 項目                   | CloudFormation                  | Terraform                          |
|----------------------|--------------------------------|----------------------------------|
| 記述言語              | YAML / JSON                    | HCL（HashiCorp Configuration Language） |
| 宣言的 / 手続き的     | 宣言的（何を作るかを書く）       | 宣言的（何を作るかを書く）        |
| コードの可読性         | YAML/JSONで読みやすいが冗長    | HCLは柔軟でシンプル               |

- **CloudFormation** は **YAML/JSON** を使用し、AWS公式のサポートがある。
- **Terraform** の **HCL（HashiCorp Configuration Language）** は **可読性と柔軟性が高い**。

### ステート管理

| 項目           | CloudFormation           | Terraform                          |
|--------------|------------------------|----------------------------------|
| ステート管理  | AWSが管理               | ユーザーが管理（S3やTerraform Cloudで管理） |

- **CloudFormation** は **AWSがステートを管理** し、ユーザーはステートファイルを気にする必要がない。
- **Terraform** は **.tfstate ファイルを自分で管理** するため、適切な管理が必要（例：**S3 + DynamoDBでロック管理**）。

### モジュール化

| 項目           | CloudFormation                          | Terraform                          |
|--------------|-------------------------------------|----------------------------------|
| 再利用性      | 一部あり（Nested Stacks, Macros）   | モジュール機能が強力               |
| 公式モジュール | AWS-SAM や CDKで強化                | Terraform Registryに豊富なモジュール |

- **CloudFormation** は **Nested Stacks** で分割可能だが、再利用性はやや低い。
- **Terraform** は **モジュール化が強力** で、再利用しやすい。

### 実行スピードとデプロイ方法

| 項目           | CloudFormation        | Terraform                     |
|--------------|---------------------|-----------------------------|
| 実行スピード  | 遅め                | 速い                        |
| 適用単位      | スタック単位         | リソース単位で適用可能       |
| プレビュー    | Change Sets         | Plan（事前確認）あり         |

- **CloudFormation** は **スタック単位** の適用で **変更が遅くなる** ことがある。
- **Terraform** は **差分適用が速い**（例：特定のリソースのみ `terraform apply` できる）。

### コミュニティとエコシステム

| 項目         | CloudFormation       | Terraform                          |
|------------|------------------|----------------------------------|
| エコシステム | AWS公式のみ       | Terraform Registry で拡張性あり |
| コミュニティ | AWS公式が強い     | オープンソースのため広い        |

- **Terraform** には **豊富な公式・非公式モジュール** があり、**カスタムプロバイダー** も作成可能。

### どちらを選ぶべき？

| こんな場合は…           | CloudFormation がオススメ | Terraform がオススメ |
|----------------------|--------------------|----------------|
| AWSのみ使う         | ✅ 最適            | ❌ Terraform不要 |
| マルチクラウド管理   | ❌ AWS専用         | ✅ 必須          |
| AWS公式サポート重視  | ✅ AWSサポートあり | ❌ HashiCorp依存 |
| カスタムプロバイダーを使う | ❌ AWS外は苦手      | ✅ 柔軟に対応     |
| シンプルな構成      | ✅ 簡単に管理可能  | ✅ 柔軟に拡張可能 |

## まとめ

**Terraform** はより汎用的で強力なツールですが、**AWSに専念する場合は CloudFormation** の方が公式のサポートが充実しており、運用の手間が少なくなります。

- **AWSに特化するなら CloudFormation**
  - 公式サポートあり
  - AWS最新機能への対応が早い

- **マルチクラウドや拡張性を重視するなら Terraform**
  - 柔軟で速い
  - エコシステムが広い

今後もこのような自分向けの備忘録をまとめていくので、温かく見守っていただけると嬉しいです。