GithubActionsでOIDC
これまでGithub actionsからGCPに接続する際はサービスアカウントのkeyを発行していましたがOIDCに変更しました。 ハマりポイントで時間を溶かしてしまったので手順を書きます。
特定のリポジトリ下で利用できるようにします。
ざっくり手順
- Workload Identity プールを作成
- プロバイダーを作成
- サービスアカウントとリンク
- Github Actions修正
- 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: {リンクしたサービスアカウント名}
以上!