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つずつ実行
主要ツール比較
| ツール | 提供元 | アプローチ | 対象クラウド |
|---|---|---|---|
| Terraform | HashiCorp | 宣言的 | マルチクラウド |
| AWS CloudFormation | AWS | 宣言的 | AWS のみ |
| AWS CDK | AWS | 命令的(プログラム言語) | AWS のみ |
| Pulumi | Pulumi | 命令的(プログラム言語) | マルチクラウド |
| Ansible | Red 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 versionLinux
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分