ストーリー
木村先輩が、AWS管理コンソールの画面を見せた。
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つずつ実行
主要ツール比較
| ツール | 提供元 | アプローチ | 対象クラウド |
|---|---|---|---|
| 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のワークフロー
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_groupterraform 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分