
全8回シリーズも残すところあと2回となりました。今回は、これまで設計してきたすべてのコンポーネントを、IaC(Infrastructure as Code)のコアツールであるTerraformを用いて、安全かつ効率的に管理・自動化する方法に焦点を当てます。
特に、大規模チームでの協調作業に不可欠なプロジェクト構造、State管理、そしてゼロトラスト原則に基づくシークレット管理の実践方法を解説します。
TL;DR — Terraformプロジェクトは、環境とコンポーネントでディレクトリを分け、Stateはリモートバックエンド(Cloud Storage)で排他制御する。機密情報(シークレット)はコードに直書きせず、Secret Managerで一元管理し、実行環境もWorkload Identityで最小権限を適用する。
簡易チェック: Terraform Stateは安全に隔離・ロックされているか。シークレットはコード外で管理されているか。
実運用に耐えるTerraformプロジェクト構造の設計
この節を読めば:大規模なハイブリッド環境に対応できる、安全でメンテナンス性の高いディレクトリ構造を設計できます。
大規模なハイブリッド環境では、すべての設定を単一のファイルで管理することは非推奨です。環境の分離、コンポーネントの独立、そしてチーム間の作業分担を可能にするための構造化が必須です。
-
環境(Environment)による分離
- 開発(Dev)、ステージング(Stg)、本番(Prod)といった環境ごとに独立したディレクトリを用意します。
-
コンポーネント(Component)による分割
- 各環境内で、デプロイするコンポーネント(VPC/Network、GKE Cluster、Security/IAM、DB/Cloud SQL)ごとにサブディレクトリを作成します。
推奨されるディレクトリ構造(概念図):
├── environments/
│ ├── dev/
│ │ ├── network/
│ │ ├── gke-cluster/
│ │ └── main.tf
│ ├── prod/
│ │ ├── network/
│ │ ├── gke-cluster/
│ │ └── main.tf
├── modules/ (再利用可能なコード)
│ ├── vpc-network/
│ ├── gke-standard/
│ └── service-account/
└── terraform.tfvars (変数ファイル)
この構造を採用する利点:
-
変更範囲の局所化:
terraform applyの実行範囲を限定し、作業の安全性を確保する。 - 複数チームでの作業衝突防止: コンポーネントが分離されているため、同時に異なるリソースの作業が可能。
- ProdとDevの隔離: 設定ファイルやStateの混同による本番環境への事故を防止。
H2: Terraform State管理と遠隔バックエンドの選定
この節を読めば:分散チームでの協調作業と、Stateファイルのセキュリティを確保できます。
Terraform Stateファイルは「真実のソース」であり、機密情報も含むため、最も厳重な管理が必要です。
-
リモートバックエンドの比較
- Google Cloud Storage (GCS) バックエンド: クラウドネイティブ環境での最小構成に向き、コスト効率が高い。排他制御(State Locking)はGCSの機能で提供される。
- Terraform Cloud (TFC): チーム規模が大きく、ポリシーコード(Sentinel)による統制、VCS(Gitなど)との連携、Remote Operations(クラウド実行環境)が必須な現場向け。
-
排他制御(State Locking)とリカバリ
- GCSバックエンドは、標準でStateの排他制御を提供します。
- State破損を防ぎ、万一の破損からリカバリするため、利用するGCSバケットでは必ず世代管理(バージョニング)を有効化し、過去のStateファイルに戻せるようにします。
terraform { backend "gcs" { bucket = "tf-state-prod-bucket-12345" # State専用の隔離されたバケット prefix = "prod/gke-cluster" # コンポーネントごとのパス } }
シークレット管理とゼロトラスト原則の適用
この節を読めば:DBパスワードやAPIキーなどの機密情報を、ゼロトラストの原則に従ってセキュアに扱えます。
機密情報をコードやStateファイルに残すことは厳禁です。
-
Secret Managerによる一元管理
- DB認証情報、外部APIキーなどのシークレットは、Google Cloud Secret Manager で管理し、ライフサイクルを一元制御します。
-
Terraformからのセキュアな参照
- Terraformは Secret Manager のデータソースを利用し、デプロイ時に動的にシークレットを読み込みます。
-
State漏洩リスクへの注意喚起:
sensitive = trueを指定することで output への記録は抑制されますが、参照したシークレット値をリソースの属性としてそのまま設定した場合、その値がStateファイルに記録され得るため、設計時には十分な検証が必要です。
-
CI/CD環境へのゼロトラスト適用
- Workload Identity連携を利用し、CI/CDパイプラインに、Secret Managerへのアクセス権限を最小限(Least Privilege)かつ実行時限定で付与します。
IaC実践: Secret Managerと最小権限の連携
# 1. Secret Managerからシークレットを読み込む (データソース)
data "google_secret_manager_secret_version" "db_password" {
secret = "app-db-password"
version = "latest"
}
# 2. ワークロードID連携で最小権限を適用
# GKEサービスアカウントに対し、Secret Managerの読み取り権限のみを付与
resource "google_secret_manager_secret_iam_member" "secret_accessor" {
secret_id = data.google_secret_manager_secret_version.db_password.secret
role = "roles/secretmanager.secretAccessor" # 読み取り専用権限
member = "serviceAccount:gke-workload-id@${var.project_id}.iam.gserviceaccount.com"
}
再利用性を高めるモジュール設計とコード断片
この節を読めば:ハイブリッド環境のコンポーネントを標準化し、デプロイ速度を加速できます。
複雑なリソース群を単一のモジュールとして定義することで、全環境で一貫した構成が保証されます。
-
モジュールバージョンの固定(Version Pinning)
- モジュールが意図せずアップデートされ、全環境に影響が波及する事故を防ぐため、モジュールのソース(Gitリポジトリなど)を参照する際は、**バージョンタグを固定(ref固定)**します。
# バージョン固定による安全性の確保 module "production_gke" { # ref=v1.2.3 のようにバージョンタグを固定 source = "git::ssh://git.example.com/vpc-module?ref=v1.2.3" cluster_name = "prod-hybrid-cluster" region = "asia-northeast1" node_count = 5 } -
モジュールによるデプロイの統一化
- 各環境の
main.tfは、モジュールを呼び出すためのシンプルなコードになり、複雑なリソース定義はモジュール内に隠蔽されます。
- 各環境の
まとめと次回予告
第7回では、ハイブリッドクラウド環境をIaC(Terraform)で自動化し、安全かつ効率的に管理するための実践的な構造、State管理、そしてゼロトラストに基づくシークレット管理の手法を解説しました。
これで設計からデプロイまでの全てがIaCで管理可能となりました。
次回予告
次回、最終回では、「運用・監視・将来拡張—ユースケース別の最適解」をテーマに扱います。
統合監視戦略(オブザーバビリティ)の完成と、シリーズの総括として、データ分析、AI/ML連携、大規模データ移行など、主要なユースケース別のハイブリッド最適構成案を提示します。
ハイブリッドクラウド × ゼロトラスト × IaC の実践アーキテクチャ設計