背景
Google Cloud Platform (GCP) 上でデプロイ環境を構築する際、通常はサービス アカウントキーを使用して Terraform などのインフラストラクチャ管理ツールを認証します。セキュリティを向上させ、鍵の管理を簡素化するために、Workload Identity を使用してサービス アカウント キーの発行を回避する方法があります。Workload Identityを使ってSAキー無しでTerraform cloud からのデプロイ環境をつくってみます。
事前準備
GCPとTerraform Cloudのセットアップが必要になります。詳細は割愛しますが、以下の流れで事前準備を行います。
GCPアカウントのセットアップ
- GCPアカウントを持っていない場合、GCP公式ウェブサイトでアカウントを作成します。
- プロジェクトを作成し、必要なAPIやサービスを有効にします。
- Google Cloud SDKをインストールして、コマンドラインからGCPにアクセスできるようにします。
Terraform Cloudへのアクセス
1.Terraform Cloudのアカウントを作成またはログインします。アカウントがない場合は、Terraform Cloudのウェブサイトから登録できます。
2.Terraform Cloudのワークスペースを作成し、プロジェクトに関連付けます。
手順
以下は、Terraform Cloud を使用して GCP 上で Workload Identity をセットアップし、サービス アカウント キーなしでデプロイ環境を構築する基本的な手順です。
Google CloudでWorkload Identityプールとプールプロバイダを作成する。
-
「IAMと管理」にある、「Workload Identity連携」を選択すると、以下の画面がでてくるので、使ってみるを押す。
-
プールにプロバイダを追加する箇所で、プロバイダの選択を
OpenID Connect (OIDC)
を選択して、プロバイダ名と、プロバイダIDを入力する。また、発行元(URL)には、https://app.terraform.io
を入力するして、続行を押す。
-
プロバイダの属性を構成する箇所で、以下の属性マッピングを行う。
OIDC | |
---|---|
google.subject | assertion.sub |
attribute.terraform_full_workspace | assertion.terraform_full_workspace |
attribute.terraform_workspace_id | assertion.terraform_workspace_id |
検証のため今回は属性条件を入力してないが、terraformのOrganization idやworkspace名などでCEL条件を入力することで認証を制限する。
サービスアカウントの作成と権限付与
サービスアカウントを作成して、以下コマンドにて、IAMバインディングを追加します。
gcloud iam service-accounts add-iam-policy-binding [id]@[プロジェクトID].iam.gserviceaccount.com \
--role="roles/iam.workloadIdentityUser" \
--member="principalSet://iam.googleapis.com/projects/[プロジェクト番号]/locations/global/workloadIdentityPools/[プールID]/attribute.terraform_workspace_id/[terraformのworkspace ID]"
コマンド実行後、プールの詳細の接続済みサービスアカウントに表示されます。
Terraform Cloud のセットアップと実行
- Terraform Cloud のWorkspace の Variables で3つの変数を定義する。
key | value |
---|---|
TFC_GCP_PROVIDER_AUTH | true |
TFC_GCP_RUN_SERVICE_ACCOUNT_EMAIL | [サービスアカウント] |
TFC_GCP_WORKLOAD_PROVIDER_NAME | [Workload Identityプロバイダ名(*1)(*2)] |
(*1) 形式はprojects/[プロジェクト番号]/locations/global/workloadIdentityPools/[プールID]/providers/[プロバイダID]
(*2) Sensitiveにチェックをいれる
2. Terraform コードを作成し、Terraform Cloud を使用してデプロイを実行します。Terraform は Workload Identity を介して GCP にアクセスし、サービス アカウント キーを使用せずにデプロイを行います。デプロイが成功するとTerraform Cloud上で以下のように表示されます。