5分でサーバレスを体験! Cloud Functions for Firebase を使ってみよう | SiTest (サイテスト) ブログ

メニューボタン閉じるボタン

5分でサーバレスを体験! Cloud Functions for Firebase を使ってみよう

近日、サーバレスアーキテクチャという言葉を耳にするようになりましたね。
サーバレスアーキテクチャとは、サーバを意識せずともアプリを作成できるアーキテクチャのことであり、サーバーレスコンピューティングサービスによりなりたっていることが多いです。

有名どころだと AWS LambdaGoogle Cloud Functions などがあげられますね。

Faas( Function as a Service ) とも呼ばれることがあります。

また、少し似たもので、 Baas( Backend as a service )という提供形態も存在します。
Firebase が有名で、バックエンドをほぼ提供してくれるので、手軽な反面、自由度が低いという課題がありました。

その課題を解決するのが、今回ご紹介する「 Cloud Functions for Firebase 」です。
Firebase を使いたいけど、もう少し自由度も欲しいといった人向けのサービスです。

今回は Cloud Functions for Firebase の Functions を使うところまで見ていきましょう。

スポンサーリンク

Cloud Functions for Firebase ってなに?

Cloud Functions for Firebase

データベースへの書き込みやHTTPSリクエストなどのイベントをトリガーにしてコードを実行できる機能です。
サポート言語としては、 Node.js のみとなっています。

サンプルがいくつか用意されておりますので、下記の GitHub から確認できます。

https://github.com/firebase/functions-samples

※ 現在、 Cloud Functions for Firebase は Beta 版となっております。

Cloud Functions for Firebase を使ってみよう

Node.js, npm ともにインストールされており、 Firebase のアカウントを持っていることを前提としています。

Firebase の概要からアカウント作成までは下記の記事を参考に作成してください。

Firebase を使ってサイトを無料で公開してみる

それでは、まず Firebase のプロジェクトを作成しましょう。
今回は、「 cloud-functions 」というプロジェクト名で作成しています。

Firebase プロジェクト作成

外部と通信を行うため、プランを Spark から Blaze に変更しておいてください。

Firebase プラン変更

次は CUI 上で作業していきます。

お好きなディレクトリにプロジェクトを作りましょう。

mkdir cloud_functions
cd cloud_functions

次にFirebase にログインしましょう。

firebase login

Functions を追加していきます。

firebase init functions

Select a default Firebase project for this directory とでますので、
cloud-functions を選択してください。

firebase init functions

すると、 functions というディレクトリが作成されますので、
移動して、 index.js が存在するのを確認します。

index.js を下記のように書き換えて下さい。

// The Cloud Functions for Firebase SDK to create Cloud Functions and setup triggers.
const functions = require('firebase-functions');

// The Firebase Admin SDK to access the Firebase Realtime Database. 
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);

// Take the text parameter passed to this HTTP endpoint and insert it into the
// Realtime Database under the path /messages/:pushId/original
exports.addMessage = functions.https.onRequest((req, res) => {
  // Grab the text parameter.
  const original = req.query.text;
  // Push the new message into the Realtime Database using the Firebase Admin SDK.
  admin.database().ref('/messages').push({original: original}).then(snapshot => {
    // Redirect with 303 SEE OTHER to the URL of the pushed object in the Firebase console.
    res.redirect(303, snapshot.ref);
  });
});

// Listens for new messages added to /messages/:pushId/original and creates an
// uppercase version of the message to /messages/:pushId/uppercase
exports.makeUppercase = functions.database.ref('/messages/{pushId}/original')
    .onWrite(event => {
      // Grab the current value of what was written to the Realtime Database.
      const original = event.data.val();
      console.log('Uppercasing', event.params.pushId, original);
      const uppercase = original.toUpperCase();
      // You must return a Promise when performing asynchronous tasks inside a Functions such as
      // writing to the Firebase Realtime Database.
      // Setting an "uppercase" sibling in the Realtime Database returns a Promise.
      return event.data.ref.parent.child('uppercase').set(uppercase);
    });

ここでは、 addMessage() というリアルタイムデータベースに書き込むためのURLを吐き出してくれる関数と
makeUppercase() というリアルタイムデータベースの書き込みをトリガーして、テキストを大文字に変換する関数を使っています。

実際にデプロイして、処理を見ていきましょう。

firebase deploy --only functions

デプロイが完了すると、URLが吐き出されます。

addMessage() URL吐き出し

{URL} + ?text=uppercasemetoo
をブラウザで叩いてみましょう。

その後、 Firebase の管理画面に戻り、 Database を開いてみましょう。

Frebase database 確認

original: “uppercasemetoo” と
大文字になった uppercase: “UPPERCASEMETOO” が保存されているのがわかります。

また、Functions のダッシュボードを確認しても、指定した関数が叩かれているのを確認できます。

Firebase Functions 確認

少しですが、サーバレスを体験できましたね。

いかがでしたでしょうか?

今回はデータベースへの保存から大文字変換まで行いましたが、他にも、認証イベント、 分析イベントと様々なサンプルが用意されていますので、是非、試してみてください。