はじめに
Google Cloud で Terraform を利用する際、サービスアカウントの権限借用 (Impersonation) は推奨される認証情報管理方法です。アクセストークンを動的に生成することでセキュリティを向上させます。
この記事では、サービスアカウント権限借用のメリットや設定手順を解説します。
メリット
サービスアカウント権限借用には以下のメリットがあります。
メリット項目 | 詳細 |
---|---|
セキュリティの向上 | サービスアカウントキーの直接的な使用を避けます。これによりキー漏洩のリスクが低減されます。ユーザーはアクセストークンを使用しサービスアカウントとして操作が可能です。 |
アクセス管理の簡素化 | ユーザーへサービスアカウントへの権限借用権限を付与します。これによりサービスアカウント自体のキー管理や直接的なアクセス権限管理が不要になります。 |
運用管理の簡素化 | 環境変数などの設定が不要です。複数人で同じサービスアカウントから権限を借用できます。 |
前提条件
操作を行うユーザーアカウントには事前に以下のロールが必要です。
ロール名 | 概要 |
---|---|
編集者 | プロジェクトのリソース編集権限 |
サービスアカウント管理者 | サービスアカウントの管理権限 |
Project IAM 管理者 | プロジェクトレベルの IAM ポリシー管理権限 |
これらのロールがユーザーアカウントへ付与されていることを確認してください。
手順
1.terraform 実行用サービスアカウントを作成
「IAM」→「サービスアカウントを作成」→任意の名前で作成
2.自身のユーザーアカウントにIAMロール「Service Account Token Creator」を付与
3. Terraform がサービスアカウントの権限を借用できるようにする設定
Terraform の設定ファイル (provider.tf
など) に以下の設定を記述します。
サービスアカウント情報の定義
Terraform が使用するサービスアカウントのメールアドレスを locals
ブロックで定義します。これにより設定の一元管理が可能です。
1 2 3 | locals { terraform_service_account = "[手順1で作成したサービスアカウントのアドレス]" } |
この locals
ブロックで指定したサービスアカウントが権限借用の対象となります。
権限借用用 Google プロバイダの定義
サービスアカウントのアクセストークンを取得するために使用する Google プロバイダを定義します。このプロバイダはユーザー自身の認証情報で動作します。
1 2 3 4 5 6 7 | provider "google" { alias = "impersonation" scopes = [ "https://www.googleapis.com/auth/cloud-platform", "https://www.googleapis.com/auth/userinfo.email", ] } |
この google
プロバイダ (エイリアス: impersonation
) はユーザーアカウントの権限でアクセストークン発行を行うためのものです。
アクセストークンの取得
定義した権限借用用プロバイダを使用してサービスアカウントのアクセストークンを取得します。
1 2 3 4 5 6 | data "google_service_account_access_token" "default" { provider = google.impersonation target_service_account = local.terraform_service_account scopes = ["userinfo-email", "cloud-platform"] lifetime = "1200s" // トークンの有効期間 (例: 20分) } |
この data
ブロックでは target_service_account
で指定されたサービスアカウントの一時的なアクセストークンを取得します。
サービスアカウント権限で動作する Google プロバイダの定義
取得したアクセストークンを使用して実際に Google Cloud リソースを操作するもう一つの Google プロバイダを定義します。
1 2 3 4 5 6 | provider "google" { project = var.project_id region = var.region access_token = data.google_service_account_access_token.default.access_token request_timeout = "60s" } |
この google
プロバイダが access_token
を使用してサービスアカウントの権限で動作します。
上記で Terraform の設定は完了です。
認証情報を取得する手順
ローカル環境で Terraform を実行するためにユーザーアカウントの認証情報を設定します。
- ターミナルで以下のコマンドを実行します。
1
gcloud auth application-default login
このコマンドにより Google Cloud CLI を介してユーザー認証が行われます。
- ブラウザが起動し Google アカウントの選択画面へ遷移します。Terraform の操作に使用するユーザーアカウントを選択し認証を許可します。
これで認証情報の取得は完了で、↓のように terraform plan が、作成したサービスアカウントのアクセストークンから実行されていることが確認できます
まとめ
Terraform で Google Cloud のリソースを管理する際、サービスアカウントの権限借用を利用することで、セキュリティを強化しつつ、認証情報の管理を簡素化できます。
初期設定は多少手間がかかるかもしれませんが、長期的な運用とセキュリティを考慮すると非常に有効な手段です。ぜひこの方法を導入し、安全な Infrastructure as Code を実践してください。
参考ドキュメント
- サービス アカウントの権限借用について:
https://cloud.google.com/iam/docs/impersonating-service-accounts?hl=ja - Terraform を使用して Google Cloud サービス アカウントの権限を借用する:
https://cloud.google.com/blog/ja/topics/developers-practitioners/using-google-cloud-service-account-impersonation-your-terraform-code