★ 初級

12. データソース集

google プロバイダのデータソース。既存リソース参照、メタ情報取得、ハードコード排除に使います。

プロジェクト・SA・クライアント情報

# 現在のプロジェクト情報を取得(id / number / labels 等)
data "google_project" "current" {}
# 現在の認証情報(リージョン、access_token 等)
data "google_client_config" "current" {}
# 現在の認証主体のメールアドレス(OIDC)
data "google_client_openid_userinfo" "me" {}

# よく使う値をまとめて local に
locals {
  project_id     = data.google_project.current.project_id
  project_number = data.google_project.current.number      # GCS の SA 計算等に必須
  current_email  = data.google_client_openid_userinfo.me.email
}

# よく使うパターン
# 例: GCS の Service Account(プロジェクト番号 + 固定サフィックス)
# GCS のサービスエージェントは番号ベースで生成されるため、project number から組み立てる
locals {
  gcs_sa = "service-${data.google_project.current.number}@gs-project-accounts.iam.gserviceaccount.com"
}

VM 用イメージ

# 公式 Ubuntu 24.04 LTS の最新版(family 指定で自動最新化)
data "google_compute_image" "ubuntu" {
  family  = "ubuntu-2404-lts"
  project = "ubuntu-os-cloud"     # Google 提供イメージは専用プロジェクト配下
}

# Container-Optimized OS(コンテナ実行用の軽量 OS)
data "google_compute_image" "cos" {
  family  = "cos-stable"
  project = "cos-cloud"
}

# 自プロジェクトのカスタムイメージ
# name 指定だとバージョン固定(family 指定は最新)
data "google_compute_image" "custom" {
  name    = "myapp-base-v1"
  project = "myapp-images"
}

# VM の boot_disk に取得した image の self_link を渡す
resource "google_compute_instance" "web" {
  boot_disk {
    initialize_params {
      image = data.google_compute_image.ubuntu.self_link
    }
  }
}

既存 VPC / Subnet を引く

# Shared VPC のホストプロジェクトにある VPC を参照
data "google_compute_network" "shared" {
  name    = "vpc-shared"
  project = "shared-network-prd"   # ホストプロジェクト ID
}

# Shared VPC 内の Subnet(region 必須)
data "google_compute_subnetwork" "shared_app" {
  name    = "snet-shared-app-tokyo"
  region  = "asia-northeast1"
  project = "shared-network-prd"
}

# Shared VPC の subnet を使う
# このリソース自身はサービスプロジェクト側に作るが、ネットワークはホスト側を参照
resource "google_compute_instance" "myapp" {
  network_interface {
    subnetwork = data.google_compute_subnetwork.shared_app.self_link
  }
}

Secret Manager から取得

# Secret Manager の最新バージョンを参照
# data ソースで secret_data を読むと state に値が平文で残る点に注意
data "google_secret_manager_secret_version" "external_api_key" {
  secret  = "external-api-key"
  version = "latest"
}

# Cloud Run から:環境変数に Secret の値を注入
# value_source で「ランタイムに Secret Manager から取る」設定(state には値が入らない)
resource "google_cloud_run_v2_service" "x" {
  template {
    containers {
      env {
        name = "API_KEY"
        value_source {
          secret_key_ref {
            secret  = data.google_secret_manager_secret_version.external_api_key.secret
            version = "latest"
          }
        }
      }
    }
  }
}
state に平文で残る data ソースで secret_data を直接読むと state に書かれます。基本は ARN/名前だけ扱い、ランタイムでアプリが取得する設計に。

リージョン・ゾーン情報

# 指定リージョンで利用可能なゾーン一覧(UP 状態のみ)
data "google_compute_zones" "available" {
  region = "asia-northeast1"
  status = "UP"
}

# 使い方: AZ 分散して MIG を作る
locals {
  zones = data.google_compute_zones.available.names    # ["asia-northeast1-a", "-b", "-c"] 等
}

# 3 台を 3 ゾーンに振り分け配置
# count.index % length で zone をローテーション
resource "google_compute_instance" "web" {
  count = 3
  zone  = local.zones[count.index % length(local.zones)]
  # ...
}

ハードコード排除のコツ

ハードコード置き換え先
"myapp-prd" (project)data.google_project.current.project_id
"123456789012" (project number)data.google_project.current.number
"asia-northeast1-a"data.google_compute_zones.available.names[0]
"ubuntu-2404-lts" image self_linkdata.google_compute_image.ubuntu.self_link
"shared-vpc-..."data.google_compute_network.shared.id
"db_password = ..."data.google_secret_manager_secret_version
GCP 編はここまで お疲れ様でした。これで HCL × AWS × GitHub × Azure × GCP の 5 領域が揃いました。各クラウドの差分を意識しながら、自分のプロジェクトで手を動かしてみてください。