GitHub ActionsでGCRにDocker image pushするIAMポリシーの設定

参考: 

サービスアカウントキーを用いずにGitHub ActionsからGoogle Cloudと認証する | DevelopersIO

こちらの記事に則ってセットアップし、GCRに docker pushのタイミングで

denied: Token exchange failed for project '${PROJECT_ID}'. Caller does not have permission 'storage.buckets.get'. To configure permissions, follow instructions at: https://cloud.google.com/container-registry/docs/access-control

というエラーが発生した。

サービスアカウントにstorage.buckets.getの権限がないというメッセージだったので、適当そうなロールを探してみた。

IAM を使用したアクセス制御  |  Container Registry のドキュメント  |  Google Cloud

gcloud projects add-iam-policy-binding ${PROJECT_ID} \
  --member "serviceAccount:${SERVICE_ACCOUNT_NAME}@${PROJECT_ID}.iam.gserviceaccount.com" \
  --role="roles/storage.legacyBucketWriter"
(gcloud.projects.add-iam-policy-binding) INVALID_ARGUMENT: Role (roles/storage.legacyBucketWriter) does not exist in the resource's hierarchy.

そんなロールは存在しないと言われたので、stack overflowを参考に試しにroles/storage.adminに変更してみた。

kubernetes - Google Cloud Service Account with 'roles/container.admin' - Stack Overflow

gcloud projects add-iam-policy-binding ${PROJECT_ID} \
  --member "serviceAccount:${SERVICE_ACCOUNT_NAME}@${PROJECT_ID}.iam.gserviceaccount.com" \
  --role="roles/storage.admin"

ロールの紐付けも成功し、GHAからのpushも成功。

ただ、GoogleのIAM公式ドキュメントstorage.buckets.get権限はroles/storage.adminに含まれないですよと書いてあるので、これは一体...?という状態。

注: イメージを push するには、storage.buckets.get 権限に加え、オブジェクトの読み取り権限と書き込み権限が必要です。Storage オブジェクト管理者ロールには、storage.buckets.get 権限が含まれていませんが、Storage レガシー バケット書き込みロールには含まれています。