
始める前に
- ラボでは、Google Cloud プロジェクトとリソースを一定の時間利用します
- ラボには時間制限があり、一時停止機能はありません。ラボを終了した場合は、最初からやり直す必要があります。
- 画面左上の [ラボを開始] をクリックして開始します
このラボでは、ユーザーのフィードバックを処理してスコアを保存する、オンライン クイズ アプリケーションのバックエンド サービスを開発します。
このクイズ アプリケーションは 2 つの部分で構成されています。1 つ目は Cloud Shell ウィンドウで実行するウェブ アプリケーション、2 つ目は Cloud Shell ウィンドウで実行するワーカー アプリケーションです。
このプロセスでは、Google Cloud Platform(GCP)の次のようなプロダクトとサービスを使用します。
このラボでは、次のタスクの実行方法について学びます。
各ラボでは、新しい Google Cloud プロジェクトとリソースセットを一定時間無料で利用できます。
Qwiklabs にシークレット ウィンドウでログインします。
ラボのアクセス時間(例: 1:15:00
)に注意し、時間内に完了できるようにしてください。
一時停止機能はありません。必要な場合はやり直せますが、最初からになります。
準備ができたら、[ラボを開始] をクリックします。
ラボの認証情報(ユーザー名とパスワード)をメモしておきます。この情報は、Google Cloud Console にログインする際に使用します。
[Google Console を開く] をクリックします。
[別のアカウントを使用] をクリックし、このラボの認証情報をコピーしてプロンプトに貼り付けます。
他の認証情報を使用すると、エラーが発生したり、料金の請求が発生したりします。
利用規約に同意し、再設定用のリソースページをスキップします。
Google Cloud Shell は、開発ツールと一緒に読み込まれる仮想マシンです。5 GB の永続ホーム ディレクトリが用意されており、Google Cloud で稼働します。
Google Cloud Shell を使用すると、コマンドラインで Google Cloud リソースにアクセスできます。
Google Cloud コンソールで、右上のツールバーにある [Cloud Shell をアクティブにする] ボタンをクリックします。
[続行] をクリックします。
環境がプロビジョニングされ、接続されるまでしばらく待ちます。接続した時点で認証が完了しており、プロジェクトに各自のプロジェクト ID が設定されます。次に例を示します。
gcloud は Google Cloud のコマンドライン ツールです。このツールは、Cloud Shell にプリインストールされており、タブ補完がサポートされています。
出力:
出力例:
出力:
出力例:
このセクションでは、Cloud Shell にアクセスしてクイズ アプリケーションを含む git リポジトリのクローンを作成し、環境変数を設定してアプリケーションを実行します。
このセクションでは、依存関係を構成してウェブ アプリケーションを実行します。
このラボのサンプル ファイルが含まれているディレクトリに移動します。
ウェブ アプリケーションを構成します。
このスクリプト ファイルを実行すると、以下の処理が行われます。
GCLOUD_PROJECT
と GCLOUD_BUCKET
をエクスポートする。mvn clean install
を実行する。次のような出力が表示されたら、このアプリケーションを実行できます。
ウェブ アプリケーションを実行します。
アプリケーションの実行が開始されると、次のような出力が表示されます。
Cloud Shell のタブの右側にある [新しいタブを開く] をクリックして、2 つ目の Cloud Shell ウィンドウを開きます。
次のコマンドを入力して、作業ディレクトリを変更します。
2 つ目の Cloud Shell ウィンドウで環境を用意します。
このスクリプト ファイルを実行すると、以下の処理が行われます。
GCLOUD_PROJECT
と GCLOUD_BUCKET
をエクスポートする。ワーカー アプリケーションを開始します。
引き続き 2 つ目の Cloud Shell ウィンドウで、ウェブでプレビュー アイコン > [ポート 8080 でプレビュー] をクリックして、クイズ アプリケーションをプレビューします。
ナビゲーション バーで、[Take Test] をクリックします。
[Places] をクリックします。
質問に答えます。
質問に答えると、フィードバックの送信を求める最終画面が表示されます。
評価を選択して、フィードバックを入力できます。
Cloud Shell に戻ります。1 つ目と 2 つ目のウィンドウで Ctrl+C キーを押して、ウェブ アプリケーションとワーカー アプリケーションを停止します。
このセクションでは、ファイル構造と、このクイズ アプリケーションに影響を与えるファイルについて調べます。
このラボで行うのは、ファイルの閲覧と編集です。そのために、Cloud Shell にインストールされている nano
や vim
などの shell エディタ、および Cloud Shell コードエディタを使用できますが、今回は Cloud Shell コードエディタを使用します。
エディタの左側にあるファイル ブラウザ パネルから、/pubsub-languageapi-spanner/start
フォルダに移動します。
次に、/src/main/java/com/google/training/appdev
フォルダを展開します。すべての Java コードパスはこのフォルダからの相対パスです。
.../services/gcp/domain
フォルダにある Feedback.java
ファイルを選択します。
このファイルには、回答者から送信されたフィードバックを表すモデルクラスが含まれています。
.../services/gcp/pubsub
フォルダにある PublishService.java
ファイルを選択します。このファイルには、アプリケーションが Cloud Pub/Sub トピックにフィードバック メッセージをパブリッシュできるようにするサービスクラスが含まれています。
.../services/gcp/languageapi
フォルダにある LanguageService.java
ファイルを選択します。このファイルには、ユーザーが Cloud Natural Language ML API にテキストを送信したり、この API から感情スコアを受信したりできるようにするサービスクラスが含まれています。
.../services/gcp/spanner
フォルダ内にある SpannerService.java
ファイルを選択します。このファイルには、ユーザーがフィードバックと Natural Language API のレスポンス データを Cloud Spanner データベース インスタンスに保存できるようにするサービスクラスが含まれています。
.../api
フォルダにある QuizEndpoint.java
ファイルを選択します。/api/quizzes/feedback/:quiz
ルートに送信された POST メッセージのハンドラが、クライアントから受け取ったフィードバック データを Pub/Sub にパブリッシュします。
.../backend
フォルダにある ConsoleApp.java
ファイルを選択します。このファイルは、Pub/Sub サブスクリプションに配信されたメッセージを使用するための、独立したコンソール アプリケーションとして実行されます。
このクイズ アプリケーションは、Pub/Sub 機能によって、ユーザーがクイズのインターフェースを使用して入力した回答とフィードバックを取得します。
このセクションでは、GCP プロジェクトで Cloud Pub/Sub のトピックとサブスクリプションを作成し、メッセージをパブリッシュして取得します。
Cloud Platform コンソールで、ナビゲーション メニュー > [Pub/Sub] > [トピック] をクリックし、[トピックを作成] をクリックします。
[トピック ID] を「feedback
」に設定し、[トピックを作成] をクリックします。
[トピックの詳細] ビューが開きます。
2 つ目の Cloud Shell ウィンドウに戻ります。
次のコマンドを入力して、feedback
トピックに対して cloud-shell-subscription
という名前の Cloud Pub/Sub サブスクリプションを作成します。
feedback
トピックに "Hello World"
というメッセージをパブリッシュします。feedback
トピックからメッセージを pull します。出力:
このセクションでは、Cloud Pub/Sub にメッセージをパブリッシュするためのコードを記述します。
// TODO
// END TODO
コードエディタで .../services/gcp/pubsub/PublishService.java
ファイルを開きます。
次の手順でコードを追加して、このファイルを更新します。
static final 修飾子を使って、PROJECT_ID
と TOPIC_NAME
の 2 つの文字列定数を宣言します。
publishFeedback(...)
メソッドに移動し、PROJECT_ID
と TOPIC_NAME
の各文字列を使って TopicName
オブジェクトを作成します。
このトピック名は、先ほど作成した Cloud Pub/Sub トピックを参照します。
Publisher
オブジェクトを宣言して null
に設定します。
このオブジェクトはこの後の try ブロックで初期化されます。
try ブロックに移動して、Publisher オブジェクトをそのビルダーを使用して初期化します。
JSON シリアル化された文字列 feedbackMessage
を ByteString
にコピーします。
PubsubMessage
オブジェクトを宣言し、そのビルダーを使用してメッセージを初期化します。
パブリッシャーを使用してメッセージをパブリッシュし、戻り値を messageIdFuture オブジェクトに代入します。
finally ブロックに移動して、messageIdFuture オブジェクトから Pub/Sub messageId を取得します。
パブリッシャーをシャットダウンしてパブリッシュ コードを完成させます。
services/gcp/pubsub/PublishService.java
を保存します。
.../api/QuizEndpoint.java
ファイルで、publishService
という名前の新しい PublishService
フィールドを宣言します。
Spring の @Autowired
アノテーションを適用します。
'/feedback/:quiz'
ルートへの POST リクエストを処理する processFeedback(...)
メソッドで、publishService.publishFeedback(feedback)
メソッドを呼び出します。
/api/QuizEndpoint.java
を保存します。
1 つ目の Cloud Shell ウィンドウで、ウェブ アプリケーションを再び開始します(実行中の場合は停止してから開始します)。
ウェブ アプリケーションをプレビューし、[Take Test] > [Places] をクリックします。
質問に答えて評価を選択し、フィードバック テキストを入力してから [Send Feedback] をクリックします。
2 つ目の Cloud Shell ウィンドウで、cloud-shell-subscription
からメッセージを pull します。
このセクションでは、サブスクリプションを作成して Cloud Pub/Sub トピックからワーカー アプリケーションへのメッセージ通知を受信するためのコードを記述します。
コードエディタで ...backend/ConsoleApp.java
ファイルを開きます。
次の手順でコードを追加して、このファイルを更新します。
languageService
と spannerService
の TODO ブロックはスキップします。これらについては後で処理します。
main()
メソッドで、"worker1-subscription"
という名前の新しいサブスクリプションを表す SubscriptionName
オブジェクトを作成します。
try ブロックを使用して SubscriptionAdminClient
オブジェクトを作成します。
MessageReceiver
を作成するコードに移動して、receiveMessage(...)
のオーバーライドでメッセージ データを文字列に抽出します。
consumer を使用してメッセージの確認応答を行います。
ObjectMapper を初期化するコードの後に、JSON 文字列のメッセージ データを feedback オブジェクトにデシリアライズするコードを追加します。
MessageReceiver
を作成するブロックの後で、Subscriber
を宣言して null に初期化します。
try ブロックに移動して、Subscriber
をそのデフォルト ビルダーを使用して初期化します。これにはサブスクリプションとレシーバが必要です。
エラーを表示するために、サブスクライバーにリスナーを追加します。
サブスクライバーを起動します。
最後のブロックに移動します。サブスクライバーを停止するコードと、サブスクリプションを削除するコードを記述します。
backend/ConsoleApp.java
を保存します。
1 つ目の Cloud Shell ウィンドウで、ウェブ アプリケーションを停止して開始します。
2 つ目の Cloud Shell ウィンドウで、ワーカー アプリケーションを開始します。
Cloud Shell で [ウェブでプレビュー] アイコン > [ポート 8080 でプレビュー] をクリックして、クイズ アプリケーションをプレビューします。
[Take Test] をクリックします。
[Places] をクリックします。
質問に答えて評価を選択し、フィードバック テキストを入力してから [Send Feedback] をクリックします。
2 つ目の Cloud Shell ウィンドウに戻ります。
ワーカー アプリケーションがそのハンドラを介してフィードバック メッセージを受信し、それを 2 つ目の Cloud Shell ウィンドウに表示したことがわかります。フィードバック メッセージの例を以下に示します。
このセクションでは、ユーザーが送信したフィードバック テキストの感情分析を行うためのコードを記述します。詳細については、Google Cloud Natural Language API をご覧ください。
エディタに戻り、services/gcp/languageapi
フォルダにある LanguageService.java
ファイルを開きます。
analyzeSentiment(...)
メソッドに移動して、try ブロック内に LanguageServiceClient
オブジェクトを作成します。
// END TODO
が含まれていないことに注意してください。ビルダーを使用して新しい Document
オブジェクトを作成し、ドキュメントの内容と種類を指定してオブジェクトを構成します。
Natural Language クライアント オブジェクトを使用してドキュメントの感情を分析し、その結果を Sentiment
オブジェクトに代入します。
次に、Sentiment オブジェクトから感情スコアを返します。
右中括弧を忘れないでください。
ファイルを保存します。
backend/ConsoleApp.java
ファイルに戻ります。
main(...)
メソッドに移動します。
main()
メソッドで、"worker2-subscription"
という名前の新しいサブスクリプションを表す SubscriptionName
オブジェクトを作成します。
"worker1-subscription"
に置き換わるものです。コメントで示された箇所で、LanguageService
インスタンスをその静的 create()
メソッドを使用して作成します。
コメントで示された箇所で、languageService
オブジェクトを使用してフィードバックの感情を検出します。
次に、スコアをコンソールに表示して、feedback オブジェクトに新しいスコア プロパティを代入します。
ファイルを保存します。
1 つ目の Cloud Shell ウィンドウに戻り、ウェブ アプリケーションを再び開始します。
2 つ目の Cloud Shell ウィンドウに切り替えて、ワーカー アプリケーションを再び開始します。
ウェブ アプリケーションをプレビューし、[Take Test] > [Places] をクリックします。
質問に答えて評価を選択し、フィードバックを入力してから [Send Feedback] をクリックします。
2 つ目の Cloud Shell ウィンドウに戻ります。
出力には、ワーカー アプリケーションが Cloud Natural Language API を呼び出して、コンソールの「Score is:」の横に感情スコアを表示したことが示されています。
次に例を示します。
ウェブ アプリケーションとワーカー アプリケーションを停止します。
このセクションでは、Cloud Spanner のインスタンス、データベース、テーブルを作成します。その後、フィードバック データをデータベースに保存するためのコードを記述します。
quiz-instance の [インスタンスの詳細] ページで、[データベースを作成] をクリックします。
[データベース名] に、「quiz-database」と入力します。
[スキーマの定義] のテキスト ボックスに、以下の SQL ステートメントを入力します。
[作成] をクリックします。
コードエディタに戻り、...services/gcp/spanner/SpannerService.java ファイルの insertFeedback(...)
メソッドに移動します。
Cloud Spanner への参照を取得します。
データベース ID を使用して、Spanner データベースへの参照を取得します。
Cloud Spanner データベース クライアントへの参照を取得します。
新しい List<Mutation>
を作成して、このデータベースに加えられるすべての変更を参照します。
feedback オブジェクトからのデータを使用して、Feedback テーブルに対する挿入を表す Mutation
を追加します。
データベース クライアントを使用して変更を書き込みます。
ファイルを保存します。
backend/ConsoleApp.java
ファイルの main(...)
メソッドに移動します。
main()
メソッドで、"worker3-subscription"
という名前の新しいサブスクリプションを表す SubscriptionName
オブジェクトを作成します。
"worker2-subscription"
に置き換わるものです。コメントで示された箇所で、SpannerService
インスタンスを作成します。
コメントで示された箇所で、spannerService
オブジェクトを使用してフィードバックをデータベースに挿入し、コンソールにメッセージを出力します。
ファイルを保存します。
1 つ目の Cloud Shell ウィンドウに戻り、ウェブ アプリケーションを開始します。
2 つ目の Cloud Shell ウィンドウに切り替えて、ワーカー アプリケーションを再び開始します。
クイズ アプリケーションをプレビューし、[Take Test] > [Places] をクリックします。
質問に答えて評価を選択し、フィードバックを入力してから [Send Feedback] をクリックします。
2 つ目の Cloud Shell ウィンドウに戻ります。
ワーカー アプリケーションが Cloud Spanner API を呼び出して、コンソール ウィンドウにメッセージを表示したことがわかります。
Cloud Platform コンソールに戻ります。ナビゲーション メニュー > [Spanner] をクリックします。
[quiz-instance] > [quiz-database] を選択し、左側のペインで [クエリ] をクリックします。
クエリを実行するには、[クエリ] ダイアログで「SELECT * FROM Feedback
」と入力して [実行] をクリックします。
Cloud Spanner データベースの新しいフィードバック レコードが表示されます。このレコードには、Cloud Pub/Sub からのメッセージ データと、Cloud Natural Language API からのクイズスコアが含まれています。
ラボが完了したら、[ラボを終了] をクリックします。ラボで使用したリソースが Google Cloud Skills Boost から削除され、アカウントの情報も消去されます。
ラボの評価を求めるダイアログが表示されたら、星の数を選択してコメントを入力し、[送信] をクリックします。
星の数は、それぞれ次の評価を表します。
フィードバックを送信しない場合は、ダイアログ ボックスを閉じてください。
フィードバックやご提案の送信、修正が必要な箇所をご報告いただく際は、[サポート] タブをご利用ください。
Copyright 2020 Google LLC All rights reserved. Google および Google のロゴは Google LLC の商標です。その他すべての企業名および商品名はそれぞれ各社の商標または登録商標です。
このコンテンツは現在ご利用いただけません
利用可能になりましたら、メールでお知らせいたします
ありがとうございます。
利用可能になりましたら、メールでご連絡いたします
1 回に 1 つのラボ
既存のラボをすべて終了して、このラボを開始することを確認してください