💨
WorkloadIdentity連携 フェデレーションIDでアクセス権付与 by Terraform
はじめに
以下の記事を書いている時に、Workload Identity連携で、「フェデレーション ID を使用してアクセス権を付与する(推奨)」とあるのに情報が少ない[1]と感じたため、この部分を切り出そうと思いました。
以下で Terraform でサービスアカウントを作成せずプリンシパルに直接権限を付与する方法を書きます。
実装
といっても、ドキュメントの以下の部分を Terraform で書くだけです。
例えば、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レポジトリ名>"
}
Discussion