Terraform

HashiCorp の IaC ツールで、マルチクラウドのインフラをコードで宣言的に管理する

IaCインフラ
「Terraform」の技術書を見る →

Terraform とは

Terraform は、HashiCorp が開発した IaC (Infrastructure as Code) ツールで、AWS、Azure、GCP などマルチクラウドのインフラを HCL (HashiCorp Configuration Language) で宣言的に管理する。

SAM / CloudFormation との比較

両者の差は、状態を誰が持つかという 1 点に集約される。Terraform は自分で状態ファイルを抱え、CloudFormation はサービス側がスタックとして保持する。ここから、権限設計 / 失敗時の巻き戻しの手当て / 対応できるクラウドの範囲が分かれていく。

観点TerraformSAM / CloudFormation
対象マルチクラウドAWS のみ
言語HCLYAML / JSON
状態管理tfstate ファイルCloudFormation が管理
サーバーレス汎用Lambda に特化
ドリフト検出terraform planCloudFormation ドリフト検出

基本的な使い方

記述の単位は、接続先を決める provider と、作りたいものを 1 つずつ宣言する resource の 2 つだ。resource に付けるラベル (下の例の data や users) は設定ファイル内での参照名で、実際に作られるリソースの名前とは別物である。

# main.tf
provider "aws" {
  region = "ap-northeast-1"
}

resource "aws_s3_bucket" "data" {
  bucket = "my-data-bucket"
}

resource "aws_dynamodb_table" "users" {
  name         = "users"
  billing_mode = "PAY_PER_REQUEST"
  hash_key     = "id"

  attribute {
    name = "id"
    type = "S"
  }
}

コマンド

役割分担は明確で、init で必要なプロバイダーを取り込み、plan で宣言と実体の差分を確認し、apply でその差分だけを適用する。plan を読まずに apply する運用は、意図しない再作成を見落とす最短経路になる。

terraform init      # プロバイダーのダウンロード
terraform plan      # 変更内容のプレビュー
terraform apply     # インフラの作成・更新
terraform destroy   # インフラの削除

State (状態管理)

Terraform は terraform.tfstate ファイルに前回の実行結果を記録し、これと設定ファイルの宣言を突き合わせて差分を出す。実体を毎回すべて調べ直すわけではないため、この記録が壊れると差分の計算そのものが狂う。チーム開発では共有ストレージに置き、同時実行を防ぐロックと組み合わせて使う。

terraform {
  backend "s3" {
    bucket         = "my-terraform-state"
    key            = "prod/terraform.tfstate"
    region         = "ap-northeast-1"
    use_lockfile   = true  # S3 上のロックファイルで排他を取る
    encrypt        = true
  }
}

排他の取り方は S3 側の機能に寄せる形へ移っており、2026 年 8 月時点の公式ドキュメントは DynamoDB による方式を非推奨とし、将来のマイナーバージョンでの削除を予告している。移行期は両方を同時に設定できる。ロックと差分計算の詳しい仕組みは terraform-state の項で扱う。

モジュール

共通の構成はモジュールとして切り出して再利用する。外部モジュールを使うときは version を固定するのが要点で、省略すると取得した時点の最新が入り、同じ設定ファイルから別の結果が生まれる。

module "vpc" {
  source  = "terraform-aws-modules/vpc/aws"
  version = "5.0.0"

  name = "my-vpc"
  cidr = "10.0.0.0/16"
  azs  = ["ap-northeast-1a", "ap-northeast-1c"]
}

AWS での使い分け

判断軸は、対象が AWS に収まるか、状態ファイルの管理を自分で引き受けるか、既存の資産がどちらに寄っているかの 3 点になる。

ケース推奨
Lambda + API GatewaySAM (サーバーレスに特化)
VPC + RDS + ECSTerraform (汎用)
マルチクラウドTerraform
AWS のみ、シンプルCloudFormation / SAM

ライセンスと派生

Terraform 本体のライセンスは 2023 年 8 月に変更され、1.6.0 以降は Business Source License 1.1 (BUSL 1.1) が適用される。自社のインフラを管理する通常の利用は制限の対象外で、制限されるのは有償版と競合する形でホスティング / 組み込み提供することだ。公開から 4 年が経った版は Mozilla Public License 2.0 へ切り替わる条項が付いており、ライセンス文に権利者 (Licensor) として記載されているのは 2026 年 8 月時点で IBM である。

この変更を契機に、同じ 2023 年 8 月に派生 (fork) が公開され、OpenTofu として Linux Foundation の管理下で開発が続いている。ライセンスは MPL 2.0 のままで、既存の設定をほぼそのまま使える代替という位置づけだ。2026 年 8 月時点では Terraform が 1.15 系、OpenTofu が 1.12 系にあり、どちらを選ぶかはライセンス条項の可否と、使っているモジュール / プロバイダーの対応状況で判断する。

共有:

この記事は役に立ちましたか?

関連用語

関連する記事