Lapis Lazuli

technical blog for web developer

【firebase】functionsのつかいかた

以前のfirebase記事の続編です。
今回はfunctionsに焦点を当ててみます。

functionsとはなんぞや

functionsは、いわゆるサーバーレスでコードを実行するサービスです。
AWSのlambdaやGCPのGAEと似たようなサービスと言ったらわかりやすいでしょうか。

違う所といえば、それらのサービスは複数の言語をサポートしているのですが、functionsがサポートしてるのはNode.jsのみになります。

なので不自由な面はあるのですが、同じfirebaseのサービスであるhostingと組み合わせて使うと、javascriptのみで完結するので親和性はいいんじゃないでしょうか。

設定方法

では早速functionsの設定に入っていきましょう。
firebaseのサービス全般を使うには、firebase-cliの導入が必要です。npmでサクッと入れちゃいましょう。(node.js導入済み前提)

npm install -g firebase-tools

次に使用しているfirebaseのアカウントを設定します。
なお、これはGoogleアカウントと共通ですので、GCP使っていたらそのまま使用できます。

firebase login

ブラウザが立ち上がり認証が始まりますが、画面に従って進めれば問題なく完了できます。
設定が完了したら、次にプロジェクトを設置するディレクトリに移動します。
ここで初期化をすれば開発環境構築は完了です。

firebase init functions

一式がプロジェクトルートに設置されたと思います。以下のようになっていればOKです。

project_root
 +- .firebaserc    
 |
 +- firebase.json
 |
 +- functions/
      |
      +- .eslintrc.json
      |
      +- package.json
      |
      +- index.js
      |
      +- node_modules

これで設定は完了です。主にfunctionsディレクトリの中身で作業することにになります。

functionの作成&デプロイ

functionsディレクトリの中にあるindex.jsを開いてみましょう。
実行するfunctionを書くファイルになります。もう殆どこれしか触りません。そこまで複雑な仕組みではないので。

最初にimportして初期化する処理を書いておきましょう。

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();

functionsの機能を使う事ができます。
以下はAPIから記事をとってくる関数の一例です。

exports.getArticles = functions.https.onCall(async (data, context) => {
    const snapshot = await db.collection("article").get();
    const news = new Array();
    snapshot.forEach((doc) => {
        news.push(doc.data());
    });
    return news;
});

これはfirestoreも使ってるのですが・・・firestoreに関してはまた別途書きます。

処理を書いたらデプロイしましょう。
プロジェクトルート(つまりfunctionsの上)で

firebase deploy --only functions

を実行します。
設定は済んでいるので、これだけでデプロイ完了です。メチャクチャ簡単ですね。

TypeScriptも使える

基本的にjsですが、typescriptも選べます。
その場合は事前にトランスパイルしてデプロイするか、デプロイしてHookでトランスパイルするかの2通りのやり方があります。
僕はお手軽なので前者でやってるのですが、手間を考えると後者でやったほうがいいかもしれません。

まとめ

以上がfunctionsの設定からデプロイまでの一連の流れになります。
最初やったとき、あまりにも簡単すぎてビックリしました。ほぼコード書くことだけに専念できる作りになってますね。
なお、ログ等は管理画面から見られるので特段準備は必要ありません。