🥢

動的クレデンシャルで Terraform Cloud から Google Cloud を楽に&安全に 利用しよう

2023/09/13に公開

TL;DR

  • Terraform Cloud から Google Cloud を扱うときに、動的クレデンシャルを使うと、サービスアカウントの秘密鍵を厳重管理やローテーションをする必要がなくなります。
  • 動的クレデンシャルの実体は、Google Cloud 上の Workload Identity を使った、OIDC トークンです。これによって、Terraform Cloud は直接 Google Cloud の秘密鍵を扱いません。
  • Workload Identity 連携の導入にあたって、構築用の Terraform スクリプトが便利です。

はじめに

Terraform Cloud は、自動的に terraform planterraform apply をするパイプラインや、チームで共有可能な状態管理を提供してくれるサービスです。Google Cloud だけで、同様のパイプライン機能を実現するには、Cloud Build を使う ことになりますが、Terraform Cloud は、Google Cloud だけでなく他の環境もまたいで管理したい場合に特に便利です。
そして、2023年3月に Terraform Cloud の動的クレデンシャル機能が GA(一般提供) となりました。動的クレデンシャルによって、サービスアカウントの秘密鍵を管理する必要がなくなり、安全で管理も楽になります。本記事では Google Cloud に対する 認証情報を設定する手順を紹介します。
従来の方法では、GOOGLE_CREDENTIALS といった変数に、サービスアカウントの秘密鍵を設定していました。この鍵が漏れてしまったら、Google Cloud のリソースを不正に操作されてしまう、という大きなリスクがあります。Terraform Cloud を利用していて、この方法で管理されていたかたは、本記事の設定手順を参考にして、動的クレデンシャルの方式に移行してみてください。
また、この記事は、2023/09/14 に開催された HashiTalks: Japan 2023 で発表した内容をもとにしています。

設定手順

仕組みがどうなっているかを理解しておくべきですが、まずは繰り返し使うことになるであろう設定手順の部分を紹介します。 後半に仕組みの解説をしますので、実際に作成した環境を確認しながら参照いただくと良いと思います。

HashiCorp 社の公式ガイドで以下に英語で解説されています。
https://developer.hashicorp.com/terraform/cloud-docs/workspaces/dynamic-provider-credentials/gcp-configuration
また記事中にリンクがありますが、GitHub に構築用の Terraform スクリプトが用意されていて、本記事でもそのスクリプトを使います。
https://github.com/hashicorp/terraform-dynamic-credentials-setup-examples/tree/main/gcp

では、順番に進めていきます。全体の流れは以下の通りです。Terraform スクリプトでカバーされているのは、赤い四角で囲った部分です。Google Cloud 側で必要となるサービスアカウントの設定、Workload Identity の連携設定を簡単に設定することが可能になります。赤い四角の外の部分は、Terraform Cloud の Web UI で設定します。

Terraform Cloud > Organization 作成

Terraform Cloud 側にまだ Organization がない場合は作成します。既にある場合は、その Organization を使って進めることもできます。
https://app.terraform.io/app/organizations/new
(または、Terraform Cloud 画面左下にある "Choose an organization" をクリックして、"Create a new organization" を選択します。)

  • 以下の2項目を入力します。
    • Organization name
    • Email address
  • "Create organization" をクリックします。

Team API Token を取得する

このあと、作成した Organization の下に、Workspace を作成していきますが、その権限を取得します。

  • 左メニュー、Organization > Settings をクリックします。
  • 左メニュー、Organization Settings > Teams をクリックします。
  • Team API Token > "Create a team Token" をクリックします。

  • Expiration (有効期限)を選択します。今回は初期設定に使うものなので、短いもので構いません。
  • "Generate token" をクリックします。
  • token キーが表示されます。これをコピーして控えておきます。以降にこのトークンを確認することはできません。

動的クレデンシャルの設定 by Terraform スクリプト

では、上記の構成図の赤い四角で囲った部分を Terraform で作成していきます。GitHub 上で提供されているものを使います。
Terraform Cloud から Google Cloud Console に移動して、Cloud Shell を開きます。この Cloud Shell 上で Terraform スクリプトを実行することになります。

git clone して、配下の Google Cloud のディレクトリ (gcp) へ cd します。

git clone https://github.com/hashicorp/terraform-dynamic-credentials-setup-examples.git 
cd terraform-dynamic-credentials-setup-examples/gcp 

tfvars ファイルを各環境にカスタマイズします。

cp terraform.tfvars.example terraform.tfvars
vi terraform.tfvars

中身は以下 2 つの項目です。これを自分の環境に合わせて変更します。

tfc_organization_name = "my-organization"
gcp_project_id = "my.project.id"

terraform login > init > plan > apply までを実行する

Terraform Cloud へログインします。

terraform login
...
Token for app.terraform.io:
  Enter a value: 

このように Token の入力を求められるので、先ほど取得した Team API Token をペーストして、Enter します。
ログイン成功した場合は、Welcome to Terraform Cloud! のメッセージと、ロゴが表示されます。

Terraform apply までを実行していきます。途中で実行前確認の yes の入力を求められるので、内容を確認して従います。

terraform init
…
Terraform has been successfully initialized!
terraform plan
…
Plan: 4 to add, 0 to change, 0 to destroy.
terraform apply
…
Apply complete! Resources: 4 added, 0 changed, 0 destroyed.

結果確認

さてここまで実行できたら、本記事のメイン部分は完了しています。結果を確認していきます。

まずは Google Cloud 上に作成された Service Account と、Workload Identity を確認します。それぞれ Console の IAM と管理 メニューの下で確認できます。

続いて、Terraform Cloud 上に作成された workspace を確認します。Terraform Cloud の Web UI で、左メニュー Projects & workspaces より、作成した workspace を確認できます。

作成した workspace をクリックして、確認してみます。workspace を選択したら、左メニューの Settings から結果を確認できます。

Version Control 設定

Terraform Cloud は、GitHub などの Version Control と連携して、Terraform スクリプトを管理することができます。この機能を使うと、Terraform Cloud 上で、Terraform スクリプトの変更を検知して、自動的に terraform planterraform apply を実行することができます。

上記で作成した Terraform workspace を選択します。左メニューより Settings > Version Control を選択します。

Connect to version control をクリックします。

ステップの左から、1. Choose Type、2. Connect to VCS、3. Chose a repository、4. Confirm changes とあります。順番に進めていきます。連携するリポジトリは各自の環境に合わせてください。

  • 1. Choose Type : Version control workflow を選択します。
  • 2. Connect to VCS : ここでは GitHub を選択します。GitHub.com or GitHub EnterpriseGitHub.com (Custom) の選択肢が出てきます。それぞれ各自の環境にあわせて選択します。
    • ここで、GitHub.com を選択した場合は、GitHub に認証する画面が開きますので、Permission を確認して Authorize Terraform Cloud をクリックします。
    • Failed to install GitHub App Please disable pop-up blocker and try again というエラーが出る場合は、ブラウザのポップアップブロックを解除して、再度やってみましょう。
    • GitHub 認証のステップが進みます。権限を与えるリポジトリを選択します。
  • 3. Chose a repository : GitHub 上のどのリポジトリと連携するか選択します。
  • 4. Confirm changes : Apply Method や VCS Triggers など各挙動を選択して、画面下部にある Update VCS settings をクリックします。
    • Connected to VCS と表示されていれば連携完了です。

完成!

これで、動的クレデンシャルが有効な状態で Terraform Cloud と Google Cloud が連携できました。あとは、コードリポジトリ上の Terraform スクリプトを変更すると、Terraform Cloud が自動的に terraform planterraform apply を実行してくれます。

動的クレデンシャルの仕組み

上記の設定手順の説明では、中身の説明を省略していました。少しだけ、どのように仕組みを設定していたのか補足します。

これまで従来の方法では、以下のように、サービスアカウントの秘密鍵を GOOGLE_CREDENTIALS という環境変数に設定していました。これでは、Terraform Cloud 上で直接サービスアカウントの秘密鍵を利用する形になり、漏洩リスクが高いため、厳重に管理する必要があります。

これに対して、動的クレデンシャルでは、Google Cloud が Terraform Cloud に対して、Workload Identity Pool で管理される Provider を経由してアクセス権限(トークン)を付与します。このため、Terraform Cloud 上で、直接サービスアカウントの秘密鍵を管理する必要がなくなります。Terraform Cloud 側で管理しているのは、Workload Identity Provider の名前と サービスアカウントの名前だけです。

参考情報

HashiCorp

Google Cloud

Google Cloud Japan

Discussion