LESSON 30分

ストーリー

佐藤先輩
CI/CDパイプラインは順調に動き出した。次はインフラの自動化だ

木村先輩が、AWS管理コンソールの画面を見せた。

佐藤先輩
前回、手動でEC2やVPCを構築しただろう?あれをもう一度、別の環境で同じように作れと言われたらどうする?
あなた
えっと…手順書を見ながらコンソールで同じ操作を…
佐藤先輩
何十回もクリックして、設定を一つずつ入力して?漏れがあったら?タイポしたら?
あなた
…大変ですね
佐藤先輩
だからインフラもコードで管理する。Infrastructure as Code — IaCだ。そのための道具がTerraformだ

IaC(Infrastructure as Code)とは

定義

IaCとは、サーバー、ネットワーク、データベースなどのインフラストラクチャをコード(テキストファイル)で定義し、自動的に構築・管理するプラクティスです。

手動管理 vs IaC

graph TD
    subgraph MANUAL ["手動管理(コンソール操作)"]
        M1["開発者"] --> M2["AWS Console"]
        M2 --> M3["クリック x 50回"]
        M3 --> M4["インフラ完成"]
        M3 -.- M5["手順書に記録<br/>(でも更新忘れがち)"]
    end

    subgraph IAC ["IaC(コードで管理)"]
        I1["開発者"] --> I2["main.tf を記述"]
        I2 --> I3["terraform apply"]
        I3 --> I4["インフラ完成"]
        I2 -.- I5["Git で管理<br/>レビュー可能"]
        I4 -.- I6["完全に再現可能<br/>差分も明確"]
    end

    classDef bad fill:#f8d7da,stroke:#dc3545,color:#000
    classDef good fill:#d4edda,stroke:#28a745,color:#000
    class M5 bad
    class I5,I6 good
観点手動管理IaC
再現性低い(人による差異)高い(コードが真実)
速度遅い(手作業)速い(自動実行)
変更追跡困難(手順書頼み)Git で完全管理
レビュー不可能PRでレビュー可能
テスト本番でしか確認できないplan で事前確認
スケール手作業の限界100環境でも同じコスト

IaCの主要ツール

宣言的 vs 命令的

宣言的アプローチ(Terraform, CloudFormation)

「VPCがあること。サブネットが2つあること」
→ ツールが現状との差分を計算して適用

命令的アプローチ(Ansible, シェルスクリプト)

「1. VPCを作る  2. サブネットを作る  3. ルートテーブルを作る」
→ 手順を1つずつ実行

主要ツール比較

ツール提供元アプローチ対象クラウド
TerraformHashiCorp宣言的マルチクラウド
AWS CloudFormationAWS宣言的AWS のみ
AWS CDKAWS命令的(プログラム言語)AWS のみ
PulumiPulumi命令的(プログラム言語)マルチクラウド
AnsibleRed Hat命令的マルチクラウド

Terraformとは

HashiCorp が開発したオープンソースのIaCツールです。

Terraformの特徴

特徴説明
マルチクラウドAWS, GCP, Azure, Cloudflare等に対応
宣言的「あるべき状態」を記述すれば差分を自動計算
HCL人間が読みやすい独自の設定言語
State管理現在のインフラ状態をStateファイルで追跡
Plan適用前に変更内容をプレビューできる
モジュール再利用可能なインフラコンポーネント

Terraformのワークフロー

graph LR
    W["1. Write<br/>.tf ファイルを記述"] --> P["2. Plan<br/>変更プレビューを確認"]
    P --> A["3. Apply<br/>実行・適用"]

    classDef write fill:#cce5ff,stroke:#004085,color:#000
    classDef plan fill:#fff3cd,stroke:#856404,color:#000
    classDef apply fill:#d4edda,stroke:#28a745,color:#000
    class W write
    class P plan
    class A apply
  • main.tf: resource "aws_instance" {...}
  • terraform plan: + aws_instance, + aws_vpc, ~ aws_security_group
  • terraform apply: Creating... aws_instance.web: Created

Terraformのインストール

macOS(Homebrew)

brew tap hashicorp/tap
brew install hashicorp/tap/terraform

# バージョン確認
terraform version

Linux

# HashiCorp GPGキーの追加
wget -O- https://apt.releases.hashicorp.com/gpg | \
  sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg

# リポジトリの追加
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] \
  https://apt.releases.hashicorp.com $(lsb_release -cs) main" | \
  sudo tee /etc/apt/sources.list.d/hashicorp.list

# インストール
sudo apt update && sudo apt install terraform

# バージョン確認
terraform version

バージョン管理(tfenv)

# tfenv のインストール
git clone https://github.com/tfutils/tfenv.git ~/.tfenv
echo 'export PATH="$HOME/.tfenv/bin:$PATH"' >> ~/.bashrc

# 特定バージョンのインストール
tfenv install 1.7.0
tfenv use 1.7.0

最初のTerraformプロジェクト

ディレクトリ構造

my-infrastructure/
├── main.tf           ← メインの設定ファイル
├── variables.tf      ← 変数の定義
├── outputs.tf        ← 出力の定義
├── providers.tf      ← プロバイダの設定
├── terraform.tfvars  ← 変数の値(Git管理外の場合あり)
└── .terraform/       ← プロバイダのキャッシュ(Git管理外)

Hello Terraform

# main.tf
terraform {
  required_version = ">= 1.7.0"

  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
}

provider "aws" {
  region = "ap-northeast-1"
}

# S3バケットを1つ作成する
resource "aws_s3_bucket" "hello" {
  bucket = "my-first-terraform-bucket-2024"

  tags = {
    Name        = "HelloTerraform"
    Environment = "learning"
    ManagedBy   = "terraform"
  }
}

実行

# 1. 初期化(プロバイダのダウンロード)
terraform init

# 2. 変更のプレビュー
terraform plan

# 3. 変更の適用
terraform apply

# 4. リソースの削除(学習後のクリーンアップ)
terraform destroy

まとめ

ポイント内容
IaCとはインフラをコードで定義・管理するプラクティス
Terraformマルチクラウド対応の宣言的IaCツール
ワークフローWrite → Plan → Apply の3ステップ
メリット再現性、変更追跡、レビュー可能、自動化

チェックリスト

  • IaCの概念と手動管理の問題点を説明できる
  • Terraformの特徴と位置づけを理解した
  • Terraformの基本ワークフロー(init → plan → apply)を把握した
  • 最初のTerraformファイルの構造を理解した

次のステップへ

次のセクションでは、TerraformのHCL構文を本格的に学びます。 リソース定義、データソース、プロバイダの設定方法をマスターしましょう。


推定読了時間: 30分