LESSON 30分

IaCとTerraformの概要

ストーリー

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

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

「前回、手動でEC2やVPCを構築しただろう? あれをもう一度、別の環境で同じように作れと言われたらどうする?」

「えっと......手順書を見ながらコンソールで同じ操作を......」

「何十回もクリックして、設定を一つずつ入力して? 漏れがあったら?タイポしたら?」

「......大変ですね」

「だからインフラもコードで管理する。 Infrastructure as Code -- IaCだ。 そのための道具がTerraformだ」


IaC(Infrastructure as Code)とは

定義

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

手動管理 vs IaC

手動管理(コンソール操作)

開発者 → AWS Console → クリック × 50回 → インフラ完成
                         ↓
                      手順書に記録
                      (でも更新忘れがち)

IaC(コードで管理)

開発者 → main.tf を記述 → terraform apply → インフラ完成
              ↓                                ↓
          Git で管理                     完全に再現可能
          レビュー可能                    差分も明確
観点手動管理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のワークフロー

Terraform基本ワークフロー

  1. Write          2. Plan            3. Apply
  ┌──────┐        ┌──────┐          ┌──────┐
  │.tf    │  →    │変更   │    →    │実行   │
  │ファイル│       │プレビュー│        │・適用  │
  │を記述  │       │を確認  │        │      │
  └──────┘        └──────┘          └──────┘

  main.tf:         terraform plan:    terraform apply:
  resource "aws_   + aws_instance     Creating...
  instance" {...}  + aws_vpc          aws_instance.web: Created
                   ~ aws_security_group

Terraformのインストール

macOS(Homebrew)

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

# バージョン確認
terraform version

Linux

bash
# 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)

bash
# 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

hcl
# 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"
  }
}

実行

bash
# 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分