Terraform

初級 | 8分 で読める | 2026.04.24

公式ドキュメント

概要

Terraform は、インフラ構成を HCL で記述し、クラウドリソースを宣言的に管理する IaC ツールです。このチートシートでは、CLI、リソース定義、変数、State、バックエンド、モジュール、ワークスペースの基本を整理します。

最初に覚える最小セット

操作コマンド
初期化terraform init
整形terraform fmt
検証terraform validate
差分確認terraform plan
適用terraform apply
State 一覧terraform state list
ワークスペース確認terraform workspace show

Terraform は apply より先に plan の内容を読み、作成・変更・削除されるリソースを確認しますdestroyapply -auto-approve は、本番では原則としてレビュー済みの手順でのみ使います。

基本コマンド

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

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

注意: terraform destroyterraform apply -auto-approve は確認を省いて大きな変更を実行できます。実行対象の workspace、backend、plan を確認してください。

リソース定義

構文説明
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()

まとめ

Terraform では、initfmtvalidateplanapply の順番を守ることが基本です。State はインフラの実態と Terraform の対応関係を持つ重要ファイルなので、ローカル管理ではなくリモート backend とロックを使う運用を優先します。

destroy、State 操作、workspace 切り替えは影響が大きいため、対象環境と plan を確認してから実行してください。

参考リソース

関連記事

← 一覧に戻る
PR
PR
PR
PR