HCP TerraformとGoogle CloudのDynamic Credentials用のリソース作成とHCP Terraform Project適用までをTerraformでやってみた
HCP TerraformからGoogle Cloudを操作する際に、HCP TerraformのDynamic Credentials機能を利用できます。
今回は、以下をTerraformでやってみました。
- [Google Cloud]Dynamic Credentials用のリソースをデプロイ
- [HCP Terraform]Google Cloud操作用のProjectを作成
- [HCP Terraform]Dynamic Credentials用のVariables SetsをProjectにセット
以下をベースにして作成しました。大枠は同じですが、複数Projectで利用できるようにVariablesを使っている部分をVariables Setsに置き換えました。
前提条件
- 以下のツールがインストール済みであること
- gcloud CLI
- terraform CLI
- Terraform実行環境から、HCP Terraform・Google Cloudにアクセスできること
Google Cloudプロジェクトへのログイン
Dynamic Credentials設定先のGoogle Cloud Project IDをセットします。
export PROJECT_ID=your-project-id
gcloud config set project ${PROJECT_ID}
Google Cloudへの認証を行います。
gcloud auth login
gcloud auth application-default login
必要なGoogle Cloud APIを有効化します。
gcloud services enable iam.googleapis.com \
cloudresourcemanager.googleapis.com \
sts.googleapis.com \
iamcredentials.googleapis.com \
--project=${PROJECT_ID}
HCP Terraform Organizationへのログイン
HCP Terraformにログインします。
以下のコマンドを実行して、画面の指示に従って操作を行うとトークンがローカルに保存されます。
terraform login
Terraformを実行
コードは以下のリポジトリに格納しました。
terraform.tfvarsを作成します。
cp terraform.tfvars.example terraform.tfvars
terraform.tfvarsを環境に合わせて修正します。
hcp_tf_organization_name = "<HCP Terraform Organization名>"
google_project_id = "<Google Cloud Project ID>"
hcp_tf_project_name = "hoge-google-cloud"
hcp_tf_variables_set_name = "hoge-google-cloud-auth"
準備ができたら、Terraformを適用します。
terraform init
terraform plan
terraform apply
コードを実行することで、Dynamic Credentialに必要な一連のリソースが作成されます。
- Google Cloud リソース
- HCP Terraform用のWorkload Identity Pool
- OIDC プロバイダー (HCP Terraform用)
- HCP Terraformが使用するサービスアカウント
- Workload Identity Poolからサービスアカウントへのアクセス許可
- サービスアカウントにプロジェクトのEditor権限を付与
- HCP Terraform用のWorkload Identity Pool
- HCP Terraform リソース (tfe.tf)
- HCP Terraformプロジェクト
- Google Cloud認証用のVariable Set
- Variable SetをProjectに関連付け
- Dynamic Credentials用のVariables(環境変数)
動作確認
作成されたProjectを確認します。
Variables Setがアタッチされており、Variablesも設定されています。


Project内にWorkspaceを作成しました。
Google Compute Engineインスタンスを作成するTerraformコードが含まれているVCSリポジトリと連携しました。
Runを確認すると、Applyが成功していることを確認できました。

Tips: 「Error creating WorkloadIdentityPool」の対応方法
Terraform DestroyとApplyを繰り返すと、Destroy後のApply時に以下のエラーが出ることがあります。
│ Error: Error creating WorkloadIdentityPool: googleapi: Error 409: Requested entity already exists
│
│ with google_iam_workload_identity_pool.hcp_tf_pool,
│ on google-cloud.tf line 17, in resource "google_iam_workload_identity_pool" "hcp_tf_pool":
│ 17: resource "google_iam_workload_identity_pool" "hcp_tf_pool" {
│ Error: Error creating WorkloadIdentityPoolProvider: googleapi: Error 409: Requested entity already exists
│
│ with google_iam_workload_identity_pool_provider.hcp_tf_provider,
│ on google-cloud.tf line 34, in resource "google_iam_workload_identity_pool_provider" "hcp_tf_provider":
│ 34: resource "google_iam_workload_identity_pool_provider" "hcp_tf_provider" {
│
│
エラーの原因は、削除されたWorkload Identity Poolの復旧期間が設定されているためです。
Google Cloudでは、WorkloadIdentity Poolを削除後、30日間の復旧期間があります。この期間中は、コンソールやgcloud iam workload-identity-pools listでは表示されません。また、同じIDでの新規作成もできません。
解消方法は、「別名で作成する」または「復旧してTerraformにインポートする」のどちらかになります。
ここでは、復旧してTerraformにインポートする手順を紹介します。
以下のコマンドで復旧します。プール名やプールプロバイダー名をサンプルコードから変更している場合は、適宜読み替えてください。
# Workload Identity Poolの復旧
gcloud iam workload-identity-pools undelete hcp-tf-pool --location=global
# Workload Identity Pool Providerの復旧
gcloud iam workload-identity-pools providers undelete hcp-tf-provider-id --workload-identity-pool=hcp-tf-pool --location=global
# Workload Identity Poolの復旧確認
gcloud iam workload-identity-pools list --location=global
# Workload Identity Pool Providerの復旧確認
gcloud iam workload-identity-pools providers list --workload-identity-pool=hcp-tf-pool --location=global
その後、tfファイルの任意の箇所に以下を記載します。
import {
to = google_iam_workload_identity_pool.hcp_tf_pool
id = "projects/<Project ID>/locations/global/workloadIdentityPools/hcp-tf-pool"
}
# Import existing workload identity pool provider
import {
to = google_iam_workload_identity_pool_provider.hcp_tf_provider
id = "projects/<Project ID>/locations/global/workloadIdentityPools/hcp-tf-pool/providers/hcp-tf-provider"
}
Applyして、Importを実行します。
terraform plan
terraform apply






