Theme
SD MILIEU

2021-1-4

[Firebase] メモ

Firebaseプロジェクト立ち上げ直後にやったほうがいいこと

Functionsを使う際に、CloudStorageに不要なデータが残らないようにする

Functionsは実際はコンテナイメージが作成され、それが実行されるみたい。ただ新しくデプロイされた後も古いコンテナイメージがStorage残り続けてしまうようで、それを一定時間後に消すようにしないとStorageを圧迫し続ける。

us.artifacts.exampleproject.appspot.com みたいなバケットを開いて、「ライフサイクル」タブ => ルールを追加 => オブジェクトを削除 => 「年齢」を「1日」に

で、デプロイから一日後に自動的に削除されるようになる。

https://zenn.dev/ryo_kawamata/articles/mysteriously-increasing-storage

トラブルシューティング

FunctionsのNode.jsのバージョンを16にあげようとしたら Error: package.json in functions directory has an engines field which is unsupported. Valid choices are: {"node": "10"}, {"node":"12"}, and {"node":"14"}. みたいなエラーが出てデプロイできない。

どうもデプロイに使用するfirebase-toolsのバージョンを上げないとバリデーションに引っかかってしまう模様。 9.23.0 にアップデートしたらデプロイできるようになった。

Error: The project to be billed is associated with an absent billing account.

AdminSDKでStorageにアクセスしようとした際に発生したエラー。バケットにアクセスする際の引数指定を間違えた結果発生した。

AdminSDKでのStorageへの保存は以下のようなコードを書く必要がある。

const serviceAccount = require('../serviceAccountKey.json')
const app = admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: 'https://exampleproject.firebaseio.com',
})

const storage = app.storage()
const bucket = storage.bucket('gs://exampleproject.appspot.com')
const file = bucket.file('sample-file')
await file.save(JSON.stringify(['hoge', 'fuga']))

これの、storage.bucket('gs://exampleproject.appspot.com')storage.bucket('hogehoge') みたいに存在しないバケットを指定していたため発生。エラーを素直に読んで課金設定ずっと調べたが問題なかったので結構詰まった。

Error: TIMEOUT: Port 8080 on localhost was not active within 60000ms

エミュレータ立ち上げ時に上記エラーが発生することがある。自分が遭遇したケースはNode16を使用するためにfirebase-toolsを9.23.0にアップデートした際に発生した。

解決策としては、以下のようにfirebase.jsonにhost 127.0.0.1 を指定するようにすれば、理由はわからないが動くようになる。(自分はFirestoreだけ問題が出ていたので、Firestoreにhostを指定したら動くようになった)

{
  ...,

  "emulators": {
    "functions": {
      "port": 5001
    },
    "firestore": {
      "port": 8080,
      "host": "127.0.0.1"
    },
    "ui": {
      "enabled": true
    },
    "pubsub": {
      "port": 8085
    },
    "auth": {
      "port": 9099
    },
    "hosting": {
      "port": 5000
    }
  }
}

参考にしたIssue