Open3

OIDCを使用してGitHub ActionsからGCPにアクセスする

takumitakumi

https://zenn.dev/ring_belle/articles/gcp-oidc-githubactions

https://cloud.google.com/iam/docs/workload-identity-federation?hl=ja

https://zenn.dev/kou_pg_0131/articles/gh-actions-oidc-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"
takumitakumi

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"
  }
}
takumitakumi

サービスアカウントと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"