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

YouTubeの「Firebase Release Notes」プレイリスト

最新のアップデートの概要を把握するのにちょうど良い

Firebase Extensions

Functionsを実装する際の参考になる

Nuxt.jsのservice workerで環境変数を切り替えられるようにする

設定情報をハードコードしたくなかったので、ビルド時にnodeコマンドでファイル生成を行い環境変数を切り替えられるように対応した。