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_link | data.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 領域が揃いました。各クラウドの差分を意識しながら、自分のプロジェクトで手を動かしてみてください。