Back to tech

cloud function のリージョン変えたら Flutter でリクエストを受け付けなくなった話

2 min read
Table of Contents
Cloud Functionsのリージョンは簡単に変更できるが、Firebase Hostingと組み合わせて動的なHTMLを返そうとすると変更すると問題が出てくる 🌍 - みかづきブログ・カスタム
blog.kimizuka.org
image

新年一発目の投稿です。

Firebaseのcloud functionにて、リージョンをデフォルトのアメリカから日本に変えて、Flutterでリクエストを投げたときにリクエストを受け付けなくなる事件が発生しました。

その問題の解決方法を記載します。

結論

Flutter側でもリージョンを設定する必要があった。

経緯

Firebaseのcloud functionとFlutterアプリを作っていたときです。

cloud functionのリージョンをアメリカから日本に移したいときがありました。

Cloud Functions のロケーション  |  Cloud Functions for Firebase
firebase.google.com
image

Google Cloud Platform で設定可能らしいが、 github で管理したいということもあり、cloud functionを動かしているサーバーのプログラム(TypeScript)にリージョン情報を書きました。

clond functionのコード

以下のように region に “asia-northeast1” を追加しました。

この状態でエミュレータを起動して、FlutterでこのAPIをリクエストしたらエラーになってしまった。

export const onWriteMyTagList = functions
.region("asia-northeast1") // これ
.runWith({ memory: "256MB"})
.https.onCall(
  async (data, context) => {
    // 略
    }

    return await writeMyTagList(admin, context.auth.uid, myTagList);
  });

解決方法

Flutter 側でも リージョンを設定する必要があった。

開発環境で設定するなら以下の感じ。

Future main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();

  if (Common.flavor == 'dev') {
    await FirebaseAuth.instance.useAuthEmulator('localhost', 9099);
    FirebaseFunctions.instanceFor(region: 'asia-northeast1') //これ
        .useFunctionsEmulator('localhost', 5001);
  }

  runApp(const ProviderScope(child: App()));
}

本番環境なら以下のような感じ

final FirebaseFunctions _firebaseFunctions =
    FirebaseFunctions.instanceFor(region: 'asia-northeast1'); //ここ
final appProvider = StateNotifierProvider<AppProvider, AppState>(
  (_) => AppProvider(
    AppRepository(
      api: Api(
        firebaseFunctions: _firebaseFunctions,
      ),
    ),
  ),
);

参考