わしのlog

プログラミングとかバイクとか。

【メモ】Cloud Functions for Firebase用の関数をWSLでデバッグする際、認証情報を使う

概要

Google Cloud Functions for Firebaseでは
ローカルデバッグ用のエミュレータが利用できるようになっています。

firebase.google.com

このローカルデバッグ時に認証情報が必要な処理があった場合
認証エラーとなってしまう件についてのメモ。
いつも通り、WSLでのお話。

環境

OS: Windows 10 Pro 64bit(with WSL)

詳細

firebase.google.com

こちらのチュートリアル通りにすすめていくと、4. 必要なモジュールをインポートしてアプリを初期化するの項で
firebase-admin を使用する旨が書かれています。
この処理をデバッグ時に通すと認証エラーになってしまいます。
(tokenとか指定してないので当たり前なんですが・・・)
で、公式ドキュメントを漁ってみると・・・ありました。

firebase.google.com

手順通りにすすめてみる

ほうほう、まず秘密鍵ファイルを作成して、任意の場所に保存。
その後コンソールでexport GOOGLE_APPLICATION_CREDENTIALS="/path/to/hoge.json"を実行しなさい、と。
(ただし一時的なもの=現在のコンソールでのセッションでのみ有効)
別途コード内にベタ書きする手法も書いてますが、推奨されてないみたいですね。

ではでは同様の手順を実行して、と・・・。

[yyyy-mm-ddThh:mm:ss.SssZ]  @firebase/database: FIREBASE WARNING: {"code":"app/invalid-credential","message":"Credential implementation provided to initializeApp() via the \"credential\" property failed to fetch a valid Google OAuth2 access token with the following error: \"Error fetching access token: Error while making request: getaddrinfo ENOTFOUND metadata.google.internal metadata.google.internal:80. Error code: ENOTFOUND\"."}

うん、ダメやないかい
多分環境変数が読めてないんだろうな~
ってことで該当のnodeモジュール内にconsole.logを仕込んでみることに。
えーと・・・firebase_admin/lib/auth/credential.js・・・これかな。
getApplicationDefault関数内で該当の環境変数を読み取ってそうなところがあったので、そこに仕込むと・・・
undefined
やっぱり。

他の手法を探す

  • ホスト側(Windows)の環境変数GOOGLE_APPLICATION_CREDENTIALSを設定してみる
    →駄目。cmdやらPowerShellで実行するなら問題なさげですが・・・
  • node_modulesを削除して再度npm iして実行
    →駄目。今回の件には全く関係ない
  • 前回の記事通り、コマンド実行時に環境変数を定義して渡す。
    →いけました。WSLだとこれじゃないと駄目?
    ※参考記事

dev-daikichi.hatenablog.com

この記事にあるように、以下コマンドを実行
GOOGLE_APPLICATION_CREDENTIALS="/path/to/hoge.json" npm run serve
(package.jsonにscriptsがあったのでこのコマンド。恐らくfirebase emulators:startでもOK)
やっと実行できましたね。

終わりに

今回はWSLでGCF for Firebaseのデバッグ実行について書きました。
強制的に環境変数を定義する手法でなんとかなりましたが、他にいい方法があれば
誰か教えていただけると助かります・・・。
とりあえず、これでWSLでのデバッグ実行は問題ないですね。

現場からは以上です。