Firebase Cloud Functions ってどうやって使うん?(使い方)


追記:その前にここ


「Firebase Cloud Functions ってどうやって使うん? 使い方がよくわからんのやけど???」

と思ってggっては

「これはもう使い方知ってる人向けの記事や…
ほんとのほんとの最初の一歩の初期設定が知りたいんや…」

と、心が折れてた、2週間くらい昔の自分へお届けしたい備忘録メッセージ。

(どうせ後で「どうやって使うの?教えて〜!」と質問されたときにはきっと私もう忘れてる!から書いとこ!)

よ〜し、まずは使うための下準備だ!

以下、未来の自分へ


公式:参考リンク

まずはターミナルを使って、「firebase-tools」を使えるようにしよう

グローバルにインストールするよ

グローバルだからどこで叩いてもいいのかな…?
わからん。(知識不足)
不安だったので私はmacのユーザーのすぐ下に移動してから次のコマンドを入力したよ▼

npm install -g firebase-tools

これで firebase というコマンドが使えるようになるよ。

firebaseにログイン

firebase login

でログインしよう。
もうログインしてるときにアカウントが違う場合は

firebase logout

でログアウトできるよ。

projectのフォルダに移動して、以下のコマンドを実行

firebase init firestore

firebase init firestore

もしこんなの(↓)が出たら

❯❯❯ firebase init firestore
nodenv: firebase: command not found

The `firebase' command exists in these Node versions:
  8.17.0
  10.15.3
  12.20.0

nodeのバージョンが上記の3つにしか対応してないけど、
現在のプロジェクトで使ってるnodeのバージョンが上記以外だから動かないよ〜
という意味なので
nodeのバージョンを変更しよう。
私は 12.20.0 にしたよ。


途中できかれる質問はデフォルトでいいみたい。(みたい、って…)
正直よくわかってないので違ったらごめん。

? What file should be used for Firestore Rules? firestore.rules

? What file should be used for Firestore indexes? firestore.indexes.json

firestore.rules
https://console.firebase.google.com/project/【プロジェクト名】/firestore/rules
で設定した、ルールと同じものが入ったよ。
多分「ローカルからコマンドラインでルールを変更→反映させるために必要なので、
ローカルにルールにまつわるファイル作るけど、ファイル名どうする?」みたいなことをきかれてるよ。

※ちなみに、ルールをローカルで変更したら、
ターミナルを使って、

firebase deploy --only firestore:rules

とすれば、ルールの変更がデプロイされるよ。

参考:
https://firebase.google.com/docs/firestore/security/get-started?hl=ja
https://qiita.com/zaburo/items/e82cff108690eb0493c0

firebase init functions

firebase init functions

あとは質問には素直に答えれば、ヨシ!

すでに現在のディレクトリで Firebase hosting を使っている場合は firebase.json に Cloud Functions の設定を追加してくれる。上書きで消される事は無い。言語として TypeScript を選ぶと適当に TypeScript 環境を設定してくれる。プログラムは functions/src/index.ts に関数を書く。

引用元:
https://qiita.com/propella/items/65db803e2a0e18fa2cbc

下準備ここまで

これでとりあえずターミナルで下準備としてインストールしないといけないやつは終わり。

ふと見上げると勝手にfunctionsフォルダができていた。
ありがてぇ。ありがてぇ。

※このあとlintの使用はやめて消しました。
参考: https://tsukada.sumito.jp/2019/12/11/firebase-deploy時のeslintを無効にする/

functionsフォルダ内に色々書いていく

あとは見様見真似で書いていこう。
(※正直間違ってるかもしれないのであまり信用しないで欲しい。詳しい人にちゃんときいてね!)

Firebase Admin SDK

https://console.firebase.google.com/project/【プロジェクト名】/settings/serviceaccounts/adminsdk
から、
「新しい秘密鍵を生成」して
【プロジェクト名】-firebase-adminsdk-xxxxxxxxxxxxx.json を作る。

functionsフォルダ直下に .cert フォルダを作成して
そこに 【プロジェクト名】-firebase-adminsdk-xxxxxxxxxxxxx.json を入れる。

注) gitにupしないように!

gitにupしないように、
functionsフォルダ直下の
.gitignore.cert/ を追記しよう。

node_modules/
.cert/

index.jsでrequireする

今回は下記のような構成なので
index.js でrequireする。

📁functions
∟📄index.js // ←ここでrequire
∟📁.cert
 ∟📄【project名-firebase-adminsdk-xxxxxxxxxxx.json // ←デプロイに必要
∟📁funcs
 ∟📁pet
  ∟📄deletePet.js // ←これを

以下、index.js

const admin = require('firebase-admin')
const serviceAccount = require('./.cert/【project名】-firebase-adminsdk-xxxxxxxxxxx.json')

/**
 * initialize admin
 */
admin.initializeApp({
  credential: admin.credential.cert(serviceAccount)
})

// 他で使ってるやつ たとえば
exports.scheduledBackup = require('./funcs/auth/hogehoge.js')
exports.scheduledBackup = require('./funcs/common/hugahuga.js')
exports.scheduledBackup = require('./funcs/scheduled/hogehoge.js')
exports.scheduledBackup = require('./funcs/user/hugahuga.js')

// 今回作ったやつ
exports.scheduledBackup = require('./funcs/pet/deletePet.js')

Blazeプランにアップグレード

FreeプランでFirebase Cloud Functionsは使えないのでアップグレードする。

権限の付与

必要であれば、下記のURLから(Google Cloud Platform の 「IAM」 から)権限の付与を行う。
https://console.cloud.google.com/iam-admin/iam?folder=&organizationId=&project=【プロジェクト名】

例えば定期バックアップをとるfunctionsを走らせるために、
(参考: https://qiita.com/AyakoKataoka/items/003dae46773e32b9258b)

【プロジェクト名】@appspot.gserviceaccount.com アカウントに対して
Cloud Datastore インポート / エクスポート管理者 の権限を付与した。

※権限周りでエラー出て気づいたので関連リンク貼っとく
https://stackoverflow.com/questions/61225348/firestore-backup-function-errors-with-permission-denied-the-caller-does-not-ha
https://cloud.google.com/firestore/docs/quickstart-servers#set_up_authentication
https://cloud.google.com/firestore/docs/security/iam#roles

そういえば Google Cloud SDK 認証

エラーが出たので解消するために確認していたら、
gcloudのログインが別のgoogleアカウントになっていたので、メモを残しておく。

(確か、一定時間経ったデータを自動で消すために
lifesycleを設定する際に使ったような気がするので直接関係ないかもしれない。
うろ覚え…)

gcloud config list

で、別のアカウントでログインしてないか確認する。

別のアカウントでログインしていたら

gcloud auth login

ログインし直して
プロジェクトを確認

gcloud projects list

プロジェクトを設定し直し

gcloud config set project 【プロジェクト名】

確認

gcloud config list

デプロイ

デプロイするときには .cert 内に 【project名】-firebase-adminsdk-xxxxxxxxxxx.json が必要。
また、全てのfunctionsをデプロイするととても重くなるので
該当のものだけ単体でデプロイするのがいい。時間がかかるので。

firebase deploy --only functions // これだと全部デプロイされる
firebase deploy --only functions:deletePet // これだと指定したfunctionのみデプロイされる

確認

以下のURL(firebaseのコンソールの「functions」)から、デプロイされたfunctionの一覧が確認できる。
各functionの一番右側の「…」から、「ログを確認」することができる。
(console.log的な感じで確認したいときはここから。)
https://console.firebase.google.com/project/【プロジェクト名】/functions/list

おしまい!

あとはfunctionsのフォルダの下のソースコード頑張って書くだけ!
頑張れ過去&未来の私!

functions等の追加・削除の履歴はここから見れる
https://console.cloud.google.com/home/activity?hl=ja&orgonly=true