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 レガシー バケット書き込みロールには含まれています。