概要 #
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の間違いを最初に切り分けておくことで、以降のリソース作成時に発生するエラーを調査しやすくなります。
参考資料 #
- Application Default Credentials の仕組み
gcloud auth application-default login- Terraform Google Provider
google_projectData Source
次回 #
次は、Terraformのgoogle_project_serviceを使ってGoogle CloudのService APIを有効化します。