Skip to content

Terraformとは

🏗️ はじめに:インフラガイド

Section titled “🏗️ はじめに:インフラガイド”

Terraformは、HashiCorp社が開発した、インフラをコードで管理するツールです。この手法は**IaC (Infrastructure as Code)**と呼ばれ、インフラの構築や変更を、コードを書いて実行することで自動化します。AWSGCPAzureといった主要なクラウドサービスをはじめ、さまざまなインフラプロバイダーに対応しています。

インフラをコード化することには、手作業での作業にはない多くのメリットがあります。

❌ 問題のあるインフラ管理(手作業)

Section titled “❌ 問題のあるインフラ管理(手作業)”

❌ 問題のある手作業でのインフラ構築:

Terminal window
# 問題: 手作業でのインフラ構築
# 1. AWSコンソールにログイン
# 2. EC2インスタンスを作成(設定を手動で入力)
# 3. セキュリティグループを設定(ルールを手動で追加)
# 4. RDSインスタンスを作成(設定を手動で入力)
# 5. ロードバランサーを設定(設定を手動で入力)
# ...
# 問題点:
# 1. 時間がかかる(数時間から数日)
# 2. 人的ミスが発生しやすい(設定の誤り、漏れ)
# 3. 再現性が低い(同じ環境を再構築できない)
# 4. ドキュメント化が困難(設定が散在)
# 5. ロールバックが困難(以前の状態に戻せない)

解決: Terraformによるコード化

main.tf
# 解決: コードとして管理
resource "aws_instance" "web" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
tags = {
Name = "WebServer"
}
}
resource "aws_security_group" "web" {
name = "web-sg"
ingress {
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
}
# メリット:
# 1. 迅速な構築(数分で完了)
# 2. 人的ミスの削減(コードで検証可能)
# 3. 完全な再現性(同じコードで同じ環境を構築)
# 4. 自動的なドキュメント化(コードがドキュメント)
# 5. 簡単なロールバック(Gitで管理)

1. インフラの宣言的記述

# 宣言的: 望む状態を記述するだけ
resource "aws_s3_bucket" "data" {
bucket = "my-data-bucket"
versioning {
enabled = true
}
lifecycle {
prevent_destroy = true
}
}
# Terraformが自動的に:
# - バケットが存在しない場合: 作成
# - バケットが存在する場合: 設定を更新
# - バケットが削除されそうな場合: 防止

2. 依存関係の自動解決

# Terraformが自動的に依存関係を解決
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
}
resource "aws_subnet" "public" {
vpc_id = aws_vpc.main.id # 依存関係を自動的に解決
cidr_block = "10.0.1.0/24"
}
resource "aws_instance" "web" {
subnet_id = aws_subnet.public.id # 依存関係を自動的に解決
}
# Terraformが自動的に実行順序を決定:
# 1. VPCを作成
# 2. Subnetを作成(VPCに依存)
# 3. EC2インスタンスを作成(Subnetに依存)

3. 状態管理による正確性

# Terraformは状態ファイル(.tfstate)で実際のリソースを追跡
# これにより、以下のことが可能:
# 1. 実際のリソースとコードの差分を検出
# 2. コードにないリソースを検出(ドリフト検出)
# 3. 安全な更新(影響範囲の事前確認)
  • 自動化と効率化

    • 手作業でのインフラ構築は時間がかかり、人的ミスも発生しがちです。Terraformを使えば、一度コードを書いてしまえば、何度でも同じ環境を迅速かつ正確に構築できます。
  • 再現性と一貫性

    • 開発環境、ステージング環境、本番環境など、異なる環境間で全く同じ構成を保つことが容易になります。これにより、特定の環境でのみ発生する問題(環境依存バグ)を防ぐことができます。
  • バージョン管理

    • コードとして管理されるため、Gitのようなツールを使って変更履歴を追跡できます。誰が、いつ、どのような変更を加えたかを明確に記録でき、問題が発生した際には以前の状態に簡単に戻すことができます。
  • チームでの共同作業

    • インフラの構成がコードとして共有されるため、チームメンバー全員が現在のインフラ状態を把握しやすくなります。複数人でのインフラ管理がスムーズに進みます。

Terraformは、以下のシンプルな3つのコマンドを基本として動作します。

  • terraform init: Terraformのプロジェクトを初期化するコマンドです。
  • terraform plan: インフラに変更を加える前に、その計画を確認するコマンドです。
  • terraform apply: planで示された計画を実際にインフラに適用するコマンドです。

Terraformは、インフラの状態を管理するために、**状態ファイル(.tfstate)**という重要なファイルを使用します。このファイルには、Terraformが管理している実際のリソースと、その属性が記録されています。チームで作業する際は、Terraform CloudS3などのリモートバックエンドを使用して、この状態ファイルを安全に管理することが一般的です。

Terraformの特徴:

# マルチクラウド対応
provider "aws" {
region = "us-east-1"
}
provider "azurerm" {
features {}
}
# 同じコードで複数のクラウドを管理可能
resource "aws_s3_bucket" "data" {
bucket = "my-bucket"
}
resource "azurerm_storage_account" "data" {
name = "mystorageaccount"
location = "East US"
}

CloudFormationの特徴:

# AWS専用だが、AWSサービスとの統合が深い
Resources:
MyBucket:
Type: AWS::S3::Bucket
Properties:
BucketName: my-bucket
VersioningConfiguration:
Status: Enabled

Ansibleの特徴:

# 設定管理に特化
- name: Install nginx
apt:
name: nginx
state: present

判断基準:

ツール適用範囲マルチクラウド学習コスト推奨度
Terraformインフラプロビジョニング中程度⭐⭐⭐⭐⭐
CloudFormationAWS専用高い⭐⭐⭐
Ansible設定管理中程度⭐⭐⭐⭐

実践的な選択指針:

// Terraformを選ぶべき場合:
// 1. マルチクラウド環境
// 2. インフラのプロビジョニングが主目的
// 3. 宣言的な記述を好む
// 4. 状態管理が重要
// CloudFormationを選ぶべき場合:
// 1. AWS専用環境
// 2. AWSサービスとの深い統合が必要
// 3. AWSのネイティブツールを使いたい
// Ansibleを選ぶべき場合:
// 1. 設定管理が主目的
// 2. 既存のインフラの設定変更
// 3. プロビジョニング後の設定

Terraformの実践的なユースケース

Section titled “Terraformの実践的なユースケース”

ユースケース1: マルチ環境の管理

Section titled “ユースケース1: マルチ環境の管理”
environments/dev/terraform.tfvars
// 環境ごとの変数ファイル
environment = "dev"
instance_type = "t2.micro"
instance_count = 1
// environments/prod/terraform.tfvars
environment = "prod"
instance_type = "t3.large"
instance_count = 3
// main.tf
variable "environment" {
type = string
}
variable "instance_type" {
type = string
}
variable "instance_count" {
type = number
}
resource "aws_instance" "web" {
count = var.instance_count
instance_type = var.instance_type
tags = {
Environment = var.environment
}
}
// 使用例
// terraform apply -var-file=environments/dev/terraform.tfvars

ユースケース2: モジュール化による再利用

Section titled “ユースケース2: モジュール化による再利用”
modules/web-server/main.tf
variable "instance_type" {
type = string
}
variable "environment" {
type = string
}
resource "aws_instance" "web" {
instance_type = var.instance_type
tags = {
Environment = var.environment
}
}
// 使用例
module "dev_web" {
source = "./modules/web-server"
instance_type = "t2.micro"
environment = "dev"
}
module "prod_web" {
source = "./modules/web-server"
instance_type = "t3.large"
environment = "prod"
}

Terraformは、インフラ管理をコード化し、自動化とチームでの共同作業を可能にする強力なツールです。IaCの考え方を理解し、このツールを使いこなすことで、開発者はインフラをより自由に、そして自信を持って扱えるようになるでしょう。

シニアエンジニアとして考慮すべき点:

  1. 状態管理: .tfstateファイルの安全な管理(リモートバックエンドの使用)
  2. モジュール化: 再利用可能なモジュールの作成
  3. 環境分離: 開発、ステージング、本番環境の適切な分離
  4. セキュリティ: 機密情報の適切な管理(Secrets Manager、環境変数)
  5. CI/CD統合: TerraformをCI/CDパイプラインに統合