Firebase Functionsは、サーバーの管理をせずにコードを実行できるサービスです。ここでは、API開発における基本的なルールと進め方について解説します。
03_functions
フォルダにまとめて記述します。index.js
というファイルが、すべての処理の始まり(エントリーポイント)となります。exports.myApiName = ...
のように、exports
の後ろに記述した名前がそのままAPI名になります。これはFirebase Functionsのルールなので、この形式に従って命名してください。Firebase Functionsの最大の特徴は、特定の出来事(イベント)をきっかけ(トリガー)として、自動的にプログラムを実行できる点にあります。ここでは、代表的なトリガーの種類を紹介します。
https.onRequest
)これは、URLが発行され、外部からアクセスできる最も一般的なAPIです。Webサイトやスマホアプリ、IoTデバイスなど、あらゆるものから呼び出せる万能なAPIと言えます。誰でもアクセスできてしまうため、必要に応じてアクセスできるドメインを制限するなどのセキュリティ対策が別途必要になります。
https.onCall
)主に、Firebaseで開発しているWebサイトやアプリの内部で使うためのAPIです。onRequest
と違い、面倒なセキュリティ設定をせずとも、Firebaseが認証情報を自動で引き継いでくれるため、安全かつ簡単にAPIを呼び出せます。クライアント側(ブラウザなど)からは、関数名を指定するだけで利用できるため、Firebase環境で開発を行う上で最も迅速かつ便利な方法です。
storage.bucket(' ').object().onFinalize
)Google Cloud Storageにファイルがアップロードされたことをきっかけに処理を実行するトリガーです。例えば、「CSVファイルがアップロードされたら、その内容を自動でデータベースに登録する」といった、裏側のバッチ処理によく使われます。
pubsub.schedule
)「毎日深夜1時に実行」「1時間ごとに実行」など、決まった時間に繰り返し処理を実行したい場合に使うトリガーです。定期的なデータ集計やバックアップなどのバッチ処理に最適です。
コードをきれいに保ち、効率的に開発するためのポイントです。
ロジックの外部ファイル化:
index.js
に全ての処理を書いていくと、コードが長くなり非常に見づらくなります。APIの具体的な処理内容は別のファイルに書き出し、index.js
からはそのファイルを呼び出すだけの形にしましょう。これにより、コードの可読性とメンテナンス性が格段に向上します。
高い再利用性:
処理内容を別ファイルに分けておくことで、コードの使い回しが簡単になります。例えば、最初は定期実行のバッチ処理(pubsub.schedule
)として作った機能を、後から「好きなタイミングで実行できるAPI(https.onCall
)にしたい」といった場合も、呼び出すトリガーの種類を変えるだけで簡単に対応できます。
実際にAPIを作成する上での具体的なポイントを解説します。
簡単なAPI作成: 多くの場合、既存のAPIのコードをコピーし、データベースへの問い合わせ部分(SQLクエリなど)を書き換えるだけで、新しいAPIを素早く作成できます。
環境変数 (Environment Configuration): データベースのパスワードのような機密情報や、開発環境と本番環境で異なる設定値を、コード内に直接書くのは非常に危険です。このような値は「環境変数」としてFirebaseに設定しておくことで、安全に管理できます。コードからはこの設定値を呼び出して使うため、環境ごとに接続先を切り替えるといったことも簡単に行えます。
BigQueryとの連携: Firebase FunctionsからBigQueryへのアクセスは非常にシンプルです。コード内にSQLクエリを記述し、いくつかのオプションを設定するだけで、簡単にデータを取得できます。
クライアント(ブラウザ)からの呼び出し:
https.onCall
で作成したAPIは、WebサイトのJavaScriptから以下のように簡単に呼び出せます。await
を使うことで、処理が終わるまで待って結果を受け取ることができます。
// 'apiName'の部分を、作成したAPIの名前に書き換える
const myFunction = firebase.functions().httpsCallable('apiName');
const result = await myFunction({ key: 'value' }); // APIにデータを渡すことも可能
console.log(result.data); // APIからの返り値を取得