1. 概要
この Codelab では、Cloud Functions for Firebase を使用して、チャットアプリのユーザーに通知を送信することで、チャット ウェブアプリに機能を追加する方法を学びます。
学習内容
- Firebase SDK を使用して Google Cloud Functions を作成する。
- Auth、Cloud Storage、Cloud Firestore イベントに基づいて Cloud Functions をトリガーする。
- ウェブアプリに Firebase Cloud Messaging サポートを追加する。
必要なもの
2. サンプルコードを取得する
コマンドラインから GitHub リポジトリのクローンを作成します。
git clone https://github.com/firebase/friendlychat
スターター アプリをインポートする
IDE を使用して、サンプルコードのディレクトリから cloud-functions-start
ディレクトリを開くか、インポートします。このディレクトリには、この Codelab の開始用コードが含まれています。このコードは、完全に機能する Chat ウェブアプリで構成されています。
3. Firebase プロジェクトを作成してアプリを設定する
プロジェクトを作成する
Firebase コンソールで [プロジェクトを追加] をクリックし、プロジェクトに FriendlyChat という名前を付けます。
[プロジェクトを作成] をクリックします。
Blaze プランにアップグレードする
Cloud Functions for Firebase を使用するには、Firebase プロジェクトを Blaze の料金プランにアップグレードする必要があります。これを行うには、Google Cloud アカウントにクレジット カードなどのお支払い方法の手段を追加する必要があります。
Blaze プランのプロジェクトを含むすべての Firebase プロジェクトは、引き続き Cloud Functions の無料使用量の割り当てを利用できます。この Codelab で説明する手順は、無料枠の使用量の上限内に収まります。ただし、Cloud Functions ビルドイメージのホストに使用される Cloud Storage から少額の料金(約 $0.03)が請求されます。
クレジット カードをお持ちでない場合や、Blaze プランの継続に不安がある場合は、Firebase エミュレータ スイートの使用を検討してください。これにより、ローカルマシンで Cloud Functions を無料でエミュレートできます。
Google 認証を有効にする
ユーザーがアプリにログインできるようにするには、Google 認証を有効にする必要があります。
Firebase コンソールで [ビルド] セクションを開きます >認証 >[ログイン方法] タブ(またはこちらをクリックして移動)次に、Google ログイン プロバイダを有効にして [保存] をクリックします。これにより、ユーザーは Google アカウントでウェブアプリにログインできるようになります。
また、アプリの公開名を「Friendly Chat」に設定することもできます。
Cloud Storage を有効にする
アプリは Cloud Storage を使用して写真をアップロードします。Firebase プロジェクトで Cloud Storage を有効にするには、[ストレージ] セクションに移動し、[使ってみる] ボタンをクリックします。手順に沿って操作すると、Cloud Storage のロケーションにデフォルト値が使用されます。その後、[完了] をクリックします。
ウェブアプリを追加する
Firebase コンソールでウェブアプリを追加します。これを行うには、[Project Settings] に移動し、[Add app] まで下にスクロールします。プラットフォームとして [web] を選択し、Firebase Hosting を設定するチェックボックスをオンにしてアプリを登録し、[次へ] をクリックして残りの手順に進み、[コンソールに進む] をクリックします。
4. Firebase コマンドライン インターフェースをインストールする
Firebase コマンドライン インターフェース(CLI)を使用すると、ウェブアプリをローカルで提供し、ウェブアプリと Cloud Functions をデプロイできます。
CLI をインストールまたはアップグレードするには、次の npm コマンドを実行します。
npm -g install firebase-tools
CLI が正しくインストールされたことを確認するには、コンソールを開いて次のコマンドを実行します。
firebase --version
Firebase CLI のバージョンが 4.0.0 以降であることを確認して、Cloud Functions に必要な最新の機能をすべて含めます。バージョンが 8 以降でない場合は、上記のように npm install -g firebase-tools
を実行してアップグレードします。
次のコマンドを実行して Firebase CLI を承認します。
firebase login
cloud-functions-start
ディレクトリにいることを確認し、Firebase プロジェクトを使用するように Firebase CLI を設定します。
firebase use --add
次に、プロジェクト ID を選択し、画面の手順に沿って操作します。プロンプトが表示されたら、codelab
などの任意のエイリアスを選択できます。
5. ウェブアプリをデプロイして実行する
プロジェクトをインポートして構成したので、ウェブアプリを初めて実行する準備ができました。ターミナル ウィンドウを開き、cloud-functions-start
フォルダに移動して、次のコマンドを使用してウェブアプリを Firebase Hosting にデプロイします。
firebase deploy --except functions
コンソールに次のような出力が表示されます。
i deploying database, storage, hosting
✔ database: rules ready to deploy.
i storage: checking rules for compilation errors...
✔ storage: rules file compiled successfully
i hosting: preparing ./ directory for upload...
✔ hosting: ./ folder uploaded successfully
✔ storage: rules file compiled successfully
✔ hosting: 8 files uploaded successfully
i starting release process (may take several minutes)...
✔ Deploy complete!
Project Console: https://console.firebase.google.com/project/friendlychat-1234/overview
Hosting URL: https://friendlychat-1234.firebaseapp.com
ウェブアプリを開く
最後の行にホスティング URL が表示されます。これで、ウェブアプリはこの URL から提供されるはずです。URL は https://<プロジェクト ID>.firebaseapp.com の形式になっている必要があります。開きます。チャットアプリの実行時の UI が表示されます。
[Google でログイン] ボタンを使用してアプリにログインし、自由にメッセージを追加したり、画像を投稿したりできます。
新しいブラウザで初めてアプリにログインする場合は、通知の許可を求められたら、必ず許可してください。
後で通知を有効にする必要があります。
誤って [ブロック] をクリックしてしまった場合は、Chrome アドレスバーで URL の左にある [🔒 保護された通信] ボタンをクリックし、[通知] の横のバーを切り替えて設定を変更できます。
次に、Firebase SDK for Cloud Functions を使用して機能を追加します。
6. Functions ディレクトリ
Cloud Functions を使用すると、サーバーを設定しなくても Cloud で実行可能なコードを簡単に追加できます。Firebase Auth、Cloud Storage、Firebase Firestore データベースのイベントに反応する関数を作成する方法について説明します。Auth から始めましょう。
Firebase SDK for Cloud Functions を使用する場合、作成する関数のコードはデフォルトで functions
ディレクトリに保存されます。また、Functions コードは Node.js アプリでもあるため、アプリに関する情報を提供し、依存関係を一覧表示する package.json
が必要です。
コードを配置する functions/index.js
ファイルはすでに作成されています。先に進む前に、このファイルを確認してください。
cd functions
ls
Node.js に精通していない場合は、Codelab を続行する前に、Node.js について学習することをおすすめします。
package.json
ファイルには、Firebase SDK for Cloud Functions と Firebase Admin SDK という 2 つの必須依存関係がすでにリストされています。ローカルにインストールするには、functions
フォルダに移動して、次のコマンドを実行します。
npm install
次に、index.js
ファイルの内容を確認します。
index.js
/**
* Copyright 2017 Google Inc. All Rights Reserved.
* ...
*/
// TODO(DEVELOPER): Import the Cloud Functions for Firebase and the Firebase Admin modules here.
// TODO(DEVELOPER): Write the addWelcomeMessage Function here.
// TODO(DEVELOPER): Write the blurImages Function here.
// TODO(DEVELOPER): Write the sendNotification Function here.
必要なモジュールをインポートし、TODO の代わりに関数を 3 つ記述します。まず、必要な Node モジュールをインポートします。
7. Cloud Functions モジュールと Firebase Admin モジュールをインポートする
この Codelab には 2 つのモジュールが必要です。firebase-functions
は Cloud Functions のトリガーとログの書き込みを有効にします。firebase-admin
は、管理者権限を持つサーバーで Firebase プラットフォームを使用して、Cloud Firestore への書き込みや FCM 通知の送信などの操作を行えるようにします。
index.js
ファイルで、最初の TODO
を次のように置き換えます。
index.js
/**
* Copyright 2017 Google Inc. All Rights Reserved.
* ...
*/
// Import the Firebase SDK for Google Cloud Functions.
const functions = require('firebase-functions');
// Import and initialize the Firebase Admin SDK.
const admin = require('firebase-admin');
admin.initializeApp();
// TODO(DEVELOPER): Write the addWelcomeMessage Function here.
// TODO(DEVELOPER): Write the blurImages Function here.
// TODO(DEVELOPER): Write the sendNotification Function here.
Firebase Admin SDK は、Cloud Functions 環境やその他の Google Cloud Platform コンテナにデプロイするときに自動的に設定されるようにすることができます。これは、引数なしで admin.initializeApp()
を呼び出すと行われます。
次に、このチャットアプリにユーザーが初めてログインしたときに実行される関数を追加し、ユーザーに表示するウェルカム メッセージを追加します。
8. 新規ユーザーへのウェルカム メッセージ
チャット メッセージの構造
フレンドリーチャット チャット フィードに投稿されたメッセージは Cloud Firestore に保存されます。メッセージに使用するデータ構造を見てみましょう。そのためには、チャットに「Hello World」という新しいメッセージを投稿します。
これは次のように表示されます。
Firebase コンソールで、[Build] セクションの [Firestore Database] をクリックします。messages コレクションと、作成したメッセージを含む 1 つのドキュメントが表示されます。
このように、Cloud Firestore でチャット メッセージは messages
コレクションに name
、profilePicUrl
、text
、timestamp
という属性が追加されているドキュメントとして保存されています。
ウェルカム メッセージを追加する
最初の Cloud Function では、チャットに初めてログインするユーザーに表示するウェルカム メッセージを追加します。そのためには、トリガー functions.auth().onCreate
を使用します。このトリガーは、ユーザーが Firebase アプリに初めてログインするたびに関数を実行します。addWelcomeMessages
関数を index.js
ファイルに追加します。
index.js
// Adds a message that welcomes new users into the chat.
exports.addWelcomeMessages = functions.auth.user().onCreate(async (user) => {
functions.logger.log('A new user signed in for the first time.');
const fullName = user.displayName || 'Anonymous';
// Saves the new welcome message into the database
// which then displays it in the FriendlyChat clients.
await admin.firestore().collection('messages').add({
name: 'Firebase Bot',
profilePicUrl: '/images/firebase-logo.png', // Firebase logo
text: `${fullName} signed in for the first time! Welcome!`,
timestamp: admin.firestore.FieldValue.serverTimestamp(),
});
functions.logger.log('Welcome message written to database.');
});
この関数を特殊な exports
オブジェクトに追加することにより、Node でこの関数を現在のファイルの外部から使用できるようにします。Cloud Functions ではこの処理が必要です。
上の関数では、Firebase Bot によって投稿される新しいウェルカム メッセージをチャット メッセージのリストに追加します。そのためには、チャットのメッセージが保存される Cloud Firestore の messages
コレクションで add
メソッドを使用します。
これは非同期オペレーションであるため、Cloud Functions が早すぎるタイミングで実行されないように、Cloud Firestore の書き込みが完了したことを示す Promise を返す必要があります。
Cloud Functions の関数をデプロイする
Cloud Functions は、デプロイした後にのみアクティブになります。これを行うには、コマンドラインで次のコマンドを実行します。
firebase deploy --only functions
コンソールに次のような出力が表示されます。
i deploying functions
i functions: ensuring necessary APIs are enabled...
⚠ functions: missing necessary APIs. Enabling now...
i env: ensuring necessary APIs are enabled...
⚠ env: missing necessary APIs. Enabling now...
i functions: waiting for APIs to activate...
i env: waiting for APIs to activate...
✔ env: all necessary APIs are enabled
✔ functions: all necessary APIs are enabled
i functions: preparing functions directory for uploading...
i functions: packaged functions (X.XX KB) for uploading
✔ functions: functions folder uploaded successfully
i starting release process (may take several minutes)...
i functions: creating function addWelcomeMessages...
✔ functions[addWelcomeMessages]: Successful create operation.
✔ functions: all functions deployed successfully!
✔ Deploy complete!
Project Console: https://console.firebase.google.com/project/friendlypchat-1234/overview
関数をテストする
関数を正常にデプロイしたら、初めてログインするユーザーが必要です。
- ホスティング URL(
https://<project-id>.firebaseapp.com
の形式)を使用してブラウザでアプリを開きます。 - 新規ユーザーで、[Sign In] ボタンを使用してアプリで初めてログインします。
- すでにログインしている場合は、Firebase コンソール認証を開いて、ユーザーのリストから自分のアカウントを削除できます。その後、もう一度ログインします。
- ログインすると、ウェルカム メッセージが自動的に表示されます。
9. 画像の管理
ユーザーはチャットにあらゆる種類の画像をアップロードできます。特に公開のソーシャル プラットフォームでは、不適切な画像を管理することが重要です。FriendlyChat では、チャットに公開される画像は Google Cloud Storage に保存されます。
Cloud Functions では、functions.storage().onFinalize
トリガーを使用して新しい画像のアップロードを検出できます。これは、Cloud Storage で新しいファイルがアップロードされるかファイルが変更されるたびに実行されます。
画像の管理手順は次のとおりです。
- Cloud Vision API を使用して、画像にアダルト コンテンツや暴力的コンテンツが含まれていないか確認します。
- イメージにフラグが付いている場合は、実行中の Functions インスタンスにイメージをダウンロードします。
- ImageMagick を使用して画像にぼかしを入れます。
- ぼかしを入れた画像を Cloud Storage にアップロードします。
Cloud Vision API を有効にする
この関数では Google Cloud Vision API を使用するため、Firebase プロジェクトで API を有効にする必要があります。こちらのリンクにアクセスし、Firebase プロジェクトを選択して API を有効にします。
依存関係をインストールする
画像を管理するには、Node.js 用の Google Cloud Vision クライアント ライブラリ @google-cloud/vision を使用して、Cloud Vision API で画像を実行し、不適切な画像を検出します。
このパッケージを Cloud Functions アプリにインストールするには、次の npm install --save
コマンドを実行します。この操作は、必ず functions
ディレクトリから行ってください。
npm install --save @google-cloud/[email protected]
これにより、パッケージがローカルにインストールされ、宣言された依存関係として package.json
ファイルに追加されます。
依存関係をインポートして構成する
インストールされた依存関係と、このセクションで必要となる Node.js コアモジュール(path
、os
、fs
)をインポートするには、index.js
ファイルの先頭に次の行を追加します。
index.js
const Vision = require('@google-cloud/vision');
const vision = new Vision.ImageAnnotatorClient();
const {promisify} = require('util');
const exec = promisify(require('child_process').exec);
const path = require('path');
const os = require('os');
const fs = require('fs');
関数は Google Cloud 環境内で実行されるため、Cloud Storage ライブラリと Cloud Vision ライブラリを構成する必要はありません。プロジェクトを使用するように自動的に構成されます。
不適切な画像を検出する
functions.storage.onChange
Cloud Functions トリガーを使用します。このトリガーは、Cloud Storage バケットでファイルまたはフォルダが作成または変更されるとすぐにコードを実行します。index.js
ファイルに blurOffensiveImages
関数を追加します。
index.js
// Checks if uploaded images are flagged as Adult or Violence and if so blurs them.
exports.blurOffensiveImages = functions.runWith({memory: '2GB'}).storage.object().onFinalize(
async (object) => {
const imageUri = `gs://${object.bucket}/${object.name}`;
// Check the image content using the Cloud Vision API.
const batchAnnotateImagesResponse = await vision.safeSearchDetection(imageUri);
const safeSearchResult = batchAnnotateImagesResponse[0].safeSearchAnnotation;
const Likelihood = Vision.protos.google.cloud.vision.v1.Likelihood;
if (Likelihood[safeSearchResult.adult] >= Likelihood.LIKELY ||
Likelihood[safeSearchResult.violence] >= Likelihood.LIKELY) {
functions.logger.log('The image', object.name, 'has been detected as inappropriate.');
return blurImage(object.name);
}
functions.logger.log('The image', object.name, 'has been detected as OK.');
});
この関数を実行する Cloud Functions インスタンスの構成を追加しています。この関数はメモリを大量に消費するため、.runWith({memory: '2GB'})
ではデフォルトではなく 2 GB のメモリがインスタンスに割り当てられるようリクエストします。
この関数がトリガーされると、画像に対して Cloud Vision API が実行され、アダルト コンテンツや暴力的コンテンツが含まれていないかを検出します。これらの基準に基づいて画像が不適切と判断された場合、画像にぼかしを入れます。これは、次に説明するように blurImage
関数で行われます。
画像にぼかしを入れる
index.js
ファイルに次の blurImage
関数を追加します。
index.js
// Blurs the given image located in the given bucket using ImageMagick.
async function blurImage(filePath) {
const tempLocalFile = path.join(os.tmpdir(), path.basename(filePath));
const messageId = filePath.split(path.sep)[1];
const bucket = admin.storage().bucket();
// Download file from bucket.
await bucket.file(filePath).download({destination: tempLocalFile});
functions.logger.log('Image has been downloaded to', tempLocalFile);
// Blur the image using ImageMagick.
await exec(`convert "${tempLocalFile}" -channel RGBA -blur 0x24 "${tempLocalFile}"`);
functions.logger.log('Image has been blurred');
// Uploading the Blurred image back into the bucket.
await bucket.upload(tempLocalFile, {destination: filePath});
functions.logger.log('Blurred image has been uploaded to', filePath);
// Deleting the local file to free up disk space.
fs.unlinkSync(tempLocalFile);
functions.logger.log('Deleted local file.');
// Indicate that the message has been moderated.
await admin.firestore().collection('messages').doc(messageId).update({moderated: true});
functions.logger.log('Marked the image as moderated in the database.');
}
上記の関数では、画像バイナリが Cloud Storage からダウンロードされます。次に、ImageMagick の convert
ツールを使用して画像にぼかしを入れ、その画像を Storage バケットにアップロードし直します。次に、Cloud Functions インスタンスでファイルを削除してディスク領域を解放します。これは、同じ Cloud Functions インスタンスを再利用できるうえ、ファイルをクリーンアップしないとディスク領域が不足する可能性があるためです。最後に、画像がモデレートされたことを示すブール値をチャット メッセージに追加します。これにより、クライアントでメッセージの更新がトリガーされます。
関数をデプロイする
関数は、デプロイした後にのみ有効になります。コマンドラインで firebase deploy --only functions
を実行します。
firebase deploy --only functions
コンソールに次のような出力が表示されます。
i deploying functions
i functions: ensuring necessary APIs are enabled...
✔ functions: all necessary APIs are enabled
i functions: preparing functions directory for uploading...
i functions: packaged functions (X.XX KB) for uploading
✔ functions: functions folder uploaded successfully
i starting release process (may take several minutes)...
i functions: updating function addWelcomeMessages...
i functions: creating function blurOffensiveImages...
✔ functions[addWelcomeMessages]: Successful update operation.
✔ functions[blurOffensiveImages]: Successful create operation.
✔ functions: all functions deployed successfully!
✔ Deploy complete!
Project Console: https://console.firebase.google.com/project/friendlychat-1234/overview
関数をテストする
関数が正常にデプロイされたら、次の手順を行います。
- ホスティング URL(
https://<project-id>.firebaseapp.com
の形式)を使用してブラウザでアプリを開きます。 - アプリにログインしたら、画像をアップロードします。
- こちらの肉食ゾンビの画像など、不適切な画像を選んでアップロードします。少し待つと、投稿の画像がぼかしを入れた画像に置き換わります。
10. 新しいメッセージの通知
このセクションでは、新しいメッセージが投稿されたときにチャット参加者に通知を送信する Cloud Function を追加します。
Firebase Cloud Messaging(FCM)を使用すると、プラットフォームをまたいでユーザーに通知を確実に送信できます。ユーザーに通知を送信するには、FCM デバイス トークンが必要です。使用しているチャット ウェブアプリは、ユーザーが新しいブラウザまたはデバイスで初めてアプリを開いたときに、すでにデバイス トークンを収集しています。これらのトークンは、Cloud Firestore の fcmTokens
コレクションに保存されます。
ウェブアプリで FCM デバイス トークンを取得する方法については、Firebase ウェブ Codelab をご覧ください。
通知を送信する
新しいメッセージが投稿されたタイミングを検出するには、functions.firestore.document().onCreate
Cloud Functions トリガーを使用します。このトリガーは、Cloud Firestore の特定のパスに新しいオブジェクトが作成されたときにコードを実行します。index.js
ファイルに sendNotifications
関数を追加します。
index.js
// Sends a notifications to all users when a new message is posted.
exports.sendNotifications = functions.firestore.document('messages/{messageId}').onCreate(
async (snapshot) => {
// Notification details.
const text = snapshot.data().text;
const payload = {
notification: {
title: `${snapshot.data().name} posted ${text ? 'a message' : 'an image'}`,
body: text ? (text.length <= 100 ? text : text.substring(0, 97) + '...') : '',
icon: snapshot.data().profilePicUrl || '/images/profile_placeholder.png',
click_action: `https://${process.env.GCLOUD_PROJECT}.firebaseapp.com`,
}
};
// Get the list of device tokens.
const allTokens = await admin.firestore().collection('fcmTokens').get();
const tokens = [];
allTokens.forEach((tokenDoc) => {
tokens.push(tokenDoc.id);
});
if (tokens.length > 0) {
// Send notifications to all tokens.
const response = await admin.messaging().sendToDevice(tokens, payload);
await cleanupTokens(response, tokens);
functions.logger.log('Notifications have been sent and tokens cleaned up.');
}
});
上の関数では、Cloud Firestore データベースからすべてのユーザーのデバイス トークンを取得し、admin.messaging().sendToDevice
関数を使用して各トークンに通知を送信します。
トークンをクリーンアップする
最後に、無効になったトークンを削除します。これは、ユーザーから受け取ったトークンが、ブラウザやデバイスで使用されなくなった場合に発生します。たとえば、ユーザーがブラウザ セッションの通知権限を取り消した場合に発生します。これを行うには、index.js
ファイルに次の cleanupTokens
関数を追加します。
index.js
// Cleans up the tokens that are no longer valid.
function cleanupTokens(response, tokens) {
// For each notification we check if there was an error.
const tokensDelete = [];
response.results.forEach((result, index) => {
const error = result.error;
if (error) {
functions.logger.error('Failure sending notification to', tokens[index], error);
// Cleanup the tokens that are not registered anymore.
if (error.code === 'messaging/invalid-registration-token' ||
error.code === 'messaging/registration-token-not-registered') {
const deleteTask = admin.firestore().collection('fcmTokens').doc(tokens[index]).delete();
tokensDelete.push(deleteTask);
}
}
});
return Promise.all(tokensDelete);
}
関数をデプロイする
この関数はデプロイした後にのみアクティブになります。デプロイするには、コマンドラインで次のコマンドを実行します。
firebase deploy --only functions
コンソールに次のような出力が表示されます。
i deploying functions
i functions: ensuring necessary APIs are enabled...
✔ functions: all necessary APIs are enabled
i functions: preparing functions directory for uploading...
i functions: packaged functions (X.XX KB) for uploading
✔ functions: functions folder uploaded successfully
i starting release process (may take several minutes)...
i functions: updating function addWelcomeMessages...
i functions: updating function blurOffensiveImages...
i functions: creating function sendNotifications...
✔ functions[addWelcomeMessages]: Successful update operation.
✔ functions[blurOffensiveImages]: Successful updating operation.
✔ functions[sendNotifications]: Successful create operation.
✔ functions: all functions deployed successfully!
✔ Deploy complete!
Project Console: https://console.firebase.google.com/project/friendlychat-1234/overview
関数をテストする
- 関数が正常にデプロイされたら、ホスティング URL(
https://<project-id>.firebaseapp.com
形式)を使用してブラウザでアプリを開きます。 - 初めてアプリにログインする場合は、通知を表示したときに通知を許可してください:
- チャットアプリのタブを閉じるか、別のタブを表示します。通知はアプリがバックグラウンドで動作しているときのみ表示されます。アプリがフォアグラウンドで動作しているときにメッセージを受信する方法については、こちらのドキュメントをご覧ください。
- 別のブラウザ(またはシークレット ウィンドウ)を使用してアプリにログインし、メッセージを投稿します。最初のブラウザ()で通知が表示されます。
11. 完了
Firebase SDK for Cloud Functions を使用してチャットアプリにサーバー側コンポーネントを追加しました。
学習した内容
- Firebase SDK for Cloud Functions を使用して Cloud Functions を作成する。
- Auth、Cloud Storage、Cloud Firestore イベントに基づいて Cloud Functions をトリガーする。
- ウェブアプリに Firebase Cloud Messaging サポートを追加する。
- Firebase CLI を使用して Cloud Functions をデプロイする。
次のステップ
- その他の Cloud Functions 関数のトリガータイプについて確認する。
- 作成するアプリで Firebase と Cloud Functions を使ってみてください。