💨

WorkloadIdentity連携 フェデレーションIDでアクセス権付与 by Terraform

2024/08/15に公開

はじめに

以下の記事を書いている時に、Workload Identity連携で、「フェデレーション ID を使用してアクセス権を付与する(推奨)」とあるのに情報が少ない[1]と感じたため、この部分を切り出そうと思いました。

以下で Terraform でサービスアカウントを作成せずプリンシパルに直接権限を付与する方法を書きます。

https://zenn.dev/optimind/articles/googlecloud-githubactions-terraform-cicd

実装

といっても、ドキュメントの以下の部分を Terraform で書くだけです。

https://cloud.google.com/iam/docs/workload-identity-federation-with-other-providers?hl=ja#access

例えば、GitHubのプロバイダを想定して、

resource "google_iam_workload_identity_pool_provider" "provider" {
  workload_identity_pool_id = google_iam_workload_identity_pool.pool.workload_identity_pool_id

  workload_identity_pool_provider_id = "github-provider"
  display_name                       = "github-provider"
  description                        = "for github actions workflows"

  attribute_mapping = {
    "google.subject"             = "assertion.sub"
    "attribute.repository"       = "assertion.repository"
    "attribute.repository_owner" = "assertion.repository_owner"
  }
  attribute_condition = "assertion.repository_owner == '<GitHubレポジトリのorganization>'"

  oidc {
    issuer_uri = "https://token.actions.githubusercontent.com"
  }
}

のようにattribute_mapping[2]が設定されている場合は、以下のようにプリンシパルにロールを付ければOKです[3]

resource "google_project_iam_member" "the_principal" {
  for_each = toset([
    "roles/compute.networkAdmin",
    "roles/compute.instanceAdmin.v1",
    "roles/editor",
  ])
  project = data.google_project.current.project_id
  role    = each.value
  member  = "principalSet://iam.googleapis.com/${google_iam_workload_identity_pool.pool.name}/attribute.repository/<GitHubレポジトリのorganization>/<GitHubレポジトリ名>"
}

resource "google_storage_bucket_iam_member" "object_viewer" {
  bucket = var.bucket_name
  role   = "roles/storage.objectViewer"
  member = "principalSet://iam.googleapis.com/${google_iam_workload_identity_pool.pool.name}/attribute.repository/<GitHubレポジトリのorganization>/<GitHubレポジトリ名>"
}
脚注
  1. これを書いた時点で、GitHubに関して公式ドキュメントのワークフローはサービスアカウントを使用する例が記載されていました。 ↩︎

  2. 例ではGoogleCloudの属性とGitHubのOIDCトークンに含まれるクレームのマッピングを設定しています。 ↩︎

  3. ロールは使用するものに置き換えてください。 ↩︎

Discussion