Firebase Functionsを呼び出す際にregion指定するとEmulatorではなく本番に接続してしまう

公開日時
更新日時

Function定義

Firebase Functionsのリージョンはデフォルトでは us-central1 になっている。

Function定義時にregionを指定するとリージョン変更ができる。

例えば東京リージョンに切り替えたい場合は↓のように asia-northeast1 を指定する。

const someFunction = functions.region("asia-northeast1").https.onCall(async (data, context) => {
  return { message: "ok" }
}

これでFunctionをデプロイすると東京リージョンに公開される。

Function呼び出し元

client側では↓のようにfunctionsの引数にregionを指定することで呼び出すregionを変更できる。

const functions = firebase.app().functions("asia-northeast1")

しかし、Local Emulator Suiteを使ってローカルで開発を行う際にregion指定すると本番環境のfunctionsに接続してしまうことが判明。

ローカル環境ではローカルのfunctionsに接続してほしかったので、エミュレータの場合はregionを指定しないようにした。

昨日の記事lib/firebaseHelpers.ts に↓を追記。

export function getFunctions() {
  const region = isEmulator() ? undefined : 'asia-northeast1'
  return getApp().functions(region)
}

関数は↓のようにすれば呼び出せる。

import { getFunctions } from '@/lib/firebaseHelpers'

const someFunction = getFunctions().httpsCallable('someFunction')
const response = await someFunction()

これでローカルではローカルのFunctions、本番ではリージョン指定のFunctiionsが正しく呼び出せるようになった。

参考


Related #firebase

Firestoreの複合インデックスを削除する

CLI経由で削除する必要があった

Firebase Web SDK v9

_this.auth.addAuthTokenListener is not a function

8.6.5にダウングレードした

Firebase Summit 2021