Contents
前提条件とバージョン確認
| 項目 | 推奨バージョン (2026‑04 時点) | 根拠 |
|---|---|---|
| Terraform 本体 | ≥ 1.9.0(最新安定版) | https://developer.hashicorp.com/terraform/downloads の「Latest Release」欄に記載 |
| Google Cloud Provider | ~> 6.11.0 以上 | Terraform Registry(https://registry.terraform.io/providers/hashicorp/google/latest) の required_version が >= 1.9.0、Provider バージョンは 6 系の最新が 6.11.x 系です。※リリースノートで随時確認してください |
⚠️ 注意
Provider バージョンは半年ごとにマイナーバージョンが上がります。versions.tfに記載するバージョン指定は「~> 6.11」や「>= 6.11,<7.0」のように範囲を明示し、常に公式リリースノートで互換性情報を確認してください。
Terraform CLI のインストール
macOS(Homebrew)
|
1 2 3 |
brew tap hashicorp/tap brew install hashicorp/tap/terraform # 常に最新版が取得されます |
Ubuntu/Debian(APT)
|
1 2 3 4 5 6 7 8 9 |
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 > /dev/null sudo apt update && sudo apt install terraform |
Windows(公式 ZIP)
- https://www.terraform.io/downloads.html から
terraform_1.9.x_windows_amd64.zipをダウンロード - 任意のディレクトリに展開し、パスを環境変数
PATHに追加
バージョン確認
|
1 2 3 4 |
$ terraform version Terraform v1.9.4 on windows_amd64 |
ポイント:
v1.9.xが表示されたらインストール完了です。バージョンが古い場合は再度インストール手順を実行してください。
Google Cloud Provider の設定
versions.tf(必須)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
terraform { # Terraform 本体の最低バージョン required_version = ">= 1.9" required_providers { google = { source = "hashicorp/google" version = "~> 6.11" # 最新マイナーバージョンを自動取得(2026‑04 時点は 6.11.x 系) } } # バックエンドは別ファイル (backend.tf) に分離するのがベストプラクティス } |
プロバイダブロック例 (provider.tf)
|
1 2 3 4 5 6 7 8 |
provider "google" { project = var.project_id region = var.region # 認証情報は後述の「認証情報の安全な取り扱い」参照 credentials = var.google_credentials_json } |
備考:
required_providersのversionフィールドは 「~> 6.11」 と書くことで、
6.11.x 系の最新が自動で取得されます。上位互換(7.0 以降)への自動アップグレードは防げるため、突発的な破壊的変更を回避できます。
認証情報の安全な取り扱い
サービスアカウントキーの作成手順(概要)
- IAM → Service Accounts で新規サービスアカウント作成
- 必要最小限のロールを付与(例:
roles/compute.instanceAdmin.v1,roles/network.admin) - 「キー」タブから JSON キーを生成しダウンロード
重要:キーは 機密情報 です。決してリポジトリにコミットせず、アクセス権が必要な環境だけで保管してください。
環境変数 GOOGLE_CREDENTIALS の使い方
| 方法 | メリット | デメリット |
|---|---|---|
Base64 エンコードした JSON を直接設定 (export GOOGLE_CREDENTIALS=$(cat cred.json | base64 -w0)) |
CI/CD でシークレットストアに格納しやすい。環境変数漏洩リスクは同等だが、ログ出力されにくい | デコード忘れで認証失敗しやすい |
GOOGLE_APPLICATION_CREDENTIALS にファイルパスを設定 (export GOOGLE_APPLICATION_CREDENTIALS=$HOME/secrets/cred.json) |
ファイルベースのツールと相性が良い | ファイル自体の権限管理が別途必要 |
Terraform でデコードする例(variables.tf)
|
1 2 3 4 5 6 7 8 9 10 11 |
variable "google_credentials_base64" { description = "Base64 エンコードされた GCP サービスアカウント JSON" type = string sensitive = true } # デコード結果をプロバイダに渡すローカル変数 locals { google_credentials_json = jsondecode(base64decode(var.google_credentials_base64)) } |
Provider に適用
|
1 2 3 4 5 6 |
provider "google" { project = var.project_id region = var.region credentials = local.google_credentials_json } |
安全上の注意
Base64 は暗号化ではなく「エンコード」だけです。漏洩した場合は即座にキーが復元可能になるため、必ずシークレット管理ツール(Vault、Secret Manager 等)で保護してください。
terraform consoleなど対話的なコンソールでvar.google_credentials_base64を表示すると平文の JSON が出力されるので、実行時はsensitive = trueに設定し、ログに流れないようにしましょう。
変数管理とベストプラクティス
ファイル構成例
|
1 2 3 4 5 6 |
├─ main.tf # ルートリソース(VPC、Compute 等) ├─ variables.tf # 入力変数宣言 ├─ terraform.tfvars # デフォルト値(非機密情報のみ) ├─ backend.tf # リモートバックエンド設定 └─ versions.tf # プロバイダ・Terraform バージョン管理 |
主要変数 (variables.tf)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
variable "project_id" { description = "GCP プロジェクト ID" type = string } variable "region" { description = "デプロイ先リージョン" type = string default = "asia-northeast1" } variable "instance_type" { description = "Compute Engine のマシンタイプ" type = string default = "e2-medium" } |
環境別 tfvars(例:dev.tfvars)
|
1 2 3 4 5 |
project_id = "my-gcp-dev" region = "asia-northeast1" instance_type = "e2-small" # 機密情報は含めない → CI では環境変数で注入 |
実務での使い分け
| 項目 | 推奨方法 |
|---|---|
| インフラ構成パラメータ(サイズ、タグ等) | .tfvars ファイルまたは -var オプション |
| 機密情報(サービスアカウントキー、API キー) | 環境変数 / シークレットマネージャ |
| CI/CD の実装例 | GitHub Actions で secrets.GCP_SA_JSON_BASE64 → GOOGLE_CREDENTIALS にエクスポート |
GitHub Actions サンプル
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
jobs: terraform: runs-on: ubuntu-latest env: GOOGLE_CREDENTIALS: ${{ secrets.GCP_SA_JSON_BASE64 }} steps: - uses: actions/checkout@v3 - name: Setup Terraform uses: hashicorp/setup-terraform@v2 with: terraform_version: "1.9.4" - run: terraform init - run: terraform plan -var-file=dev.tfvars -out=tfplan.out - run: terraform apply -auto-approve tfplan.out # 本番では manual approval を推奨 |
ポイント:本番環境では
-auto-approveの自動承認は避け、GitHub の「environment protection rule」や手動レビューを導入してください。
サンプル構成:VPC・Compute Engine・Pub/Sub
以下は最小構成のコード例です。実務に合わせてロールやタグ等を追加してください。
1️⃣ VPC とサブネット (network.tf)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
resource "google_compute_network" "vpc_main" { name = "tf-vpc-main" auto_create_subnetworks = false routing_mode = "REGIONAL" } resource "google_compute_subnetwork" "subnet_a" { name = "tf-subnet-a" ip_cidr_range = "10.0.0.0/24" region = var.region network = google_compute_network.vpc_main.id } |
2️⃣ Compute Engine インスタンス (instance.tf)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
resource "google_compute_instance" "web" { name = "tf-web-instance" machine_type = var.instance_type zone = "${var.region}-a" boot_disk { initialize_params { image = "ubuntu-os-cloud/ubuntu-2204-lts" } } network_interface { subnetwork = google_compute_subnetwork.subnet_a.id access_config {} # パブリック IP を自動付与 } metadata_startup_script = <<-EOS #!/bin/bash apt-get update -y && apt-get install -y nginx systemctl enable --now nginx EOS tags = ["http-server"] } |
ベストプラクティス:本番では
metadata_startup_scriptの代わりに Cloud‑Init、Ansible、または Packer イメージで構成を行い、インスタンス起動時の処理を最小化します。
3️⃣ Pub/Sub トピック & サブスクリプション (pubsub.tf)
|
1 2 3 4 5 6 7 8 9 10 11 |
resource "google_pubsub_topic" "events" { name = "tf-events-topic" } resource "google_pubsub_subscription" "pull_sub" { name = "tf-pull-subscription" topic = google_pubsub_topic.events.id ack_deadline_seconds = 20 # 必要に応じて調整 } |
Terraform ワークフロー(init → plan → apply)
| コマンド | 目的 | 補足 |
|---|---|---|
terraform init |
プラグイン・バックエンド取得 | 初回だけでなく、Provider バージョン変更時は -upgrade オプションを併用 |
terraform fmt -recursive |
コード整形 | CI で自動実行推奨 |
terraform validate |
設定の構文チェック | plan 前に必ず実施 |
terraform plan -out=tfplan.out -var-file=dev.tfvars |
変更点をファイルへ保存 | -out によりレビューが容易になる |
terraform show tfplan.out |
計画内容の詳細表示 | 変更対象 (+, ~, -) を必ず確認 |
terraform apply tfplan.out |
計画通りに適用 | 手動承認が必要な場合は -auto-approve を外す |
実務での安全策
- Plan のレビュー:プルリクエストに Plan 出力を添付し、チームで確認。
- バックエンドロック:Terraform Cloud か、S3 + DynamoDB(AWS)/ GCS + ロックオブジェクトでロックを有効化。
- CI の自動テスト:
terraform validateとplan -detailed-exitcodeを実行し、失敗したらパイプラインを停止。
State 管理と Terraform Cloud の活用
ローカル state のリスク
| リスク | 影響 |
|---|---|
| ファイル破損・紛失 | インフラの現状把握ができなくなる |
| 同時実行による競合 | 予期せぬリソース削除や二重作成 |
| バックアップ不足 | 復旧に時間がかかり、運用コスト増大 |
Terraform Cloud(remote backend)設定例 (backend.tf)
|
1 2 3 4 5 6 7 8 9 10 11 |
terraform { backend "remote" { hostname = "app.terraform.io" organization = "my-org" workspaces { name = "gcp-sample" } } } |
初回認証手順
|
1 2 3 4 5 6 |
# Terraform Cloud の UI で API Token を生成 → 環境変数に設定 export TF_CLOUD_TOKEN=xxxxxxxxxxxxxx terraform login # token をローカルの .terraform.d に保存 terraform init # remote backend が有効化される |
ポイント:
TF_CLOUD_TOKENは 機密情報。GitHub Actions 等ではsecrets.TF_CLOUD_TOKENとして注入し、平文で残さないようにしてください。
料金とプラン
| プラン | 無料枠 | 主な制限 |
|---|---|---|
| Free | 500 runs / 月 | 同時実行 1, ステート容量 250 MB |
| Team & Governance | 有償 | ロック、ポリシー、SAML SSO 等 |
小規模チームや PoC であれば Free プラン が十分です。
クリーンアップ(destroy)とリスク回避策
安全な削除フロー
|
1 2 3 4 5 6 7 8 9 |
# 削除計画だけを作成 terraform plan -destroy -out=destroy.plan -var-file=dev.tfvars # 計画内容の確認(必ずレビュー) terraform show destroy.plan # 確認後に適用 terraform apply destroy.plan |
⚠️ 注意:
terraform destroy -auto-approveは 本番環境では絶対に使用しない。
予期せぬリソース削除はコストだけでなく、データ損失やサービス停止につながります。
よくあるエラーと対処法
| エラー | 原因例 | 対策 |
|---|---|---|
Error: Invalid credentials |
GOOGLE_CREDENTIALS が空・破損 |
環境変数を再設定し、base64 --decode で内容確認 |
Failed to query available provider packages |
ネットワーク制限・プロキシ未設定 | HTTPS_PROXY/NO_PROXY を正しく設定、もしくは社内ミラーを利用 |
Locking state file failed |
同時実行やロックファイル残存 | Terraform Cloud に移行、または -lock-timeout=300s で待機 |
セキュリティ留意点
-
最小権限の原則
bash
gcloud projects add-iam-policy-binding my-project \
--member="serviceAccount:terraform-sa@my-project.iam.gserviceaccount.com" \
--role="roles/compute.instanceAdmin.v1"
gcloud projects add-iam-policy-binding my-project \
--member="serviceAccount:terraform-sa@my-project.iam.gserviceaccount.com" \
--role="roles/network.admin"
Owner権限は付与しない。必要に応じてpubsub.editorなどを追加。 -
キーのローテーション
- 毎月または重要な権限変更時に新しい JSON キーを生成し、古いキーは即座に無効化。
-
自動化スクリプトで
gcloud iam service-accounts keys createとkeys deleteを組み合わせる。 -
シークレット管理
- HashiCorp Vault、Google Secret Manager、GitHub Secrets のいずれかを使用し、環境変数に注入。
-
Base64 は暗号化ではない ことをチーム全員に周知し、アクセス権限は最小限に。
-
State ファイルの暗号化
- Terraform Cloud の場合は自動で暗号化されますが、GCS バックエンド使用時は
kms_key_nameで CMEK を設定。
まとめと次のステップ
| 項目 | 要点 |
|---|---|
| Terraform 本体 | 公式サイトから最新(≥ 1.9)を取得し、terraform version で確認 |
| Google Provider | ~> 6.11(最新版)を required_providers に明示。リリースノートは必ずチェック |
| 認証情報 | サービスアカウント JSON を Base64 エンコードし、環境変数 GOOGLE_CREDENTIALS 経由で注入。シークレットストアに保管 |
| 変数管理 | variables.tf + .tfvars で非機密パラメータを管理、機密情報は環境変数/Secret Manager |
| サンプル構成 | VPC → Subnet → Compute Engine → Pub/Sub のフローが一通り体験できる |
| ワークフロー | terraform init → fmt/validate → plan -out → apply を CI に組み込み、Plan のレビューを必須化 |
| State 管理 | Terraform Cloud(Free)でリモートバックエンドとロック機能を利用。ローカル保存は避ける |
| クリーンアップ | plan -destroy → apply で削除計画を可視化し、-auto-approve は CI のみ限定的に使用 |
| セキュリティ | 最小権限ロール、キーの定期ローテーション、シークレットは暗号化ストレージへ |
次にやるべきこと
- 公式ドキュメント確認
- Terraform Registry の Google Provider ページで最新バージョンと
required_versionをチェック。 - CI パイプライン構築
- GitHub Actions(または Azure Pipelines 等)に上記の
terraform fmt/validate/plan/applyステップを実装し、Plan の自動コメント化を試す。 - 本番環境への適用
- 最小構成でステージング環境を作り、ロール・権限・キー管理フローを検証後、本番へ拡張する。
最終的なゴール:コードとしてインフラ(IaC)を完全に管理し、変更履歴とレビューが必ず行われる安全かつ再現性の高い GCP 環境を構築できることです。
この記事は 2026 年 4 月時点の情報に基づいています。リリースやベストプラクティスは随時変わりますので、公式ドキュメントで最新情報をご確認ください。