これまでGithub actionsからGCPに接続する際はサービスアカウントのkeyを発行していましたがOIDCに変更しました。 ハマりポイントで時間を溶かしてしまったので手順を書きます。

特定のリポジトリ下で利用できるようにします。

ざっくり手順

  1. Workload Identity プールを作成
  2. プロバイダーを作成
  3. サービスアカウントとリンク
  4. Github Actions修正
  5. export PROJECT_ID={プロジェクトID}

プール作成

gcloud iam workload-identity-pools create "{プール名}" \
  --project="${PROJECT_ID}" \
  --location="global" \
  --display-name="{プール表示名}"

プロバイダー作成

gcloud iam workload-identity-pools providers create-oidc "{プロバイダー名}" \
  --project="${PROJECT_ID}" \
  --location="global" \
  --workload-identity-pool="{プール名}" \
  --display-name="{プロバイダー表示名}" \
  --attribute-mapping="google.subject=assertion.sub,attribute.repository=assertion.repository" \
  --issuer-uri="https://token.actions.githubusercontent.com"

プールIDを取得

gcloud iam workload-identity-pools describe "{プール名}" \
  --project="${PROJECT_ID}" \
  --location="global" \
  --format="value(name)"
export WORKLOAD_IDENTITY_POOL_ID="{↑で取得したプールのID}"

サービスアカウントとリンク

gcloud iam service-accounts add-iam-policy-binding "sb-github-actions@${PROJECT_ID}.iam.gserviceaccount.com" \
  --project="${PROJECT_ID}" \
  --role="roles/iam.workloadIdentityUser" \
  --member="principalSet://iam.googleapis.com/${WORKLOAD_IDENTITY_POOL_ID}/attribute.repository/{ユーザー(Organizations名)}/{repo名}"

リソース名取得

gcloud iam workload-identity-pools providers describe "{プロバイダー名}" \
  --project="${PROJECT_ID}" \
  --location="global" \
  --workload-identity-pool="{プール名}" \
  --format="value(name)"

はまりポイント

github/authのREADMEのプロバイダーを作成する手順では–attribute-mappingでいくつかmappingをしていました。 ところがサービスアカウントとリンクする際に、--attribute-mappingで指定した値を設定していなかったからか、権限不足で一向に接続できませんでした。必要なものだけマッピングするのが良さそうです。(今回ならgoogle.subjectは必須なので、repository=assertion.repositoryだけ)

jobs:
  deploy:
    runs-on: ubuntu-latest

    permissions: # 追加
      contents: read
      id-token: write

....

   - name: Authenticate to Google Cloud 
      uses: google-github-actions/auth@v0
      with:
        workload_identity_provider: {リソース名}
        service_account: {リンクしたサービスアカウント名}

以上!