前提・実現したいこと
Firebase Functionsの関数として
[関数A] firebase-adminを使用してfirestoreやstorageからデータを取得し、返却する。 onCallによる関数であるため、Hostingは行っていない。 [関数B] Next.jsによるSPA。 クライアント用のfirebaseを使用して関数Aを呼び出し、取得したデータを表示する。 Hostingも同時に行っている。
を実装しました。
発生している問題・エラーメッセージ
関数A、関数Bともにデプロイした後、関数Bのページを開いた際に関数Aを呼び出す箇所でInternal Error(code: internal)が返却されてしまいます。
(※エラーハンドリングを行っているため、関数B自体は最後まで実行されます)
関数Bのログ
Function execution started Billing account not configured. External network is not accessible and quotas are severely limited. Configure billing account to remove these restrictions { Error: internal at new HttpsErrorImpl (/srv/functions/build/serverless/pages/index.js:12232:28) at _errorForResponse (/srv/functions/build/serverless/pages/index.js:12327:12) at Service.<anonymous> (/srv/functions/build/serverless/pages/index.js:12712:33) at step (/srv/functions/build/serverless/pages/index.js:43717:27) at Object.next (/srv/functions/build/serverless/pages/index.js:43698:57) at fulfilled (/srv/functions/build/serverless/pages/index.js:43688:62) at process._tickCallback (internal/process/next_tick.js:68:7) code: 'internal', details: undefined } Function execution took 414 ms, finished with status code: 200
関数Aのログ
ローカル上でserveした関数Bから呼び出された場合
Function execution started Billing account not configured. External network is not accessible and quotas are severely limited. Configure billing account to remove these restrictions Function execution took 204 ms, finished with status code: 200
deploy後の関数Bから呼び出された場合
なし。「Function execution started」すら出力されていません。
呼び出し自体が行われていないと思われます。
関数Bの実装(Firebase周りのみ抜粋)
js
1import firebase from "firebase/app" 2import "firebase/functions" 3 4/** 5 * Firebaseを初期化する 6 */ 7export const initializeFirebase = ({ 8 FIREBASE_API_KEY, 9 FIREBASE_AUTH_DOMAIN, 10 FIREBASE_PROJECT_ID 11}) => { 12 if (firebase.apps.length) { 13 return 14 } 15 firebase.initializeApp({ 16 apiKey: FIREBASE_API_KEY, 17 authDomain: FIREBASE_AUTH_DOMAIN, 18 projectId: FIREBASE_PROJECT_ID 19 }) 20} 21 22/** 23 * Firebase functionsの関数を実行する 24 */ 25export const callFunction = async ({ 26 ~ 27}) => { 28 try { 29 let callable = firebase 30 .app() 31 .functions(<リージョン名>) 32 .httpsCallable(<関数名>) 33 return await callable() // deploy後のみ、ここでエラー発生 34 } catch (error) { 35 console.log(error) 36 throw error 37 } 38}
試したこと
- 関数A、関数B自体はそれぞれ正常に実行できることを確認しています。
- 関数Aのみ先にデプロイし、ローカル上で関数Bをserveし動作確認を行った際は関数Aから正常にデータを取得することができていました。
- 当初、関数Aと関数Bは別のリージョンにデプロイしており、それが原因かと考え同一のリージョン(us-central1)にデプロイし直しましたが、結果は変わりませんでした。
問題の発生した環境
- Firebase Sparkプラン
- Firestore、Storageのリージョン:asia-notherneast1
- Functions上のnodeバージョン:10
- npmの各パッケージのバージョン
- "firebase": "7.8.2"
- "firebase-admin": "8.9.2"
- "firebase-functions": "3.3.0"
あなたの回答
tips
プレビュー