IaC

Terraform state てらふぉーむ すてーと

Terraformインフラ管理ステートファイルtfstateIaCHashiCorp
Terraform stateについて教えて

簡単に言うとこんな感じ!

Terraformが「今どんなインフラを作ったか」を覚えておくための”メモ帳”だよ!これがないと次に何を変えればいいか分からなくなっちゃうんだ。設計図(コード)と現実のサーバーをつなぐ大切な記録ファイルってこと!


Terraform stateとは

Terraform state(テラフォームステート) とは、Terraformがインフラの現在の状態を記録・管理するためのデータファイル(terraform.tfstate)のことです。Terraformはコードに書かれた「あるべき姿」と、このステートファイルに記録された「今の姿」を比較することで、「何を追加・変更・削除すべきか」を判断します。

たとえば、AWSにEC2インスタンスを1台作るコードを書いて terraform apply を実行すると、作成されたインスタンスのID・IPアドレス・タグなどの詳細情報がステートファイルに書き込まれます。次回 apply を実行したとき、Terraformはこのステートと最新のコードを照合し、差分だけを適用します。ステートがなければ「すでに作ったかどうか」すら判断できないため、重複作成や削除漏れが発生してしまいます。

ステートファイルはデフォルトではローカルの terraform.tfstate というJSONファイルに保存されますが、チームで使う場合はAWS S3やTerraform Cloudなどのリモートバックエンドに保存して共有するのが一般的です。このステートの管理こそが、Terraformを実運用する上で最も重要なポイントの一つです。


Terraform stateの構造と役割

Terraformの動作はステートを中心に回っています。コード・ステート・実際のインフラの三者関係を理解すると全体像が見えやすくなります。

コード(.tf ファイル) 「あるべき姿」を定義 Terraform state 「今の状態」を記録 実インフラ クラウド上の実リソース 差分(Plan)を計算 コード ↔ state を比較 比較 同期

ステートファイルの主な中身

項目内容
versionステートファイルの形式バージョン4
terraform_version使用したTerraformのバージョン1.7.5
resources管理しているリソースの一覧EC2・RDS・VPCなど
instances各リソースの詳細属性インスタンスID・ARNなど
dependenciesリソース間の依存関係セキュリティグループ → EC2 など

ステートに関する主要コマンド

terraform state list          # 管理中リソースの一覧表示
terraform state show <名前>   # 特定リソースの詳細表示
terraform state mv <旧> <新>  # リソース名の変更(コード側変更に追随)
terraform state rm <名前>     # ステートからリソースを除外(実物は消さない)
terraform import <名前> <ID>  # 既存リソースをステートに取り込む

ローカルバックエンド vs リモートバックエンド

個人開発ならローカルでもよいですが、チーム開発ではリモートバックエンドが必須です。

比較項目ローカルバックエンドリモートバックエンド
保存場所ローカルの terraform.tfstateS3・GCS・Terraform Cloud など
チーム共有❌ できない✅ できる
同時実行制御(ロック)❌ なし✅ あり(DynamoDB など)
暗号化❌ 平文保存✅ 暗号化可能
向いているシーン個人・学習用本番・チーム開発

リモートバックエンドの代表的な設定例(AWS S3 + DynamoDB):

terraform {
  backend "s3" {
    bucket         = "my-tfstate-bucket"
    key            = "prod/terraform.tfstate"
    region         = "ap-northeast-1"
    encrypt        = true
    dynamodb_table = "terraform-lock"  # 同時実行ロック用
  }
}

⚠️ ステートファイルの取り扱い注意点

  • Git管理しない:パスワードやAPIキーが平文で含まれる場合があり、.gitignore に必ず追加する
  • 手動編集しない:JSONを直接書き換えると整合性が崩れる。変更は terraform state コマンド経由で行う
  • バックアップ必須:S3のバージョニングを有効にするなど、誤削除に備える

歴史と背景

  • 2014年 — HashiCorpがTerraform v0.1をリリース。当初からステートファイルの概念を導入し、宣言的インフラ管理の基盤とした
  • 2016年 — リモートバックエンドの仕組みが整備され、S3・GCSなどへのステート保存が容易になる
  • 2017年terraform import コマンドが安定化し、既存インフラをTerraform管理に移行しやすくなった
  • 2019年 — Terraform Cloudがリモートステート管理のマネージドサービスとして一般提供開始
  • 2021年 — Terraform v1.0リリース。ステートファイルの互換性維持が正式に約束される
  • 2023年 — HashiCorpがライセンスをBSL(Business Source License)に変更。コミュニティフォークとして OpenTofu が誕生するが、ステートの仕様・形式は互換を維持

ステートのよくあるトラブルと対処法

ステートロック(State Lock)とは

チームで同時に terraform apply を実行すると、ステートファイルが壊れる危険があります。これを防ぐのがステートロックで、一人が操作中は他の人がapplyできないよう排他制御をかけます。

Error: Error acquiring the state lock
  Lock Info:
    ID: a1b2c3d4-...
    Operation: OperationTypeApply
    Who: user@example.com

このエラーが出たら、前の操作が正常終了していない可能性があります。terraform force-unlock <ロックID> で解除できますが、本当に誰も操作していないことを確認してから実行しましょう。

ステートドリフト(State Drift)とは

コンソールや他のツールでインフラを変更すると、ステートと実態がズレます(これをドリフトと呼びます)。terraform plan で差分が出るので定期的に確認を。terraform refresh(または plan -refresh-only)でステートを実態に合わせて更新できます。

状態コードステート実インフラ対処
正常✅ 定義あり✅ 記録あり✅ 存在
ドリフト✅ 定義あり✅ 記録あり(古い)⚠️ 変更済みterraform refresh
孤立リソース❌ 定義なし❌ 記録なし✅ 存在terraform import
ゴーストリソース❌ 定義なし✅ 記録あり❌ 存在しないterraform state rm

関連用語

  • Terraform — HashiCorpが開発したIaCツールの本体。コードでインフラを定義・管理する
  • IaC(Infrastructure as Code) — インフラ構成をコードで管理するアプローチ全般
  • terraform apply — コードをもとに実際のインフラを作成・変更するコマンド
  • terraform plan — 実行前に変更内容をプレビューするコマンド。ステートと差分を比較する
  • リモートバックエンド — ステートファイルをクラウドストレージなどに保存する仕組み
  • Terraform Cloud — HashiCorpが提供するTerraformのマネージドサービス。ステート管理機能を含む
  • OpenTofu — Terraformのオープンソースフォーク。ステートの互換性を維持している
  • ドリフト検知 — コードと実インフラのズレ(ドリフト)を検出する仕組み