arrow_back

アプリ開発: バックエンド サービスの開発 - Java

ログイン 参加
700 以上のラボとコースにアクセス

アプリ開発: バックエンド サービスの開発 - Java

ラボ 2時間 universal_currency_alt クレジット: 5 show_chart 上級
info このラボでは、学習をサポートする AI ツールが組み込まれている場合があります。
700 以上のラボとコースにアクセス

概要

このラボでは、ユーザーのフィードバックを処理してスコアを保存する、オンライン クイズ アプリケーションのバックエンド サービスを開発します。

このクイズ アプリケーションは 2 つの部分で構成されています。1 つ目は Cloud Shell ウィンドウで実行するウェブ アプリケーション、2 つ目は Cloud Shell ウィンドウで実行するワーカー アプリケーションです。

  • ウェブ アプリケーション: ユーザーのフィードバックを Pub/Sub トピックに送信するロジックを管理します。
  • ワーカー アプリケーション: ユーザーから提供されるフィードバックをリッスンし、最終的に感情分析を行ってデータベース(Cloud Spanner)に保存します。

このプロセスでは、Google Cloud Platform(GCP)の次のようなプロダクトとサービスを使用します。

  • Cloud Pub/Sub: トピック アラートにより、サブスクライブしているワーカー アプリケーションに分析用の新しいスコアとフィードバックを提供します。
  • Cloud Natural Language: フィードバックの感情分析を提供します。
  • Cloud Spanner: クイズ アプリケーション用のデータベースです。

目標

このラボでは、次のタスクの実行方法について学びます。

  • メッセージを作成して Cloud Pub/Sub トピックにパブリッシュする。
  • 別個のワーカー アプリケーションでそのトピックをサブスクライブしてメッセージを受信する。
  • フィードバックの感情分析を行う。
  • Cloud Spanner のデータベース インスタンスとスキーマを作成し、データベースにデータを挿入する。

設定と要件

各ラボでは、新しい Google Cloud プロジェクトとリソースセットを一定時間無料で利用できます。

  1. Qwiklabs にシークレット ウィンドウでログインします。

  2. ラボのアクセス時間(例: 1:15:00)に注意し、時間内に完了できるようにしてください。
    一時停止機能はありません。必要な場合はやり直せますが、最初からになります。

  3. 準備ができたら、[ラボを開始] をクリックします。

  4. ラボの認証情報(ユーザー名パスワード)をメモしておきます。この情報は、Google Cloud Console にログインする際に使用します。

  5. [Google Console を開く] をクリックします。

  6. [別のアカウントを使用] をクリックし、このラボの認証情報をコピーしてプロンプトに貼り付けます。
    他の認証情報を使用すると、エラーが発生したり、料金の請求が発生したりします。

  7. 利用規約に同意し、再設定用のリソースページをスキップします。

Google Cloud Shell の有効化

Google Cloud Shell は、開発ツールと一緒に読み込まれる仮想マシンです。5 GB の永続ホーム ディレクトリが用意されており、Google Cloud で稼働します。

Google Cloud Shell を使用すると、コマンドラインで Google Cloud リソースにアクセスできます。

  1. Google Cloud コンソールで、右上のツールバーにある [Cloud Shell をアクティブにする] ボタンをクリックします。

    ハイライト表示された Cloud Shell アイコン

  2. [続行] をクリックします。

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

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 でソースコードのクローンを作成する

  1. 次のコマンドを入力して、このクラスのリポジトリのクローンを作成します。
git clone --depth=1 https://github.com/GoogleCloudPlatform/training-data-analyst
  1. 作業ディレクトリへのソフトリンクを作成します。
ln -s ~/training-data-analyst/courses/developingapps/v1.3/java/pubsub-languageapi-spanner ~/pubsub-languageapi-spanner

ウェブ アプリケーションを設定する

このセクションでは、依存関係を構成してウェブ アプリケーションを実行します。

  1. このラボのサンプル ファイルが含まれているディレクトリに移動します。

    cd ~/pubsub-languageapi-spanner/start
  2. ウェブ アプリケーションを構成します。

    . prepare_web_environment.sh

    このスクリプト ファイルを実行すると、以下の処理が行われます。

    • App Engine アプリケーションを作成する。
    • 環境変数 GCLOUD_PROJECTGCLOUD_BUCKET をエクスポートする。
    • mvn clean install を実行する。
    • Cloud Datastore にエンティティを作成する。
    • GCP プロジェクト ID を出力する。

    次のような出力が表示されたら、このアプリケーションを実行できます。

    [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 14.111 s [INFO] Finished at: 2021-12-06T20:54:09Z [INFO] ------------------------------------------------------------------------ Project ID: qwiklabs-gcp-02-6c9b7cfe44c0
  3. ウェブ アプリケーションを実行します。

    mvn spring-boot:run

    アプリケーションの実行が開始されると、次のような出力が表示されます。

    20:55:20.756 [restartedMain] INFO c.g.training.appdev.QuizApplication - Started QuizApplication in 20:55:20.756

ワーカー アプリケーションを設定する

  1. Cloud Shell のタブの右側にある [新しいタブを開く] をクリックして、2 つ目の Cloud Shell ウィンドウを開きます。

  2. 次のコマンドを入力して、作業ディレクトリを変更します。

    cd ~/pubsub-languageapi-spanner/start
  3. 2 つ目の Cloud Shell ウィンドウで環境を用意します。

    . prepare_worker_environment.sh

    このスクリプト ファイルを実行すると、以下の処理が行われます。

    • 環境変数 GCLOUD_PROJECTGCLOUD_BUCKET をエクスポートする。
    • GCP サービス アカウントを作成、構成する。
    • Google Cloud Platform のプロジェクト ID を出力する。
  4. ワーカー アプリケーションを開始します。

    mvn exec:java@worker

クイズ アプリケーションを確認する

  1. 引き続き 2 つ目の Cloud Shell ウィンドウで、ウェブでプレビュー アイコン > [ポート 8080 でプレビュー] をクリックして、クイズ アプリケーションをプレビューします。

    [ウェブでプレビュー] プルダウン メニュー。[ポート 8080 でプレビュー] のオプションがハイライト表示されている。

  2. ナビゲーション バーで、[Take Test] をクリックします。

    [Create Question]、[Take Test]、[Leaderboard] のオプションが表示されている Quite Interesting Quiz のスタートページ。

  3. [Places] をクリックします。

    [Task Test] ページ。[Places] タブがハイライト表示されている。

  4. 質問に答えます。

    クイズの質問、選択肢、[Sumit Answer] ボタンが表示されている。

    質問に答えると、フィードバックの送信を求める最終画面が表示されます。

    クイズの最終画面。2 つのテキスト フィールドのほか、[Send Feedback] ボタンが表示されている。

    評価を選択して、フィードバックを入力できます。

  5. Cloud Shell に戻ります。1 つ目と 2 つ目のウィンドウで Ctrl+C キーを押して、ウェブ アプリケーションとワーカー アプリケーションを停止します。

タスク 2. クイズ アプリケーションのコードを調べる

このセクションでは、ファイル構造と、このクイズ アプリケーションに影響を与えるファイルについて調べます。

このラボで行うのは、ファイルの閲覧と編集です。そのために、Cloud Shell にインストールされている nanovim などの shell エディタ、および Cloud Shell コードエディタを使用できますが、今回は Cloud Shell コードエディタを使用します。

Cloud Shell エディタを起動する

  • Cloud Shell で [エディタを開く] をクリックします。

GCP アプリケーションのコード構造を確認する

  1. エディタの左側にあるファイル ブラウザ パネルから、/pubsub-languageapi-spanner/start フォルダに移動します。

  2. 次に、/src/main/java/com/google/training/appdev フォルダを展開します。すべての Java コードパスはこのフォルダからの相対パスです。

  3. .../services/gcp/domain フォルダにある Feedback.java ファイルを選択します。

このファイルには、回答者から送信されたフィードバックを表すモデルクラスが含まれています。

  1. .../services/gcp/pubsub フォルダにある PublishService.java ファイルを選択します。

このファイルには、アプリケーションが Cloud Pub/Sub トピックにフィードバック メッセージをパブリッシュできるようにするサービスクラスが含まれています。

  1. .../services/gcp/languageapi フォルダにある LanguageService.java ファイルを選択します。

このファイルには、ユーザーが Cloud Natural Language ML API にテキストを送信したり、この API から感情スコアを受信したりできるようにするサービスクラスが含まれています。

  1. .../services/gcp/spanner フォルダ内にある SpannerService.java ファイルを選択します。

このファイルには、ユーザーがフィードバックと Natural Language API のレスポンス データを Cloud Spanner データベース インスタンスに保存できるようにするサービスクラスが含まれています。

ウェブ アプリケーションとバックエンド アプリケーションのコードを確認する

  1. .../api フォルダにある QuizEndpoint.java ファイルを選択します。

/api/quizzes/feedback/:quiz ルートに送信された POST メッセージのハンドラが、クライアントから受け取ったフィードバック データを Pub/Sub にパブリッシュします。

  1. .../backend フォルダにある ConsoleApp.java ファイルを選択します。

このファイルは、Pub/Sub サブスクリプションに配信されたメッセージを使用するための、独立したコンソール アプリケーションとして実行されます。

タスク 3. Cloud Pub/Sub を操作する

このクイズ アプリケーションは、Pub/Sub 機能によって、ユーザーがクイズのインターフェースを使用して入力した回答とフィードバックを取得します。

このセクションでは、GCP プロジェクトで Cloud Pub/Sub のトピックとサブスクリプションを作成し、メッセージをパブリッシュして取得します。

Cloud Pub/Sub トピックの作成

  1. Cloud Platform コンソールで、ナビゲーション メニュー > [Pub/Sub] > [トピック] をクリックし、[トピックを作成] をクリックします。

    [トピック] オプションへのナビゲーション パス。

  2. [トピック ID] を「feedback」に設定し、[トピックを作成] をクリックします。

    [トピックを作成] ページ。「feedback」と入力されている [トピック ID] フィールドのほか、[トピックを作成] ボタンと [キャンセル] ボタンが表示されている。

    [トピックの詳細] ビューが開きます。

    [トピックの詳細] ページ。[BigQuery にエクスポート] や [メッセージをパブリッシュ]、[レポートをリクエスト] などのオプションが表示されている。

Cloud Pub/Sub サブスクリプションを作成する

  1. 2 つ目の Cloud Shell ウィンドウに戻ります。

  2. 次のコマンドを入力して、feedback トピックに対して cloud-shell-subscription という名前の Cloud Pub/Sub サブスクリプションを作成します。

gcloud pubsub subscriptions create cloud-shell-subscription --topic feedback 注: アクティブなアカウントに有効な認証情報がないことを示すエラーが表示された場合は、しばらく待ってから再度コマンドを実行します。

Cloud Pub/Sub トピックにメッセージをパブリッシュする

  • 2 つ目の Cloud Shell ウィンドウで、feedback トピックに "Hello World" というメッセージをパブリッシュします。
gcloud pubsub topics publish feedback --message="Hello World"

Cloud Pub/Sub サブスクリプションからメッセージを取得する

  • 2 つ目の Cloud Shell ウィンドウで、メッセージの自動確認応答を使用して feedback トピックからメッセージを pull します。
gcloud pubsub subscriptions pull cloud-shell-subscription --auto-ack

出力:

「feedback」トピックの出力。データ、メッセージ ID、属性などの情報が表示されている。

タスク 4. プログラムで Cloud Pub/Sub にメッセージをパブリッシュする

このセクションでは、Cloud Pub/Sub にメッセージをパブリッシュするためのコードを記述します。

注: 次の文字列の間のコードを更新してください。

// TODO

// END TODO

学習効果を最大限に高めるために、コード、インライン コメント、関連する API ドキュメントを確認してください。

Pub/Sub メッセージをパブリッシュする

  1. コードエディタで .../services/gcp/pubsub/PublishService.java ファイルを開きます。 次の手順でコードを追加して、このファイルを更新します。

  2. static final 修飾子を使って、PROJECT_IDTOPIC_NAME の 2 つの文字列定数を宣言します。

    // TODO: PROJECT_ID と TOPIC_NAME の // 2 つの文字列を宣言して初期化する private static final String PROJECT_ID = ServiceOptions.getDefaultProjectId(); private static final String TOPIC_NAME = "feedback"; // END TODO
  3. publishFeedback(...) メソッドに移動し、PROJECT_IDTOPIC_NAME の各文字列を使って TopicName オブジェクトを作成します。

    このトピック名は、先ほど作成した Cloud Pub/Sub トピックを参照します。

    // TODO: プロジェクト内で feedback トピックの // TopicName オブジェクトを作成する TopicName topicName = TopicName.of(PROJECT_ID, TOPIC_NAME); // END TODO
  4. Publisher オブジェクトを宣言して null に設定します。

    // TODO: トピックの Publisher オブジェクトを宣言する Publisher publisher = null; // END TODO

    このオブジェクトはこの後の try ブロックで初期化されます。

  5. try ブロックに移動して、Publisher オブジェクトをそのビルダーを使用して初期化します。

    // TODO: ビルダーと topicName を使用して // Publisher オブジェクトを初期化する publisher = Publisher.newBuilder(topicName).build(); // END TODO
  6. JSON シリアル化された文字列 feedbackMessageByteString にコピーします。

    // TODO: シリアル化されたメッセージを // ByteString にコピーする ByteString data = ByteString.copyFromUtf8(feedbackMessage); // END TODO
  7. PubsubMessage オブジェクトを宣言し、そのビルダーを使用してメッセージを初期化します。

    // TODO: ビルダーを使用して Pub/Sub メッセージを // 作成し、メッセージ データを設定する PubsubMessage pubsubMessage = PubsubMessage.newBuilder().setData(data).build(); // END TODO
  8. パブリッシャーを使用してメッセージをパブリッシュし、戻り値を messageIdFuture オブジェクトに代入します。

    // TODO: メッセージをパブリッシュし、 // messageIdFuture に代入する messageIdFuture = publisher.publish(pubsubMessage); // END TODO
  9. finally ブロックに移動して、messageIdFuture オブジェクトから Pub/Sub messageId を取得します。

    // TODO: messageIdFuture から // messageId を取得する String messageId = messageIdFuture.get(); // END TODO
  10. パブリッシャーをシャットダウンしてパブリッシュ コードを完成させます。

    // TODO: パブリッシャーをシャットダウンして // リソースを解放する if (publisher != null) { publisher.shutdown(); } // END TODO
  11. services/gcp/pubsub/PublishService.java を保存します。

Pub/Sub のパブリッシュ機能を使用するためのコードを記述する

  1. .../api/QuizEndpoint.java ファイルで、publishService という名前の新しい PublishService フィールドを宣言します。

  2. Spring の @Autowired アノテーションを適用します。

    // TODO: publishService を宣言する @Autowired private PublishService publishService; // END TODO
  3. '/feedback/:quiz' ルートへの POST リクエストを処理する processFeedback(...) メソッドで、publishService.publishFeedback(feedback) メソッドを呼び出します。

    // TODO: フィードバックを Pub/Sub にパブリッシュする publishService.publishFeedback(feedback); // END TODO
  4. /api/QuizEndpoint.java を保存します。

アプリケーションを実行して Pub/Sub メッセージを作成する

  1. 1 つ目の Cloud Shell ウィンドウで、ウェブ アプリケーションを再び開始します(実行中の場合は停止してから開始します)。

    mvn spring-boot:run
  2. ウェブ アプリケーションをプレビューし、[Take Test] > [Places] をクリックします。

  3. 質問に答えて評価を選択し、フィードバック テキストを入力してから [Send Feedback] をクリックします。

  4. 2 つ目の Cloud Shell ウィンドウで、cloud-shell-subscription からメッセージを pull します。

    gcloud pubsub subscriptions pull cloud-shell-subscription --auto-ack

タスク 5. プログラムで Cloud Pub/Sub トピックにサブスクライブする

このセクションでは、サブスクリプションを作成して Cloud Pub/Sub トピックからワーカー アプリケーションへのメッセージ通知を受信するためのコードを記述します。

Cloud Pub/Sub サブスクリプションを作成してメッセージを受信するためのコードを記述する

  1. コードエディタで ...backend/ConsoleApp.java ファイルを開きます。

    • 次の手順でコードを追加して、このファイルを更新します。

    • languageServicespannerServiceTODO ブロックはスキップします。これらについては後で処理します。

  2. main() メソッドで、"worker1-subscription" という名前の新しいサブスクリプションを表す SubscriptionName オブジェクトを作成します。

    // TODO: Pub/Sub サブスクリプション名を作成する ProjectSubscriptionName subscription = ProjectSubscriptionName.of(projectId, "worker1-subscription"); // END TODO
  3. try ブロックを使用して SubscriptionAdminClient オブジェクトを作成します。

注: 同じく try ブロックで、作成した subscriptionAdminClient を使用して feedback トピックに対する新しいサブスクリプションを作成します。 右中括弧を忘れないでください。 ```JAVA // TODO: subscriptionAdminClient を作成する try (SubscriptionAdminClient subscriptionAdminClient = SubscriptionAdminClient.create()) { // TODO: サブスクリプション名とトピックを使用して // Pub/Sub サブスクリプションを作成する subscriptionAdminClient.createSubscription( subscription, topic, PushConfig.getDefaultInstance(), 0); // END TODO } // END TODO ```
  1. MessageReceiver を作成するコードに移動して、receiveMessage(...) のオーバーライドでメッセージ データを文字列に抽出します。

    // TODO: メッセージ データを JSON 文字列として抽出する String fb = message.getData().toStringUtf8(); // END TODO
  2. consumer を使用してメッセージの確認応答を行います。

    // TODO: メッセージに確認応答する consumer.ack(); // END TODO
  3. ObjectMapper を初期化するコードの後に、JSON 文字列のメッセージ データを feedback オブジェクトにデシリアライズするコードを追加します。

    // TODO: フィードバックを表す // JSON 文字列をデシリアライズし、 // フィードバックを出力する Feedback feedback = mapper.readValue( fb, Feedback.class); System.out.println("Feedback received: " + feedback); // END TODO
  4. MessageReceiver を作成するブロックの後で、Subscriber を宣言して null に初期化します。

    • いくつかの TODO ブロックをスキップして、次のブロックを探します。
    // TODO: サブスクライバーを宣言する Subscriber subscriber = null; // END TODO
  5. try ブロックに移動して、Subscriber をそのデフォルト ビルダーを使用して初期化します。これにはサブスクリプションとレシーバが必要です。

    // TODO: サブスクライバーのデフォルト ビルダーを // 使用して、サブスクライバーを // サブスクリプションとレシーバで初期化する subscriber = Subscriber.newBuilder( subscription, receiver).build(); // END TODO
  6. エラーを表示するために、サブスクライバーにリスナーを追加します。

    // TODO: subscriber にリスナーを追加する subscriber.addListener( new Subscriber.Listener() { @Override public void failed( Subscriber.State from, Throwable failure) { System.err.println(failure); } }, MoreExecutors.directExecutor()); // END TODO
  7. サブスクライバーを起動します。

    // TODO: サブスクライブを開始する subscriber.startAsync().awaitRunning(); // END TODO
  8. 最後のブロックに移動します。サブスクライバーを停止するコードと、サブスクリプションを削除するコードを記述します。

    // TODO: サブスクライブを停止する if (subscriber != null) { subscriber.stopAsync().awaitTerminated(); } // END TODO // TODO: subscription を削除する try (SubscriptionAdminClient subscriptionAdminClient = SubscriptionAdminClient.create()) { subscriptionAdminClient.deleteSubscription( subscription); } // END TODO
  9. backend/ConsoleApp.java を保存します。

ウェブ アプリケーションとワーカー アプリケーションを実行して Pub/Sub メッセージを作成する

  1. 1 つ目の Cloud Shell ウィンドウで、ウェブ アプリケーションを停止して開始します。

    mvn spring-boot:run
  2. 2 つ目の Cloud Shell ウィンドウで、ワーカー アプリケーションを開始します。

    mvn compile exec:java@worker
  3. Cloud Shell で [ウェブでプレビュー] アイコン > [ポート 8080 でプレビュー] をクリックして、クイズ アプリケーションをプレビューします。

  4. [Take Test] をクリックします。

  5. [Places] をクリックします。

  6. 質問に答えて評価を選択し、フィードバック テキストを入力してから [Send Feedback] をクリックします。

  7. 2 つ目の Cloud Shell ウィンドウに戻ります。

ワーカー アプリケーションがそのハンドラを介してフィードバック メッセージを受信し、それを 2 つ目の Cloud Shell ウィンドウに表示したことがわかります。フィードバック メッセージの例を以下に示します。

Feedback received: Feedback{email='app.dev.student@dummy.org', quiz='places', feedback='love the test', rating=5, timestamp=1527564677609, sentimentScore=0.0} 注: 「不正なリフレクト アクセス オペレーション」に関する警告の出力は無視しても問題ありません。
  1. ウェブ アプリケーションとコンソール アプリケーションを停止します。

タスク 6. Cloud Natural Language API を使用する

このセクションでは、ユーザーが送信したフィードバック テキストの感情分析を行うためのコードを記述します。詳細については、Google Cloud Natural Language API をご覧ください。

Cloud Natural Language API を呼び出すコードを記述する

  1. エディタに戻り、services/gcp/languageapi フォルダにある LanguageService.java ファイルを開きます。

  2. analyzeSentiment(...) メソッドに移動して、try ブロック内に LanguageServiceClient オブジェクトを作成します。

    • このステップでは、ファイルにコピーする内容に // END TODO が含まれていないことに注意してください。
    // TODO: LanguageServiceClient オブジェクトを作成する try (LanguageServiceClient language = LanguageServiceClient.create()) {
  3. ビルダーを使用して新しい Document オブジェクトを作成し、ドキュメントの内容と種類を指定してオブジェクトを構成します。

    // TODO: ビルダーを使用して新しい // Document オブジェクトを作成し、 // 内容と種類を設定する Document doc = Document.newBuilder() .setContent(feedback) .setType(Document.Type.PLAIN_TEXT) .build(); // END TODO
  4. Natural Language クライアント オブジェクトを使用してドキュメントの感情を分析し、その結果を Sentiment オブジェクトに代入します。

    // TODO: クライアントを使用して // フィードバックの感情を分析する Sentiment sentiment = language .analyzeSentiment(doc) .getDocumentSentiment(); // END TODO
  5. 次に、Sentiment オブジェクトから感情スコアを返します。

    // TODO: 感情スコアを返す return sentiment.getScore(); // END TODO }

    右中括弧を忘れないでください。

  6. ファイルを保存します。

Natural Language API の機能を使用するためのコードを記述する

  1. backend/ConsoleApp.java ファイルに戻ります。

  2. main(...) メソッドに移動します。

  3. main() メソッドで、"worker2-subscription" という名前の新しいサブスクリプションを表す SubscriptionName オブジェクトを作成します。

    • これは、"worker1-subscription" に置き換わるものです。
    // TODO: Pub/Sub サブスクリプション名を作成する ProjectSubscriptionName subscription = ProjectSubscriptionName.of(projectId, "worker2-subscription"); // END TODO
  4. コメントで示された箇所で、LanguageService インスタンスをその静的 create() メソッドを使用して作成します。

    // TODO: languageService を作成する LanguageService languageService = LanguageService.create(); // END TODO
  5. コメントで示された箇所で、languageService オブジェクトを使用してフィードバックの感情を検出します。

    // TODO: Natural Language API を使用して感情を分析する float sentimentScore = languageService.analyzeSentiment( feedback.getFeedback()); // END TODO
  6. 次に、スコアをコンソールに表示して、feedback オブジェクトに新しいスコア プロパティを代入します。

    // TODO: feedback オブジェクトの感情スコアを設定する feedback.setSentimentScore(sentimentScore); System.out.println("Score is: " + sentimentScore); // END TODO
  7. ファイルを保存します。

ウェブ アプリケーションとワーカー アプリケーションを実行して Natural Language API をテストする

  1. 1 つ目の Cloud Shell ウィンドウに戻り、ウェブ アプリケーションを再び開始します。

  2. 2 つ目の Cloud Shell ウィンドウに切り替えて、ワーカー アプリケーションを再び開始します。

  3. ウェブ アプリケーションをプレビューし、[Take Test] > [Places] をクリックします。

  4. 質問に答えて評価を選択し、フィードバックを入力してから [Send Feedback] をクリックします。

  5. 2 つ目の Cloud Shell ウィンドウに戻ります。

    出力には、ワーカー アプリケーションが Cloud Natural Language API を呼び出して、コンソールの「Score is:」の横に感情スコアを表示したことが示されています。

    次に例を示します。

    Feedback received: Feedback{email='app.dev.student@dummy.org', quiz='places', feedback='loved the test', rating=1, timestamp=1570116062687, sentimentScore=0.0} Score is: 0.8
  6. ウェブ アプリケーションとワーカー アプリケーションを停止します。

タスク 7. Cloud Spanner にデータを保存する

このセクションでは、Cloud Spanner のインスタンス、データベース、テーブルを作成します。その後、フィードバック データをデータベースに保存するためのコードを記述します。

Cloud Spanner インスタンスを作成する

  1. Cloud コンソールに戻ります。
  2. ナビゲーション メニュー > [Spanner] をクリックします。
  3. [インスタンスを作成] をクリックします。
  4. [インスタンス名] を「quiz-instance」に設定します。
  5. [構成を選択] で、構成の選択プルダウン メニューから [us-central1] を選択します。
  6. [作成] をクリックします。

Cloud Spanner のデータベースとテーブルを作成する

  1. quiz-instance の [インスタンスの詳細] ページで、[データベースを作成] をクリックします。

  2. [データベース名] に、「quiz-database」と入力します。

  3. [スキーマの定義] のテキスト ボックスに、以下の SQL ステートメントを入力します。

    CREATE TABLE Feedback ( feedbackId STRING(100) NOT NULL, email STRING(100), quiz STRING(20), feedback STRING(MAX), rating INT64, score FLOAT64, timestamp INT64 ) PRIMARY KEY (feedbackId);

    [データベースの命名] ページ。[スキーマの定義] フィールドにはコードが入力されている。

  4. [作成] をクリックします。

Cloud Spanner にデータを保存するためのコードを記述する

注: Cloud Spanner API の詳細については、API とリファレンスをご覧ください。

このセクションで使用する特定の API については、API とリファレンス ページの左側のペインにある [クライアント ライブラリ] > [Java リファレンス] をクリックしてください。
  1. コードエディタに戻り、...services/gcp/spanner/SpannerService.java ファイルの insertFeedback(...) メソッドに移動します。

  2. Cloud Spanner への参照を取得します。

    // TODO: Spanner API への参照を取得する SpannerOptions options = SpannerOptions.newBuilder().build(); Spanner spanner = options.getService(); // END TODO
  3. データベース ID を使用して、Spanner データベースへの参照を取得します。

    // TODO: quiz-instance とその // quiz-database への参照を取得する DatabaseId db = DatabaseId.of( options.getProjectId(), "quiz-instance", "quiz-database"); // END TODO
  4. Cloud Spanner データベース クライアントへの参照を取得します。

    // TODO: quiz-database のクライアントを取得する DatabaseClient dbClient = spanner.getDatabaseClient(db); // END TODO
  5. 新しい List<Mutation> を作成して、このデータベースに加えられるすべての変更を参照します。

    // TODO: データベースに対するミューテーションを // 保持するリストを作成する List<Mutation> mutations = new ArrayList<>(); // END TODO // END TODO
  6. feedback オブジェクトからのデータを使用して、Feedback テーブルに対する挿入を表す Mutation を追加します。

    // TODO: insert ミューテーションを追加する mutations.add( // TODO: 新しい insert ミューテーションを作成する Mutation.newInsertBuilder("Feedback") .set("feedbackId") .to(feedback.getEmail() + '_' + feedback.getQuiz() + "_" + feedback.getTimestamp()) .set("email") .to(feedback.getEmail()) .set("quiz") .to(feedback.getQuiz()) .set("feedback") .to(feedback.getFeedback()) .set("rating") .to(feedback.getRating()) .set("score") .to( feedback.getSentimentScore()) .set("timestamp") .to(feedback.getTimestamp()) .build()); // END TODO
  7. データベース クライアントを使用して変更を書き込みます。

    // TODO: 変更を Spanner に書き込む dbClient.write(mutations); // END TODO
  8. ファイルを保存します。

Cloud Spanner の機能を使用するためのコードを記述する

  1. backend/ConsoleApp.java ファイルの main(...) メソッドに移動します。

  2. main() メソッドで、"worker3-subscription" という名前の新しいサブスクリプションを表す SubscriptionName オブジェクトを作成します。

    • これは、"worker2-subscription" に置き換わるものです。
    // TODO: Pub/Sub サブスクリプション名を作成する ProjectSubscriptionName subscription = ProjectSubscriptionName.of(projectId, "worker3-subscription"); // END TODO
  3. コメントで示された箇所で、SpannerService インスタンスを作成します。

    // TODO: spannerService を作成する SpannerService spannerService = SpannerService.create(); // END TODO
  4. コメントで示された箇所で、spannerService オブジェクトを使用してフィードバックをデータベースに挿入し、コンソールにメッセージを出力します。

    // TODO: フィードバックを Cloud Spanner に挿入する spannerService.insertFeedback(feedback); System.out.println("Feedback saved"); // END TODO
  5. ファイルを保存します。

ウェブ アプリケーションとワーカー アプリケーションを実行して Cloud Spanner をテストする

  1. 1 つ目の Cloud Shell ウィンドウに戻り、ウェブ アプリケーションを開始します。

  2. 2 つ目の Cloud Shell ウィンドウに切り替えて、ワーカー アプリケーションを再び開始します。

  3. クイズ アプリケーションをプレビューし、[Take Test] > [Places] をクリックします。

  4. 質問に答えて評価を選択し、フィードバックを入力してから [Send Feedback] をクリックします。

  5. 2 つ目の Cloud Shell ウィンドウに戻ります。

    ワーカー アプリケーションが Cloud Spanner API を呼び出して、コンソール ウィンドウにメッセージを表示したことがわかります。

  6. Cloud Platform コンソールに戻ります。ナビゲーション メニュー > [Spanner] をクリックします。

  7. [quiz-instance] > [quiz-database] を選択し、左側のペインで [クエリ] をクリックします。

  8. クエリを実行するには、[クエリ] ダイアログで「SELECT * FROM Feedback」と入力して [実行] をクリックします。

SELECT * FROM Feedback

Cloud Spanner データベースの新しいフィードバック レコードが表示されます。このレコードには、Cloud Pub/Sub からのメッセージ データと、Cloud Natural Language API からのクイズスコアが含まれています。

quiz-database のクエリ結果のページ。[結果] タブに、フィードバック ID、スコア、評価、フィードバックが表示されている。

ラボを終了する

ラボが完了したら、[ラボを終了] をクリックします。ラボで使用したリソースが Google Cloud Skills Boost から削除され、アカウントの情報も消去されます。

ラボの評価を求めるダイアログが表示されたら、星の数を選択してコメントを入力し、[送信] をクリックします。

星の数は、それぞれ次の評価を表します。

  • 星 1 つ = 非常に不満
  • 星 2 つ = 不満
  • 星 3 つ = どちらともいえない
  • 星 4 つ = 満足
  • 星 5 つ = 非常に満足

フィードバックを送信しない場合は、ダイアログ ボックスを閉じてください。

フィードバックやご提案の送信、修正が必要な箇所をご報告いただく際は、[サポート] タブをご利用ください。

Copyright 2020 Google LLC All rights reserved. Google および Google のロゴは Google LLC の商標です。その他すべての企業名および商品名はそれぞれ各社の商標または登録商標です。

始める前に

  1. ラボでは、Google Cloud プロジェクトとリソースを一定の時間利用します
  2. ラボには時間制限があり、一時停止機能はありません。ラボを終了した場合は、最初からやり直す必要があります。
  3. 画面左上の [ラボを開始] をクリックして開始します

シークレット ブラウジングを使用する

  1. ラボで使用するユーザー名パスワードをコピーします
  2. プライベート モードで [コンソールを開く] をクリックします

コンソールにログインする

    ラボの認証情報を使用して
  1. ログインします。他の認証情報を使用すると、エラーが発生したり、料金が発生したりする可能性があります。
  2. 利用規約に同意し、再設定用のリソースページをスキップします
  3. ラボを終了する場合や最初からやり直す場合を除き、[ラボを終了] はクリックしないでください。クリックすると、作業内容がクリアされ、プロジェクトが削除されます

このコンテンツは現在ご利用いただけません

利用可能になりましたら、メールでお知らせいたします

ありがとうございます。

利用可能になりましたら、メールでご連絡いたします

1 回に 1 つのラボ

既存のラボをすべて終了して、このラボを開始することを確認してください

シークレット ブラウジングを使用してラボを実行する

このラボの実行には、シークレット モードまたはシークレット ブラウジング ウィンドウを使用してください。これにより、個人アカウントと受講者アカウントの競合を防ぎ、個人アカウントに追加料金が発生することを防ぎます。