新規に立ち上げたプロジェクトで firebase deploy
を実行したところ、以下のエラーを吐いて失敗してしまいました。
Build failed: failed to Fetch: failed to download archive gs://gcf-sources-PROJECT_NUMBER-asia-northeast1/createUserOnUserCreate-5fd201fd-4b54-42b8-af5c-c3ca68fe3560/version-1/function-source.zip: Access to bucket gcf-sources-PROJECT_NUMBER-asia-northeast1 denied. You must grant Storage Object Viewer permission to PROJECT_NUMBER-compute@developer.gserviceaccount.com.
TL;DR
以下の設定を行います。
- サービスアカウント
PROJECT_NUMBER-compute@developer.gserviceaccount.com
に「Cloud Build サービス アカウント(roles/cloudbuild.builds.builder
)」のロールを付与 - サービスアカウント
PROJECT_NAME@appspot.gserviceaccount.com
に「Firebase 管理者(roles/firebase.admin
)」「サービス アカウント ユーザー(roles/iam.serviceAccountUser
)」を付与
原因
原因は「Code Buildのサービスアカウントの仕様が変更になった」ことと「デフォルトのサービスアカウントへの自動的なロール付与を無効にする設定になっていた」ことでした。
Code Buildのサービスアカウントの仕様が変更になった
今まではサービスアカウント PROJECT_NUMBER@cloudbuild.gserviceaccount.com
の権限を使用してビルドしていたのが、
サービスアカウント PROJECT_NUMBER-compute@developer.gserviceaccount.com
に変更になりました。
デフォルトのサービスアカウントへの自動的なロール付与を無効にする設定になっていた
一部のGoogle Cloudサービスでは、APIを有効化したときにデフォルトのサービスアカウントが自動的に生成されます。
このとき生成されるサービスアカウントには編集者(roles/editor
)が付与されます。
しかし、今回問題になったプロジェクトでは、組織ポリシーでロール付与が無効になっていました。
この設定の影響で、サービスアカウント PROJECT_NUMBER-compute@developer.gserviceaccount.com
に一切権限がない状態でした。
また、Firebase Functionsを実行するためのサービスアカウントにも一切権限がありませんでした。
対策
各サービスアカウントに適切な権限を付与します。
具体的には以下の権限を付与しました。
- サービスアカウント
PROJECT_NUMBER-compute@developer.gserviceaccount.com
に「Cloud Build サービス アカウント(roles/cloudbuild.builds.builder
)」のロールを付与- Firebase Functions のビルドにだけ使用する想定なので、Cloud Buildに関する権限のみを付与
- サービスアカウント
PROJECT_NAME@appspot.gserviceaccount.com
に「Firebase 管理者(roles/firebase.admin
)」「サービス アカウント ユーザー(roles/iam.serviceAccountUser
)」を付与- Firestoreへの読み書きを行いたかったので、Firebaseに関連する権限を付与
- 「サービス アカウント ユーザー」は Firebase Functions で利用するために必要
まとめ
Firebase なんて firebase init && firebase deploy
でラクラク構築できるものと思ってましたが、
現実はそう甘くはありませんでした。
このエラーで一日溶かしたので、同じ現象にハマっているひとの参考になれば幸いです。
デプロイの道は険しくとも
サービスアカウントに権限を追加し
エラーの原因を追い詰めて
成功の光が見えてくる
🎉🐇Firebase Functions、再び羽ばたこう! 🚀🎉by CodeRabbit