Open3
OIDCを使用してGitHub ActionsからGCPにアクセスする
GCPのサービスアカウントを作成する
以下のコマンドで作成する
gcloud iam service-accounts create "サービスアカウント名" \
--project="プロジェクトID"
terraformで他のリソースを作成する場合はそのリソースに対する権限を付与しておく必要がある。(編集者ではなく)
今回はartifact registry
を作成するのでroles/artifactregistry.createOnPushWriter
を付与しておく
gcloud projects add-iam-policy-binding "<プロジェクトID>" \
--member="serviceAccount:<サービスアカウントのメールアドレス>" \
--role="roles/artifactregistry.createOnPushWriter"
gcloud projects add-iam-policy-binding "<プロジェクトID>" \
--member="serviceAccount:<サービスアカウントのメールアドレス>" \
--role="roles/artifactregistry.admin"
Workload Identity Poolを作成する
サービスアカウントにroles/iam.workloadIdentityPoolAdmin
権限を付与する
gcloud projects add-iam-policy-binding "<プロジェクトID>" \
--member="serviceAccount:<サービスアカウントのメールアドレス>" \
--role="roles/iam.workloadIdentityPoolAdmin"
terrafomでWorkload Identity Pool
を追加するコードを追加
resource "google_iam_workload_identity_pool" "github_actions" {
project = var.project
workload_identity_pool_id = "github-actions-oidc"
}
terraform apply
で適用
Worlload Identity Pool Providerを作成する
terraformで以下のコードを追加して適用
resource "google_iam_workload_identity_pool_provider" "github_actions" {
project = var.project
workload_identity_pool_provider_id = "github-actions-oidc-provider"
workload_identity_pool_id = google_iam_workload_identity_pool.github_actions.workload_identity_pool_id
attribute_condition = "\"takumi-pro/devlocator_backend\" == assertion.repository"
oidc {
issuer_uri = "https://token.actions.githubusercontent.com"
}
attribute_mapping = {
"google.subject" = "assertion.sub"
"attribute.repository" = "assertion.repository"
}
}
サービスアカウントとWorkload Identity Poolを連携させる
resource "google_service_account_iam_member" "github_actions_iam_workload_identity_user" {
service_account_id = "projects/${var.project}/serviceAccounts/devlocator@${var.project}.iam.gserviceaccount.com"
role = "roles/iam.workloadIdentityUser"
member = "principalSet://iam.googleapis.com/projects/<project_number>/locations/global/workloadIdentityPools/github-actions-oidc/attribute.repository/takumi-pro/devlocator_backend"
}
ここでPermissionエラーが発生したため権限を付与する
gcloud projects add-iam-policy-binding "<プロジェクトID>" \
--member="serviceAccount:<サービスアカウントアドレス>" \
--role="roles/iam.serviceAccountAdmin"