はじめに

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. ターミナルで以下のコマンドを実行します。
    1
    gcloud auth application-default login

    このコマンドにより Google Cloud CLI を介してユーザー認証が行われます。

  2. ブラウザが起動し Google アカウントの選択画面へ遷移します。Terraform の操作に使用するユーザーアカウントを選択し認証を許可します。

これで認証情報の取得は完了で、↓のように terraform plan が、作成したサービスアカウントのアクセストークンから実行されていることが確認できます

まとめ

Terraform で Google Cloud のリソースを管理する際、サービスアカウントの権限借用を利用することで、セキュリティを強化しつつ、認証情報の管理を簡素化できます。
初期設定は多少手間がかかるかもしれませんが、長期的な運用とセキュリティを考慮すると非常に有効な手段です。ぜひこの方法を導入し、安全な Infrastructure as Code を実践してください。

参考ドキュメント