Cloud Functionsをローカルで実行する

2020/11/09

FirebaseのCloud Functionsを使えば手軽にAPIが作れてとても便利です。
ただ,Functionsはデプロイするのに少し時間がかかるのでいちいちデプロイせずにローカルで実行できるようにしていきます。

Functionsローカル実行

秘密鍵の作成

1. Firebaseコンソールの左上にある歯車から「プロジェクトを設定」をクリック

image

2. 「サービス アカウント」をクリック

image

3. 「新しい秘密鍵の生成」をクリック

image

4. 「キーを生成」」をクリック

image

すると{firebaseアプリ名}-firebase-adminsdk-xxxxx-xxxxxxxxxx.jsonというjsonファイルがダウンロードさまれます。
警告の通り,公開レポジトリには置かないようにしましょう。

コマンドを打つときにファイル格納場所を指定するので,格納場所は任意ですが,今回はfunctionsのリソースと同階層のfunctions/srcに格納しておきます。
リポジトリを公開している場合はこのタイミングで.gitignoreの設定をしましょう。

ローカル実行

$ GOOGLE_APPLICATION_CREDENTIALS={秘密鍵の格納場所(例:/functions/src/papa-point-xxxxxxxx-firebase-adminsdk-xxxxx-xxxxxxxxxx.json)}
$ firebase serve --only functions

i  functions: Watching "/papa-point/functions" for Cloud Functions...
✔  functions[totalPoints]: http function initialized (http://localhost:5000/papa-point-xxxxxx/asia-northeast1/totalPoints).

ローカル実行できました!
http://localhost:5000/papa-point-xxxxxx/asia-northeast1/totalPointsへアクセスすると期待していたJsonが返ってきました。
ちなみにGOOGLE_APPLICATION_CREDENTIALSは秘密鍵のファイル位置を示す環境変数です。

おまけ

ローカル実行できるようにいなったのはいいけど,今度はデプロイ時にエラー(lint)が出るようになってしまいました。

$ firebase deploy --only functions

=== Deploying to 'papa-point-app'...

i  deploying functions
Running command: npm --prefix "$RESOURCE_DIR" run lint

> functions@ lint /papa-point/functions
> eslint "src/**/*"

/papa-point/functions/src/papa-point-app-firebase-adminsdk-xxxxx-xxxxxxxxxx.json
  0:0  error  Parsing error: "parserOptions.project" has been set for @typescript-eslint/parser.
The file does not match your project config: src/papa-point-app-firebase-adminsdk-bpwvb-1fd9aeb7fa.json.
The extension for the file (.json) is non-standard. You should add "parserOptions.extraFileExtensions" to your config

先程追加した秘密鍵でlintエラーになってしまってます。。。
エラー文にあるようにparserOptions.extraFileExtensions.eslintrc.jsで設定してやり再度実行。

kohe papa-point $firebase deploy --only functions

=== Deploying to 'papa-point-app'...

i  deploying functions
Running command: npm --prefix "$RESOURCE_DIR" run lint

> functions@ lint /Users/suzukikouhei/Documents/repositorys/papa-point/functions
> eslint "src/**/*"


/Users/suzukikouhei/Documents/repositorys/papa-point/functions/src/papa-point-app-firebase-adminsdk-bpwvb-1fd9aeb7fa.json
  0:0  error  Parsing error: "parserOptions.project" has been set for @typescript-eslint/parser.
The file does not match your project config: src/papa-point-app-firebase-adminsdk-bpwvb-1fd9aeb7fa.json.
The file must be included in at least one of the projects provided

またしてもエラーです。
ファイルがどこからもimportされない場合に表示されるエラーのようです。 このjsonファイルはローカル実行時のみに使うため,どうしようもなさそうなので,.eslintignoreに入れて強制的に黙らせました。

まとめ

functionsをローカル実行できるようになりました。
これで少しは開発スピードが上がるはず!!!

それではまた明日。


書いた人: こへ
音楽と漫画と読書とアニメとスノボが好き。多趣味でいろんなことに興味有ります。 誰しもが一度は使った事があるもののIoT開発をしてます。
Twitterフォローお願いします。