👋

Firebase Functions(Cloud Functions)はApp Engine Default Accountを使用している

2022/05/25に公開

めちゃくちゃハマったので備忘録に。

Firebaseを有効にした際、GoogleがFirebase Service Agentやadmin sdkのデフォルトのサービスアカウントを用意してくれるがfirebase functionsの実行マシンが使用しているサービスアカウントはfirebase-service-accountから始まるものやfirebase-adminsdk-xxxxxのようなアカウントではない

App Engine default service accountである。俄には信じられなかったがどうやらそのようになっている。ドキュメントではどこに書いてあるのか見つけられなかったが、cloud function for firebaseでなぜか通常のストレージへのアップロードやアクセスはできるのに関わらずsigned urlの発行ができなかったため、admin-sdkのサービスアカウントにサービスアカウントトークン発行者の権限をつけてみた。だが一向に上手くいかず時間だけを消耗していた所、Stack Overflowにてcloud functionでこれを実現した人がApp Engine default service accountに対して権限付与をおこなっているのを見つけた。

もしやと思って、App Engine Default Service Acountに権限を与えてみたらちゃんと動きました。
まぁCloud Functionが前身だからアカウントの仕様は同じだよなと思いつつも、こんな落とし穴に2時間くらいハマって骨を折ったので、同じような問題で誰かがハマらないように記事に残しておきます。

追記

このドキュメントに書かれているように、第1世代・第2世代でデフォルトのサービスアカウントに紐づいている権限が違うようです。そして、デフォルトサービスアカウントから自作のサービスアカウントに変更できるため、元々のデフォルトサービスアカウントを利用しないほうが良さそうです。
特にデフォルトサービスアカウントの権限はapp engine、compute engineにも紐づいているため、cloud functionsのために変更したロールが運用中の他のサービスに影響を与えてしまうという可能性もあるので、サービスアカウントは最小限のロールで運用するようにしましょう
https://cloud.google.com/functions/docs/securing/function-identity?hl=ja

Discussion