IaC(Infrastructure as Code)選定調査¶
📁 docs/dev-environment/artifact/20260327_IaC選定調査.md
作成日: 2026-03-27 issue: #214 IaCの検討 目的: MyLab環境に適したIaCツールを選定し、実際に使ってみる
1. IaCとは¶
Infrastructure as Code(IaC) は、インフラの構成(サーバー、ネットワーク、DNS、Dockerコンテナなど)をコードとして記述・管理するアプローチ。
IaCの利点¶
| 利点 | 説明 |
|---|---|
| 再現性 | 同じコードから同じ環境を何度でも作れる |
| バージョン管理 | Gitで変更履歴を追える |
| 差分確認 | 変更前に「何が変わるか」を確認できる(plan) |
| ドキュメント代わり | コード自体がインフラの設計書になる |
| 自動化 | CI/CDと組み合わせて自動デプロイ可能 |
2. 主要IaCツール比較¶
2.1 ツール概要¶
| ツール | 種別 | 言語 | 対象 |
|---|---|---|---|
| Terraform | 宣言型 | HCL(独自DSL) | クラウド全般(800+プロバイダー) |
| Pulumi | 宣言型 | Python/TypeScript/Go/etc | クラウド全般 |
| Ansible | 手続き型 | YAML | サーバー設定・ミドルウェア |
| Docker Compose | 宣言型 | YAML | コンテナ定義(すでに使用中) |
| AWS CDK | 宣言型 | TypeScript/Python/etc | AWSのみ |
2.2 Terraform vs Pulumi 詳細比較¶
| 観点 | Terraform | Pulumi |
|---|---|---|
| 記述言語 | HCL(独自DSL) | Python/TS/Go/C# |
| 学習コスト | 低(HCLはシンプル) | 低(既知言語で書ける) |
| エコシステム | 最大(公式プロバイダー多数) | やや少ない |
| 状態管理 | .tfstate(ローカル/リモート) | PulumiCloudまたはローカル |
| Cloudflare対応 | ◎ 公式プロバイダーあり | ◎ プロバイダーあり |
| Docker対応 | ◎ プロバイダーあり | ◎ プロバイダーあり |
| Windows対応 | ◎ バイナリ配布 | ◎ バイナリ配布 |
| ループ・条件分岐 | △(HCLで制限あり) | ◎(プログラミング言語の機能を使える) |
| コミュニティ | 最大 | 成長中 |
| 価格 | OSS無料 / Terraform Cloud有料 | OSS無料 / Pulumi Cloud有料 |
2.3 MyLab向け選定理由¶
→ Terraform を推奨
理由: 1. 業界標準 — AWS/GCP/Cloudflare等で広く使われており、習得が仕事に直結 2. Cloudflare公式プロバイダー — MyLabで使用中のCloudflare Tunnelの設定をコード化できる 3. シンプルな文法 — HCLはYAMLに近く、読み書きしやすい 4. 豊富なドキュメント — 日本語情報も多い 5. Docker Composeとの相性 — Docker Composeはすでに使っているため、Terraform for Dockerで上位のオーケストレーションを試せる
3. MyLabのインフラ現状¶
現在のインフラ構成¶
MyLab インフラ
├── ローカル(Windows 11)
│ ├── Docker Desktop
│ │ ├── n8n(ポート 5678) ← docker-compose管理済み
│ │ └── image-gallery(ポート 8001) ← docker-compose管理済み
│ ├── SD WebUI Forge(ポート 7860) ← 手動起動
│ └── WSL2 Ubuntu(SSH port 2222) ← 手動管理
│
├── Cloudflare
│ ├── Cloudflare Tunnel ← 手動設定
│ ├── DNS レコード ← 手動管理
│ └── Named Tunnel(#287 issue)
│
└── カラフルボックス(VPS)
└── koi-navi.com(WordPress) ← 手動管理
IaC化の候補¶
| 対象 | 難易度 | 優先度 | メリット |
|---|---|---|---|
| Cloudflare DNS レコード | Easy | ★★★ | 再現性・履歴管理 |
| Cloudflare Tunnel 設定 | Medium | ★★★ | 設定の自動化・バージョン管理 |
| Docker コンテナ(Terraform) | Medium | ★★ | docker-compose の代替学習 |
| カラフルボックス DNS | Easy | ★★ | ゾーン設定の記録 |
4. Terraform 基礎¶
4.1 インストール(Windows)¶
# Chocolateyを使う場合
choco install terraform
# または公式サイトからバイナリをダウンロード
# https://developer.hashicorp.com/terraform/downloads
# → terraform.exe を PATH に追加
4.2 基本ワークフロー¶
# 1. 初期化(プロバイダーのダウンロード)
terraform init
# 2. 変更の確認(ドライラン)
terraform plan
# 3. 適用(実際に変更を加える)
terraform apply
# 4. 削除(リソースを全削除)
terraform destroy
4.3 状態ファイル(.tfstate)¶
Terraform は適用した状態を .tfstate ファイルに記録する。
projects/iac/
├── main.tf ← リソース定義
├── variables.tf ← 変数定義
├── outputs.tf ← 出力値
├── terraform.tfstate ← 状態ファイル(Gitに含めない!)
└── .terraform/ ← プロバイダーキャッシュ(Gitに含めない)
重要: .tfstate には認証情報が含まれる場合があるため .gitignore に追加すること。
4.4 主要な概念¶
# プロバイダー(操作対象のクラウドサービス)
provider "cloudflare" {
api_token = var.cloudflare_api_token
}
# リソース(作成・管理するリソース)
resource "cloudflare_dns_record" "example" {
zone_id = var.cloudflare_zone_id
name = "www"
type = "A"
value = "1.2.3.4"
ttl = 1 # 1 = 自動
}
# 変数(外部から注入できる値)
variable "cloudflare_api_token" {
type = string
sensitive = true # 表示をマスク
}
# 出力(apply後に表示する値)
output "record_hostname" {
value = cloudflare_dns_record.example.hostname
}
5. Cloudflare Terraform プロバイダー¶
5.1 APIトークンの作成¶
- Cloudflare Dashboard → APIトークン
- 「カスタムトークン作成」
- 必要な権限を付与:
Zone:DNS:Edit(DNSレコード管理)Account:Cloudflare Tunnel:Edit(Tunnel管理)Zone:Zone:Read(Zone ID取得)
5.2 Zone IDの確認¶
Cloudflare Dashboard → ドメイン選択 → 右サイドバーに表示されている「ゾーン ID」
5.3 プロバイダー設定例¶
terraform {
required_providers {
cloudflare = {
source = "cloudflare/cloudflare"
version = "~> 4.0"
}
}
}
provider "cloudflare" {
api_token = var.cloudflare_api_token
}