Mímisbrunnr知恵の泉

← クラウドインフラ 一覧

🎓 レベル:標準 | 重要度:A(必須)

📎 前提:IaCとは・宣言的構成 | 関連:モジュール化と環境分離構成管理とImmutable Infrastructure

要点(BLUF)

概念 ── HCL・プロバイダ・state

Terraform の登場人物は3つ。

flowchart LR
    hcl["HCL(宣言)"] --> tf["Terraform Core"]
    state["state(コードと現実の対応表)"] --> tf
    tf -->|"差分を計算"| plan["plan(作成/変更/削除の一覧)"]
    plan -->|"apply"| provider["プロバイダ"]
    provider --> cloud["クラウドAPI → 実資源"]
    cloud -->|"refresh でstate更新"| state

仕組み ── plan/apply のサイクル

# main.tf
terraform {
  required_providers {
    local = { source = "hashicorp/local" }   # デモ用ローカルプロバイダ
  }
}

resource "local_file" "hello" {
  filename = "${path.module}/out/hello.txt"
  content  = "managed by terraform\n"
}

output "path" {
  value = local_file.hello.filename
}
terraform init      # プロバイダを取得(最初の1回)
terraform plan      # 差分: + create local_file.hello
terraform apply     # 実際に作る → state に記録
terraform apply     # 2回目: No changes(冪等)
terraform destroy   # 宣言した資源を消す

plan の出力は +(作成)・~(変更)・-(削除) の記号で差分を示します。特に -(削除) が意図せず出ていないか、apply 前に必ず確認します。

仕組み ── state の扱い(最重要)

state は機密を含みうる(接続情報・生成パスワード等)うえ、チームで共有・ロックしないと壊れます。2人が同時に apply すると state が競合し、現実とズレます。だから本番は リモートstate(クラウドのオブジェクトストレージ+ロック)に置きます(モジュール化と環境分離)。

# 本番のリモートstate(疑似・プロバイダ依存・要最新確認)
terraform {
  backend "s3" {
    bucket = "my-tf-state"
    key    = "prod/terraform.tfstate"
    # ロック機構を併用して同時apply事故を防ぐ
  }
}

なぜ state を持つのか

⚠️ よくある誤解・落とし穴

対応ラボ

cloud-infra-study/labs/05-02_terraform/local プロバイダで local_file を作る最小構成。クラウド資格情報なしで initplanapplyapply(冪等)→destroy を体験)。

関連

第5章 IaC 目次