概要
Cloud FunctionsからFirebase Storageにアップロードする手順についてです。
意外と時間がかかったので、実装方法を書いていきます。
やろうとしていたこと
運用しているサービスの中で、以下のようなことをしようとしていました。
やろうとしていたこと
Firebase Auth (Facebook)された時に、Facebookのプロフィール画像をFirebase Storageにアップロードして、DBに更新する。
その手順
① Firebase AuthでユーザーにFacebookログインさせる
② Firestoreに、新規にuser ドキュメントを作成
③ user ドキュメントの作成をトリガーに、Cloud FunctionsでFacebookのプロフィールをダウンロードして、Firebase Storageにアップロード
この実装方式にしたのは、ユーザーが登録した後にアプリを使い始めるまでの時間を短くしたかったからです。
クライアント(React)でファイルアップロードをすると、ユーザーが登録後にその処理を待つ必要があり、パフォーマンスが弱かったので実装方式をとりました。
実装する
Googleの公式のチュートリアルでも使われている、
Firebase-admin-node をSDKとして使っていたのですが、これを使ってStorageにアップロードしていきます。
この記事を書いた理由になるのですが、そのSDKでは、クライアント側のSDKに比べて簡単にURLの取得ができません。getSignedUrl というメソッドを呼ぶ必要があるのですが、サービスアカウント設定が必要になるので、他の方法で実装をとりました。
Storageの公開用URLを、getSignedUrlを使わず取得するには
公式でこの実装をみないので、実装の内容がアプリの動作にクリティカルなのであれば、避けたほうがいいかもしれないです。
Google cloud storageのurlは以下のように取得できます。
参照: get-public-url-from-file-uploaded-with-firebase-admin
https://firebasestorage.googleapis.com/v0/b/{storage_name}/o/{file_path}?alt=media
クライアントのSDKだと意識しないでいいオブジェクトがたくさんあるなぁと思いました。クライアントSDKさまさまですね。
Bucketクラスなど、今回使っているオブジェクトの仕様はみておいたほうがいいかも知れないです。
参考: @google-cloud/storage#Bucket
実装する
実装の内容は、ローカルに一時保存したファイルをStorageにアップロードして、公開用のurlを生成し、Firestoreに更新をかけるようなものになってます。
正直なところ、nodeJsのfsクラスについての理解が足りていないなぁと実装しながら感じました。
もうちょっと勉強して見ようかなと思っています。