Cloud Functions for FirebaseでNode.js v8を使ってみる
こんにちは。
クラウドソリューショングループのwatanabe.tです。
7/24-26にサンフランシスコで行われたGoogle Cloud Next ’18では様々な発表がありましたね。
今回はその中でも興味深かった、Cloud FunctionsのNode.js v8サポートについてお話します。
事前準備
Cloud Functions for FirebaseでNode.js v8をサポートする上でいくつか準備して置かなければいけないことがあります。
Node.js v8のインストール
Cloud Functionsを利用してアプリケーションを構築する上で、ローカルでのデバッグは必須です。
そのためにも今回の実行環境であるNode v8.11.1を入れておきましょう。
Windowsを使っている人は公式ページから、macを使っている人はnodebrewを利用すると良いでしょう。
firebase-toolsのインストール
Node.jsをインストールできたら、firebaseの諸々の操作をするためにfirebase-toolsをインストールしておきましょう。
npm install -g firebase-tools
firebase-toolsの細かいセットアップについてはコチラ
プロジェクトのセットアップ
firebase toolsのインストールが完了したら、プロジェクトのセットアップを行います。
firebase init functions
関連付けるプロジェクト、使用言語(今回はJavaScript)、ESLintの使用の有無を選択するとセットアップの完了です。
functionsディレクトリの中にpackage.jsonが生成されていることを確認してください。
Runtimeの変更
プロジェクトのセットアップが完了したら、Node.js v8を利用するための設定を変更します。
といっても、 package.json
に以下を追加するだけのシンプルな作業で完了です。
"engines": {
"node": "8"
}
これだけだと少し分かりづらいので、前後の設定も載せておきます。
{
"name": "functions",
"description": "Cloud Functions for Firebase",
"engines": {
"node": "8"
}
}
デプロイしてみる
設定が有効になっているか、実際にデプロイして確認してみましょう。
Node.js v8で使えるようになった機能の一つに、async/awaitがあります。
これを確認するため、index.jsを以下のように書き換えてみました。
const functions = require('firebase-functions');
const sleep = async (time) => {
return new Promise(resolve => {
setTimeout(() => {
resolve();
}, time);
})
}
const greet = async (members) => {
for (let i = 0; i < members.length; i++) {
const result = await sleep(5000);
console.log(`Hello, ${members[i]}`);
}
}
exports.helloWorld = functions.https.onRequest((request, response) => {
const members = ['Ken', 'Bob', 'Tom'];
greet(members);
response.send("Hello from Firebase!");
});
ここまでできたらfunctionsをデプロイします。
firebase deploy --only functions
デプロイが完了するとFirebaseのコンソールからエンドポイントが確認できます。
そこにcurlなどでリクエストを投げてみると、すぐにレスポンスが返ってきます。
Firebaseコンソールからログを確認すると、下図のようにデバッグログが一定時間を空けて順に表示されていることがわかります。
これでasync/awaitが効いていることが確認できました。
まとめ
やっとCloud FunctionsがGAになっただけでなく、Node.js v8にも対応してくれました。
(ただしGAはNode.js v6のみ、v8はベータ版です……)
これで本格的にCloud Functionsをアプリケーションに利用することができますね。
まだまだ進化するGCPファミリーからまだまだ目が離せません!