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

SharedArrayBuffer updates in Android Chrome 88 and Desktop Chrome 92

クロスオリジン分離対応を実施

Firebase Emulator Suiteで起動しているFunctionsから本番のFirestoreにアクセスする

functionsのみエミュレータを使うようにするとできる

Firebase Functions呼び出し時に Error: function terminated. が発生した場合

firebase functions:logで詳細を確認できる

Cloud BuildでFirebase Hostingのデプロイを行う

リポジトリへのpush以外をトリガーにしたい場合に使用

Firebase FunctionsでonCallで実装しているにも関わらずCORSエラーが発生した場合

Cloud Functions(GCP)の管理画面を確認してみる

JestでFirestoreセキュリティルールのテストを書く

Github ActionsでCIを回せるようになった