Terraform

初級 | 8分 で読める | 2026.04.24

公式ドキュメント

この記事の要点

terraform planで変更内容を確認、terraform applyで適用
.tfstateファイルで現実のインフラ状態を追跡
変数モジュールで設定を再利用可能に構造化

基本コマンド

コマンド説明
terraform initプロバイダダウンロード、バックエンド初期化
terraform plan変更内容のプレビュー
terraform applyリソース作成・更新
terraform apply -auto-approve確認なしで適用
terraform destroyすべてのリソースを削除
terraform validate設定ファイルの構文チェック
terraform fmtコードフォーマット

ポイント: terraform planは実際には何も変更せず、予定される変更だけを表示します。本番環境では必ず plan を確認してから apply を実行します。

リソース定義

構文説明
resource "aws_instance" "web"リソースタイプと名前
ami = "ami-123456"引数の指定
tags = { Name = "web" }タグの指定
count = 3同じリソースを複数作成
for_each = var.usersマップやセットで複数作成
resource "aws_instance" "web" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t3.micro"

  tags = {
    Name = "web-server"
    Env  = "production"
  }
}

実践メモ: countはインデックスベース、for_eachはキーベースで複数リソースを作成します。削除時の影響を考えるとfor_each のほうが安全です。

変数

構文説明
variable "region" { ... }変数定義
default = "us-east-1"デフォルト値
type = string型指定(string, number, bool, list, map)
var.region変数参照
description = "AWS region"説明文
variable "instance_count" {
  description = "Number of instances"
  type        = number
  default     = 2
}

resource "aws_instance" "app" {
  count         = var.instance_count
  ami           = "ami-123456"
  instance_type = "t3.micro"
}

ポイント: typeを指定すると入力値の検証が自動で行われます。複雑な構造はobject()list(object())で定義できます。

出力値

構文説明
output "instance_ip" { ... }出力定義
value = aws_instance.web.public_ip出力する値
description = "Public IP"説明文
sensitive = true機密情報のマーク
output "web_public_ip" {
  description = "Public IP of web server"
  value       = aws_instance.web.public_ip
}

注意: sensitive = trueを付けても State ファイルには平文で記録されます。機密情報は環境変数や Secrets Manager で管理してください。

データソース

構文説明
data "aws_ami" "latest"既存リソースの参照
data.aws_ami.latest.idデータソースの値を参照
filter { ... }検索条件の指定
data "aws_ami" "ubuntu" {
  most_recent = true
  owners      = ["099720109477"]

  filter {
    name   = "name"
    values = ["ubuntu/images/hvm-ssd/ubuntu-*-22.04-amd64-server-*"]
  }
}

resource "aws_instance" "web" {
  ami = data.aws_ami.ubuntu.id
}

実践メモ: dataブロックで既存のインフラ情報を取得できます。AMI の最新版を自動で取得する場合などに便利です。

State 管理

コマンド説明
terraform state listState 内のリソース一覧
terraform state show <resource>リソースの詳細表示
terraform state mv <src> <dst>State 内でリソース移動
terraform state rm <resource>State からリソース削除
terraform state pullState をローカルに取得
terraform refresh現実のインフラと State を同期

注意: terraform state rmは State から削除するだけで、実際のリソースは削除されません。手動で削除するか、再度 import する必要があります。

バックエンド設定

バックエンド用途
localローカルファイル(デフォルト)
s3AWS S3 + DynamoDB(ロック)
azurermAzure Blob Storage
gcsGoogle Cloud Storage
remoteTerraform Cloud
terraform {
  backend "s3" {
    bucket         = "my-terraform-state"
    key            = "prod/terraform.tfstate"
    region         = "us-east-1"
    dynamodb_table = "terraform-lock"
    encrypt        = true
  }
}

ポイント: S3 バックエンドに DynamoDB テーブルを組み合わせると、複数人が同時に apply するのを防ぐロック機能が使えます。

モジュール

構文説明
module "vpc" { source = "./modules/vpc" }ローカルモジュール
module "vpc" { source = "git::..." }Git リポジトリから
module "vpc" { source = "terraform-aws-modules/vpc/aws" }Terraform Registry から
version = "~> 3.0"モジュールのバージョン指定
module "web_server" {
  source = "./modules/ec2"

  instance_type = "t3.small"
  ami           = "ami-123456"
  subnet_id     = module.vpc.public_subnet_id
}

output "web_ip" {
  value = module.web_server.public_ip
}

実践メモ: モジュールは再利用可能な設定のまとまりです。環境ごとに異なるパラメータを渡して、同じ構造のインフラを複数環境にデプロイできます。

ワークスペース

コマンド説明
terraform workspace listワークスペース一覧
terraform workspace new dev新規ワークスペース作成
terraform workspace select devワークスペース切り替え
terraform workspace show現在のワークスペース表示

ワークスペース別設定の例:

resource "aws_instance" "web" {
  ami           = "ami-123456"
  instance_type = terraform.workspace == "prod" ? "t3.large" : "t3.micro"

  tags = {
    Environment = terraform.workspace
  }
}

ポイント: ワークスペースは同じコードで複数の環境(dev/stg/prod)を管理できます。State ファイルがワークスペースごとに分離されます。

よく使う関数

関数説明
lookup(map, key, default)マップから値を取得-
join(",", list)リストを文字列に結合-
split(",", str)文字列をリストに分割-
file("path")ファイル内容を読み込み-
jsonencode(obj)オブジェクトを JSON に変換-
format("%s-%s", "web", "01")文字列フォーマットformat("%s-%s", var.project, terraform.workspace)
timestamp()現在のタイムスタンプDate = timestamp()

参考リソース

関連記事

この技術を体系的に学びたいですか?

未来学では東証プライム上場企業のITエンジニアが24時間サポート。月額24,800円から、退会金0円のオンラインIT塾です。

メールで無料相談する
← 一覧に戻る