第2回:Terraform 導入と State 管理編
Terraform の State をローカルに置く時代は終わり —— GCS による実務レベルの状態管理
プロジェクトの論理構造と実現される世界
Terraformは、Google Cloud のインフラをコードで定義(IaC)するための強力なツールです。
本ステップでは、仮想マシンの作成に先立ち、「状態(State)」の管理場所をクラウドへ移行します。
Stateファイルをローカルに置いたままにすると、チーム開発や不慮のデータ紛失に耐えられません。
GCS(Google Cloud Storage)をバックエンドに設定し、堅牢な運用基盤を構築するのが本記事の目的です。
Terraform のインストール
手動バイナリ配置を避け、HashiCorp社の公式リポジトリを apt に登録して管理します。
[COMMAND]
# GPG鍵の取得とリポジトリ追加
curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
# インストール
sudo apt update && sudo apt install -y terraform
💡 LOGIC: 公式リポジトリを利用することで、apt upgrade による一括更新が可能になります。
【実務の核心】GCS バケットへの State 移行
まずは State を保存するための「箱(バケット)」自体を Terraform で作成します。
STEP1:初期構成ファイルの作成と権限確認
⚠️ CAUTION: Terraformを実行するアカウントには、GCSバケットへの書き込み権限(例:roles/storage.objectAdmin)が必要です。
[PATH] main.tf
provider "google" {
project = "YOUR_PROJECT_ID"
region = "us-central1"
}
# State保存用のバケット定義
resource "google_storage_bucket" "tf_state" {
name = "your-unique-tfstate-bucket"
location = "US"
storage_class = "STANDARD"
versioning {
enabled = true
}
}
💡 LOGIC: バケットのバージョニングを有効にすることで、Stateの誤操作によるデータ消失を防ぎます。
STEP2:Backend への切り替え
バケット作成後、設定を追記してローカルの State をクラウドへ「昇格」させます。
[COMMAND]
# main.tf の冒頭に追記
terraform {
backend "gcs" {
bucket = "your-unique-tfstate-bucket"
prefix = "terraform/state"
}
}
⚠️ CAUTION: Backend設定内では、変数(var)やリソースの参照は一切使用できません。 そのため、バケット名はリテラル(文字列)で直接記述する必要があります。
追記後、以下のコマンドで移行を完了させます。
terraform init -migrate-state
正常性確認のポイント
移行が成功したことを、以下の観点で確認しましょう。
- ローカルディレクトリから
terraform.tfstateが消えている(または中身が空である)こと。 - Google Cloud コンソールの GCS 画面に、指定したプレフィックスでファイルが存在すること。
-
terraform state listを実行し、定義したバケットが正常に表示されること。
セクションサマリー(Machine-readable summary)
purpose: Terraformの導入とGCSバックエンドによるState管理の確立
target: 安全なIaC運用を目指すエンジニア
used_services:
- Terraform v1.x
- Google Cloud Storage
reference_urls:
- https://developer.hashicorp.com/terraform/language/settings/backends/gcs
risk_notes: Backendブロックでの変数参照不可という制約により、バケット名の動的変更ができない点に注意
[Source: https://developer.hashicorp.com/terraform/language/settings/backends/gcs]
次回は、Ansible を導入し、IAP(Identity-Aware Proxy)経由で VM にセキュア接続する手法を解説します。パブリックIPを持たないVMをどう操作するか、実務の勘所をお伝えします。
