↓メインコンテンツへスキップ
  1. Blogs/

TerraformからGoogle Cloudへ接続してProject情報を取得してみた

3 分
Terraform GoogleCloud
0222-nnn
著者
0222-nnn
猫が好き
目次
Terraform-GoogleCloud - この記事は連載の一部です
パート 1: この記事

概要
#

TerraformでGoogle Cloudのリソースを作成する前に、まず認証とProviderの設定が正しいことを確認したいです。

今回は、TerraformのGoogle Providerから指定したGoogle Cloud Projectを参照し、Project ID、Project名、Project Numberを取得してみました。

この検証では既存Projectの情報を参照するだけで、新しいGoogle Cloudリソースは作成しません。

Terraformの基本操作は前提としています。これからTerraform×Google Cloudのシリーズを読み始める方向けの、最初の1本です。

検証すること
#

  • Application Default Credentials(ADC)で認証できること
  • TerraformがGoogle Providerを初期化できること
  • 指定したGoogle Cloud Projectを参照できること
  • Project ID、Project名、Project NumberをOutputで確認できること

今回の構成
#

今回の処理の流れは次のとおりです。

この検証では新しいResourceを作りません。認証情報が手元からGoogle Cloudへ届き、Projectの情報を読み取れることだけを確かめます。

sequenceDiagram
    actor User as 手元の端末
    participant ADC as Application Default
Credentials participant TF as Terraform participant Prov as Google Provider participant GCP as Google Cloud User->>ADC: gcloud auth application-default login Note over ADC: 認証情報をローカルへ保存 User->>TF: terraform plan TF->>Prov: Providerを初期化 Prov->>ADC: 認証情報を読み込み Prov->>GCP: google_project Data Source で参照 GCP-->>Prov: Project ID / Name / Number Prov-->>TF: Output として返す

Data Sourceは読み取り専用です。Planに作成対象が現れず、Outputだけが表示されれば認証は通っています。

TerraformはGoogle Providerを通してGoogle Cloudへアクセスし、google_project Data Sourceで既存Projectの情報を参照します。

前提環境
#

次の環境を用意します。

  • Google Cloud CLI
  • Terraform 1.10.0以上、2.0.0未満
  • 参照可能なGoogle Cloud Project
  • 対象Projectを参照できるGoogleアカウント
  • 検証時のバージョン:Terraform 1.14.3、google 7.43.0

サンプルコードではGoogle Providerのバージョンを~> 7.0に固定しています。

使用するTerraformコード
#

検証に使用したTerraformコードはこちらです。

ファイル構成
#

今回使用するファイルは次のとおりです。

00-provider-check/
├── versions.tf
├── provider.tf
├── variables.tf
├── data.tf
├── outputs.tf
└── terraform.tfvars.example

この第1回では、今後の記事でも共通して利用するTerraformの基本ファイルを一通り確認します。

versions.tf
#

Terraform本体とGoogle Providerのバージョン条件を定義します。

terraform {
  required_version = ">= 1.10.0, < 2.0.0"

  required_providers {
    google = {
      source  = "hashicorp/google"
      version = "~> 7.0"
    }
  }
}

~> 7.0は、Google Provider 7系の範囲で更新を許可し、意図しない8系への更新を防ぐ指定です。

provider.tf
#

Google Providerが使用するProjectとデフォルトRegionを変数で受け取ります。

provider "google" {
  project = var.project_id
  region  = var.region
}

Project IDをコードへ直接書かず、利用環境ごとに変更できるようにしています。

variables.tf
#

Project IDとRegionの入力変数を定義します。

variable "project_id" {
  description = "Google Cloud Project ID used for the test."
  type        = string

  validation {
    condition     = length(trimspace(var.project_id)) > 0
    error_message = "project_id must not be empty."
  }
}

variable "region" {
  description = "Default Google Cloud region used by the provider."
  type        = string
  default     = "asia-northeast1"
}

project_idが空の場合は、Google Cloudへ問い合わせる前にTerraformのValidationで検出できます。

data.tf
#

google_project Data Sourceを使って既存Projectの情報を取得します。

data "google_project" "current" {
  project_id = var.project_id
}

Terraformのdataブロックは既存リソースを参照するためのものです。このコードではProjectを新しく作成しません。

outputs.tf
#

取得したProject情報をTerraformのOutputへ出力します。

output "project_id" {
  description = "Google Cloud Project ID."
  value       = data.google_project.current.project_id
}

output "project_name" {
  description = "Google Cloud Project name."
  value       = data.google_project.current.name
}

output "project_number" {
  description = "Google Cloud Project number."
  value       = data.google_project.current.number
}

terraform.tfvars.example
#

利用者が設定する入力値のサンプルです。

project_id = "your-project-id"
region     = "asia-northeast1"

このファイルをterraform.tfvarsへコピーし、実際に利用するProject IDへ書き換えます。

terraform.tfvars.exampleは公開用のサンプルとしてGit管理し、環境固有の値を設定するterraform.tfvarsは.gitignoreの対象にしています。

ADCでGoogle Cloudへログインする
#

Google Providerが認証に使用するApplication Default Credentialsを設定します。

gcloud auth application-default login

ブラウザが開いたら、対象Projectを参照できるGoogleアカウントでログインします。

ここで使用するADCと、Google Cloud CLI自身のログイン情報は用途が異なります。

コマンド 主な用途
gcloud auth application-default login Terraformなどのアプリケーションが利用するADCを設定する
gcloud auth login gcloud CLI自身が利用するユーザー認証情報を設定する

そのため、gcloudコマンドが実行できても、ADCが未設定の場合はTerraformの認証に失敗することがあります。

必要に応じて、Google Cloud CLIで使用するデフォルトProjectも設定できます。

gcloud config set project YOUR_PROJECT_ID

ただし、この設定はgcloud CLI用です。今回のTerraformコードではprovider "google"にproject = var.project_idを指定しているため、Terraform実行のためにgcloud config set projectを設定することは必須ではありません。

入力値を設定する
#

サンプルファイルをコピーしてterraform.tfvarsを作成します。

cp terraform.tfvars.example terraform.tfvars

作成したファイルへ検証対象のProject IDを設定します。

project_id = "your-project-id"
region     = "asia-northeast1"

Terraformを初期化する
#

対象ディレクトリへ移動して初期化します。

cd Basic-Examples/00-provider-check
terraform init

terraform initにより、バージョン条件に合うGoogle Providerがインストールされます。

FormatとValidationを確認する
#

TerraformコードのFormatと構文を確認します。

terraform fmt -check
terraform validate

terraform validateが成功すると、次のように表示されます。

Success! The configuration is valid.

PlanでProject情報を確認する
#

terraform planを実行します。

terraform plan

認証とProjectの参照に成功すると、OutputにProject情報が表示されます。

Changes to Outputs:
  + project_id     = "your-project-id"
  + project_name   = "your-project-name"
  + project_number = "123456789012"

Project Numberなどの実値は環境ごとに異なります。

今回はData Sourceによる参照だけなので、PlanにはGoogle Cloudリソースを追加・変更・削除する内容は含まれません。また、目的の確認はPlanで完了するため、terraform applyは不要です。

エラーになった場合の確認ポイント
#

認証情報が見つからない
#

ADCが作成されているか確認し、再度ログインします。

gcloud auth application-default login

Projectを参照できない
#

次の点を確認します。

  • terraform.tfvarsのProject IDが正しいか
  • ログインしたGoogleアカウントに対象Projectの参照権限があるか
  • Projectが削除または停止されていないか

Google Cloud CLIからProjectを参照できるか確認する方法もあります。

gcloud projects describe YOUR_PROJECT_ID

Providerを初期化できない
#

Terraformのバージョンを確認します。

terraform version

また、Providerのダウンロードにはインターネット接続が必要です。

後片付け
#

この検証では新しいGoogle Cloudリソースを作成していないため、terraform destroyやGoogle Cloud側の削除作業は必要ありません。

ローカルの初期化ファイルを削除したい場合は、対象ディレクトリ内の.terraform/を削除します。terraform.tfvarsも不要であれば削除します。

まとめ
#

TerraformでGoogle Cloudリソースを作成する前に、最小構成で次の点を確認できました。

  • ADCを使ってTerraformからGoogle Cloudへ認証する
  • Google ProviderへProjectとRegionを設定する
  • Data Sourceで既存Projectを参照する
  • Project情報をOutputで確認する

認証やProject IDの間違いを最初に切り分けておくことで、以降のリソース作成時に発生するエラーを調査しやすくなります。

参考資料
#

次回
#

次は、Terraformのgoogle_project_serviceを使ってGoogle CloudのService APIを有効化します。

Terraform-GoogleCloud - この記事は連載の一部です
パート 1: この記事

関連記事

Terraform StateをCloud Storage Remote Backendへ移行してみた
2 分
Terraform GoogleCloud CloudStorage
TerraformでArtifact RegistryのDocker Repositoryを作成してみた
2 分
Terraform GoogleCloud Docker
TerraformでArtifact RegistryのコンテナをCloud Runへデプロイしてみた
2 分
Terraform GoogleCloud CloudRun ArtifactRegistry
TerraformでBigQuery DatasetとTableを作成してみた
2 分
Terraform GoogleCloud
TerraformでCloud KMSのKeyRingとCryptoKeyを作成してみた
2 分
Terraform GoogleCloud
TerraformでCloud MonitoringのAlert Policyを作成してみた
2 分
Terraform GoogleCloud