コンテンツにスキップ

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 に追加
# バージョン確認
terraform version
# Terraform v1.x.x

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トークンの作成

  1. Cloudflare Dashboard → APIトークン
  2. 「カスタムトークン作成」
  3. 必要な権限を付与:
  4. Zone:DNS:Edit(DNSレコード管理)
  5. Account:Cloudflare Tunnel:Edit(Tunnel管理)
  6. 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
}

6. 参考リンク