概要
このラボでは、オンライン クイズ アプリケーションの機能を強化するために、Cloud Pub/Sub メッセージを処理する Cloud Functions の関数を作成します。
そのプロセスでは、サーバーレス環境で複数の GCP プロダクト(Cloud Pub/Sub、Cloud Natural Language API、Cloud Spanner)を利用します。
目標
このラボでは、次のタスクの実行方法について学びます。
- Cloud Pub/Sub メッセージに応答する Cloud Functions の関数を作成する。
- Cloud Functions の関数に複数のファイルをデプロイする。
設定と要件
各ラボでは、新しい Google Cloud プロジェクトとリソースセットを一定時間無料で利用できます。
-
Qwiklabs にシークレット ウィンドウでログインします。
-
ラボのアクセス時間(例: 1:15:00)に注意し、時間内に完了できるようにしてください。
一時停止機能はありません。必要な場合はやり直せますが、最初からになります。
-
準備ができたら、[ラボを開始] をクリックします。
-
ラボの認証情報(ユーザー名とパスワード)をメモしておきます。この情報は、Google Cloud Console にログインする際に使用します。
-
[Google Console を開く] をクリックします。
-
[別のアカウントを使用] をクリックし、このラボの認証情報をコピーしてプロンプトに貼り付けます。
他の認証情報を使用すると、エラーが発生したり、料金の請求が発生したりします。
-
利用規約に同意し、再設定用のリソースページをスキップします。
Google Cloud Shell の有効化
Google Cloud Shell は、開発ツールと一緒に読み込まれる仮想マシンです。5 GB の永続ホーム ディレクトリが用意されており、Google Cloud で稼働します。
Google Cloud Shell を使用すると、コマンドラインで Google Cloud リソースにアクセスできます。
-
Google Cloud コンソールで、右上のツールバーにある [Cloud Shell をアクティブにする] ボタンをクリックします。

-
[続行] をクリックします。
環境がプロビジョニングされ、接続されるまでしばらく待ちます。接続した時点で認証が完了しており、プロジェクトに各自のプロジェクト ID が設定されます。次に例を示します。

gcloud は Google Cloud のコマンドライン ツールです。このツールは、Cloud Shell にプリインストールされており、タブ補完がサポートされています。
- 次のコマンドを使用すると、有効なアカウント名を一覧表示できます。
gcloud auth list
出力:
Credentialed accounts:
- @.com (active)
出力例:
Credentialed accounts:
- google1623327_student@qwiklabs.net
- 次のコマンドを使用すると、プロジェクト ID を一覧表示できます。
gcloud config list project
出力:
[core]
project =
出力例:
[core]
project = qwiklabs-gcp-44776a13dea667a6
注:
gcloud ドキュメントの全文については、
gcloud CLI の概要ガイド
をご覧ください。
タスク 1. ケーススタディ用アプリケーションを準備する
このセクションでは、Cloud Shell にアクセスしてクイズ アプリケーションを含む Git リポジトリのクローンを作成してから、環境変数を構成してアプリケーションを実行します。
Cloud Shell でソースコードのクローンを作成する
- 次のコマンドを入力して、ラボ用にリポジトリのクローンを作成します。
git clone --depth=1 https://github.com/GoogleCloudPlatform/training-data-analyst
- 作業ディレクトリへのショートカットとしてソフトリンクを作成します。
ln -s ~/training-data-analyst/courses/developingapps/v1.3/nodejs/cloudfunctions ~/cloudfunctions
ケーススタディ用アプリケーションを構成、実行する
- 次のコマンドを入力して、作業ディレクトリを変更します。
cd ~/cloudfunctions/start
- ファイルのデフォルトのリージョンをラボで割り当てられたリージョンに置き換えるには、次のコマンドを使用します。
export APP_REGION={{{project_0.startup_script.app_gcp_region | APP_REGION}}}
export REGION={{{project_0.default_region | REGION}}}
sed -i 's/us-central1/'"$REGION"'/g' prepare_environment.sh
sed -i 's/us-central/'"$APP_REGION"'/g' prepare_environment.sh
- 次のコマンドを入力して、クイズ アプリケーションを構成します。
. prepare_environment.sh
注: このスクリプト ファイルを実行すると、以下の処理が行われます。
- App Engine アプリケーションが作成される。
- 環境変数
GCLOUD_PROJECT と GCLOUD_BUCKET がエクスポートされる。
-
npm install が実行される。
- Cloud Datastore にエンティティが作成される。
- Cloud Pub/Sub トピックが作成される。
- Cloud Spanner のインスタンス、データベース、テーブルが作成される。
- Google Cloud プロジェクト ID が出力される。
- 次のコマンドを入力して、ウェブ アプリケーションを実行します。
npm start
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
ケーススタディ用アプリケーションを構成、実行する
タスク 2. Cloud Functions を操作する
このセクションでは、Google Cloud プロジェクトに Cloud Functions の関数を作成します。この関数は Cloud Pub/Sub にメッセージがパブリッシュされるとトリガーされ、アプリケーションを実行して、Cloud Functions の関数の呼び出しをモニタリングします。
Cloud Functions の関数を作成する
-
Cloud Run functions にアクセスするには、ナビゲーション メニュー(
)で [Cloud Run] をクリックします。
-
[関数を作成] をクリックします。
-
[サービス名] に「process-feedback」と入力します。
-
[リージョン] で [] リージョンを選択します。
-
[+ トリガーを追加] をクリックし、プルダウンから [Pub/Sub トリガー] を選択します。
-
必要に応じて、[有効にする] をクリックして必要な API を有効にします。
[Pub/Sub トリガー] ウィンドウで、次のように指定します。
| プロパティ |
値 |
| トリガーのタイプ |
Google のソース |
| イベント プロバイダ |
Cloud Pub/Sub |
| イベント タイプ |
google.cloud.pubsub.topic.v1.messagePublished |
| Cloud Pub/Sub トピック |
projects/PROJECT_ID/topics/feedback |
| リージョン |
|
Pub/Sub に必要なロール roles/iam.serviceAccountTokenCreator を Pub/Sub サービス アカウントに付与するように求められたら、[付与] をクリックします。
-
[トリガーを保存] をクリックします。
-
[作成] をクリックします。
-
提供された関数の実装を確認します。
注: Cloud Functions の関数が作成されるまでに 1~2 分かかる場合があります。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
Cloud Functions の関数を作成する
ウェブ アプリケーションを実行する
-
Cloud Shell ウィンドウに戻ります。
- [ウェブでプレビュー] ボタン、[ポート 8080 でプレビュー] の順に選択して、ウェブ アプリケーションをプレビューします。
- [Take Test] をクリックします。
- [Places] をクリックします。
- 質問に答えます。
- クイズを評価し、フィードバックを入力したら、[Send Feedback] をクリックします。
Cloud Functions の関数のモニタリングとログの内容を確認する
-
Cloud Platform コンソールで [Cloud Run] のページに戻ります。
- [process-feedback] をクリックします。
注: Cloud Functions の関数の呼び出しに関するモニタリング グラフが表示されます。
関数の呼び出しデータがグラフに表示されるまでには数分かかります。
- [ログ] タブをクリックして、ログを表示します。
- ログ エクスプローラでログを表示するには、ページの右上にあるリンクをクリックします。
- Cloud Pub/Sub メッセージが表示されない場合は、[更新] をクリックします。
注: Cloud Functions 関数から収集されたログエントリが表示されます。
関数の呼び出しデータがログに表示されるまでに数分かかります。
- Cloud Shell に移動してフィードバックも確認します。
タスク 3. ケーススタディ用アプリケーションのコードを確認する
このセクションでは、Cloud Shell テキスト エディタを使用して、このケーススタディ用アプリケーションのコードを確認します。
Cloud Shell エディタを起動する
-
Cloud Platform コンソールで、[エディタを開く] をクリックします。
![[エディタを開く] ボタンがハイライト表示されている](https://cdn.qwiklabs.com/ImLReX%2F5QWFFOFpL%2FBCIeTzdY94ObO3QeVax0KpTsOM%3D)
Cloud Functions 関数のアプリケーション コードの構造を確認する
-
cloudfunctions/start に移動します。
-
...function フォルダ内にある index.js ファイルを選択します。
注: このファイルには、Cloud コンソールの [Cloud Functions] ウィンドウのサンプルとほぼ同じコードが含まれています。この後で記述する関数は Promise を返すためコールバックの引数がない点が異なります。
-
package.json ファイルを選択します。
注: このファイルには、この関数の実行に必要な依存関係のリストが含まれています。
これらの依存関係は Cloud Functions によって自動的にインストールされます。
-
languageapi.js ファイルを選択します。
注: このファイルには、フィードバック テキストを処理して Natural Language ML API の感情スコアを返すコードが含まれています。
- [spanner.js] ファイルを選択します。
注: このファイルには、Cloud Spanner データベースにレコードを挿入するコードが含まれています。
タスク 4. Cloud Functions の関数のコードを記述する
このセクションでは、Cloud Pub/Sub メッセージ データの取得、Natural Language ML API の呼び出しと感情の検出、Cloud Spanner へのレコードの挿入を行う Cloud Functions の関数を作成するためのコードを記述します。
注: 次の文字列の間のコードを更新してください。
// TODO
// END TODO
学習効果を最大限に高めるために、コード、インライン コメント、関連する API ドキュメントを確認してください。
コードを記述して Cloud Functions の関数を変更する
-
...function/index.js ファイルに戻ります。
-
languageapi と spanner のモジュールを読み込みます。これらのモジュールは、index.js ファイルと同じフォルダにあります。
-
subscribe() メソッドで、Cloud Pub/Sub メッセージをバッファに読み込む既存のコードの後に、Pub/Sub メッセージを JSON データとして解析してフィードバック オブジェクトに変換するコードを記述します。
-
languageapi モジュールに含まれる、フィードバック テキストを分析するための analyze メソッドを呼び出す Promise を返します。
- return ステートメントの最後にメソッド チェーンで
.then(...) メソッドを追加します。
- コールバックの値としてアロー関数を記述します。
- アロー関数の本文に、Natural Language API の感情スコアをコンソールにロギングするコードを記述します。
- フィードバック オブジェクトに score という新しいプロパティを追加します。
- フィードバック オブジェクトを返してアロー関数本文を完成させます。
- 最初のメソッドの最後に、メソッド チェーンで 2 つ目の
.then(...) メソッドを追加します。この 2 つ目のメソッドでは、spanner モジュールを使用してフィードバックを保存します。
- メソッド チェーンで 3 つ目の
.then(...) メソッドを記述します。引数がなくコールバックの値として本文が空のアロー関数を含めます。
- このコールバックの本文では、フィードバックが保存されたことを示すメッセージをロギングし、成功のメッセージを返します。
- チェーンの最後に
.catch(...) ハンドラを追加し、コンソールにエラー メッセージがロギングされるようにします。
注: 上記の手順を行うと、関数は以下のようになります。
function/index.js
// TODO: ./languageapi モジュールを読み込む
const languageAPI = require('./languageapi');
// END TODO
// TODO: ./spanner モジュールを読み込む
const feedbackStorage = require('./spanner');
// END TODO
exports.subscribe = function subscribe(event) {
// Cloud Pub/Sub メッセージ オブジェクト。
// TODO: Cloud Pub/Sub メッセージをデコードして
// feedbackObject データを抽出する
// Pub/Sub から受信するメッセージは base64 でエンコードされ
// 受講者が送信するデータは data プロパティにある
const pubsubMessage = Buffer.from(event.data, 'base64').toString();
let feedbackObject = JSON.parse(pubsubMessage);
console.log('Feedback object data before Language API:' + JSON.stringify(feedbackObject));
// END TODO
// TODO: Natural Language API 感情分析を実行する
// analyze(...) メソッドは、feedbackObject に含まれる
// フィードバック テキストを引数として受け取り
// Promise を返す
return languageAPI.analyze(feedbackObject.feedback).then(score => {
// TODO: 感情スコアをコンソールにロギングする
console.log(`Score: ${score}`);
// END TODO
// TODO: 新しい score プロパティを feedbackObject に追加する
feedbackObject.score = score;
// END TODO
// TODO: フィードバック オブジェクトを次のハンドラに渡す
return feedbackObject;
// END TODO
})
// TODO: レコードを挿入する
.then(feedbackStorage.saveFeedback).then(() => {
// TODO: 成功メッセージをコンソールにロギングする
console.log('feedback saved...');
return 'success';
// END TODO
})
// END TODO
// TODO: エラーをキャッチしてコンソールにロギングする
.catch(console.error);
// End TODO
};
- ファイルを保存します。
Cloud Functions の関数のコードをパッケージ化し、デプロイする
-
Cloud Shell に戻り、Ctrl+C キーを押してウェブ アプリケーションを停止します。
- 次のコマンドを入力して、作業ディレクトリを Cloud Functions の関数のコードに変更します。
cd function
- 次のコマンドを入力して、関数のデプロイに必要なファイルを ZIP にまとめます。
zip cf.zip *.js*
注: これにより、フォルダ内のすべての JavaScript ファイルと JSON ファイルが含まれる cf.zip という名前の ZIP アーカイブが生成されます。
- 次のコマンドを入力して、ZIP ファイルを Cloud Storage にステージングします。
gcloud storage cp cf.zip gs://$GCLOUD_BUCKET/
注: このコマンドを実行すると、プロジェクト ID に「-media」の接尾辞が付いた名前の Cloud Storage バケットに ZIP アーカイブがコピーされます。
- Cloud Storage バケットから関数をデプロイするには、次の gcloud functions deploy コマンドを使用します。
gcloud functions deploy process-feedback1 \
--gen2 \
--region={{{project_0.default_region|set at lab start}}} \
--source=gs://$GCLOUD_BUCKET/cf.zip \
--entry-point=subscribe \
--runtime=nodejs22 \
--trigger-topic=feedback
注: process-feedback1 関数が新しいコードで更新されるまでに 1~2 分かかる場合があります。新しいコードでは、Cloud Natural Language Machine Learning API を使用して感情分析を行い、Cloud Spanner にデータを挿入します。
Cloud Functions の関数のコードをパッケージ化し、デプロイする
タスク 5. ケーススタディ用アプリケーションをテストする
ウェブ アプリケーションを実行する
-
Cloud Shell ウィンドウに戻ります。
- 作業フォルダを cloudfunctions ラボの
start フォルダに戻します。
cd ..
- 次のコマンドを実行して、ウェブ アプリケーションを開始します。
npm start
- ウェブ アプリケーションをプレビューします。
- [Take Test] をクリックします。
- [Places] をクリックします。
- 質問に答えます。
- フィードバックを入力し、[Send Feedback] をクリックします。
Cloud Functions の関数のモニタリングとログの内容を確認する
-
Cloud Platform コンソールの [Cloud Run] セクションに戻ります。
- [process-feedback1] という名前の関数をクリックします。
注: Cloud Functions の関数の呼び出しに関するモニタリング グラフが表示されます。
関数の呼び出しデータがグラフに表示されるまでには数分かかります。
- [ログ] タブをクリックして、ログを表示します。
- ログ エクスプローラでログを表示するには、ページの右上にあるリンクをクリックします。
- Cloud Pub/Sub メッセージが表示されない場合は、[更新] をクリックします。
- 関数が実行されたことを示すログエントリが表示されるまで、数分ごとにログを更新します。
注: Cloud Functions 関数から収集されたログエントリが表示されます。
Language API で取得したスコアがログに表示されます。
関数の呼び出しがログに表示されるまでに数分かかる場合があります。
Cloud Spanner のデータを表示する
-
ナビゲーション メニューで [すべてのプロダクトを表示] をクリックし、[Spanner] をクリックします。
- [Quiz instance] をクリックし、[データベース] の [quiz-database] をクリックして、左側のペインの [Spanner Studio] を選択します。
- 次のクエリを実行します。
SELECT * FROM Feedback
注: Feedback テーブルに新しいレコードが追加されていることを確認します。
タスク 6. 参考: Cloud Functions の関数を使用して受講者の解答を保存する
受講者がクイズを完了すると、解答が API 呼び出しでサーバーに送信されます。ここでは、受講者から送信された解答と正解を取得して Cloud Spanner に保存し、Feedback テーブルに新しいレコードが追加されていることを確認します。
手順は次のとおりです。
- 「answers」という Cloud Pub/Sub トピックを作成します。
- 適切な列名とデータ型を指定して「Answers」という Cloud Spanner テーブルを作成します。
- answers トピックに解答データを送信します。
- コンソール アプリケーションで answers トピックにサブスクライブし、Answers テーブルに解答データを挿入します。
詳細の設定は任意です。「参考」ソリューションは、ラボの bonus フォルダで確認できます。
まとめ:
Cloud Functions で使用できるトリガーはどれですか。
- Cloud Pub/Sub
- Cloud Spanner
- Cloud Storage
- HTTP
Cloud Pub/Sub によってトリガーされた Cloud Functions の関数では、メッセージがどのような形式で配信されますか。
- Base64 エンコード
- CSV エンコード
- tar と gzip
- ZIP
Cloud Functions の関数の最長実行時間はどれですか。
ラボを終了する
ラボが完了したら、[ラボを終了] をクリックします。ラボで使用したリソースが Google Cloud Skills Boost から削除され、アカウントの情報も消去されます。
ラボの評価を求めるダイアログが表示されたら、星の数を選択してコメントを入力し、[送信] をクリックします。
星の数は、それぞれ次の評価を表します。
- 星 1 つ = 非常に不満
- 星 2 つ = 不満
- 星 3 つ = どちらともいえない
- 星 4 つ = 満足
- 星 5 つ = 非常に満足
フィードバックを送信しない場合は、ダイアログ ボックスを閉じてください。
フィードバックやご提案の送信、修正が必要な箇所をご報告いただく際は、[サポート] タブをご利用ください。
Copyright 2020 Google LLC All rights reserved. Google および Google のロゴは Google LLC の商標です。その他すべての企業名および商品名はそれぞれ各社の商標または登録商標です。