概要
Google Cloud Datastore は、自動スケーリングと高パフォーマンスを実現し、アプリケーション開発を簡素化するように構築された NoSQL ドキュメント データベースです。このラボでは、この Datastore を使用してオンライン クイズ アプリケーションのアプリケーション データを保存します。また、クイズのデータを Datastore から取得して表示するようアプリケーションを構成します。
クイズ アプリケーションのスケルトンがあらかじめ用意されていますので、まずは Google Cloud Shell を使用して、スケルトンを含むリポジトリのクローンを作成します。次に、Cloud Shell エディタを使ってコードを確認し、Cloud Shell のウェブ プレビュー機能でアプリケーションを表示します。その後、Cloud Datastore を使用してデータを保存するようコードを変更します。
目標
このラボでは、次のタスクを行います。
設定と要件
ラボの設定
各ラボでは、新しい 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 の概要ガイド
をご覧ください。
クイズ アプリケーションを準備する
このセクションでは、Cloud Shell にアクセスしてクイズ アプリケーションを含む Git リポジトリのクローンを作成し、アプリケーションを実行します。
Cloud Shell でソースコードのクローンを作成する
-
Cloud Shell のコマンドラインで次のコマンドを入力して、このクラスのリポジトリのクローンを作成します。
git clone --depth=1 https://github.com/GoogleCloudPlatform/training-data-analyst
-
作業ディレクトリへのソフトリンクを作成します。
ln -s ~/training-data-analyst/courses/developingapps/v1.3/java/datastore ~/datastore
クイズ アプリケーションを構成し、実行する
-
このラボのサンプル ファイルが含まれているディレクトリに移動します。
cd ~/datastore/start
-
Google Cloud Platform(GCP)プロジェクト ID を参照する環境変数 GCLOUD_PROJECT を作成します。
export GCLOUD_PROJECT=$DEVSHELL_PROJECT_ID
-
アプリケーションの依存関係をインストールします。
mvn clean install
インストールには数分かかる場合があります。完了すると、次のような出力が表示されます。
出力例:
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 38.805 s
[INFO] Finished at: 2018-05-27T22:40:49-04:00
[INFO] Final Memory: 35M/84M
[INFO] ------------------------------------------------------------------------
-
アプリケーションを実行します。
mvn spring-boot:run
アプリケーションの実行が開始されると、出力の最後の行が次のようになります。
11:48:08.939 [restartedMain] INFO c.g.training.appdev.QuizApplication - Started QuizApplication in 7.468 seconds (JVM running for 9.786)
クイズ アプリケーションを確認する
- Cloud Shell でウェブでプレビュー > [ポート 8080 でプレビュー] をクリックして、クイズ アプリケーションをプレビューします。

ウェブ アプリケーションのユーザー インターフェースが開きます。主に [Create Question]、[Take Test]、[Leaderboard] の 3 つの部分で構成されており、それぞれのリンクが上部のナビゲーション バーとページに表示されます。

-
[Create Question] をクリックします。
シンプルなフォームが表示されます。このフォームには、質問と解答用のテキストボックスと、正解を選択するためのラジオボタンが含まれています。出題者は、アプリケーションのこの部分に質問を追加できます。
アプリケーションのこの部分は、一般的な Java ウェブ アプリケーション フレームワークの Spring Boot を使用したサーバー側ウェブ アプリケーションとして記述されています。
-
[Take Test] をクリックします。
クライアント アプリケーションに移動します。まだ質問を作成していないため、[Quite Interesting Quiz] は空白です。
-
上部のナビゲーション バーで [GCP] をクリックします。
[Dummy Title] と [Dummy Answers] が表示されます。[Dummy Title] は質問の例です。
解答者は、アプリケーションのこの部分で質問に答えます。
この箇所は、一般的な JavaScript フレームワークである AngularJS を使用したクライアント側ウェブ アプリケーションとして記述されています。サーバーから JSON データを受け取り、ブラウザで JavaScript を使用して質問の表示と解答の収集を行います。
サーバー側アプリケーションに戻るには、ナビゲーション バーで [Quite Interesting Quiz] をクリックします。
クイズ アプリケーションのコードを調べる
このセクションでは、クイズ アプリケーションのコードをコードエディタで確認します。この作業は、このラボ全体を通じて行います。Cloud Shell にインストールされている nano や vim などの shell エディタ、または Cloud Shell コードエディタを使用できます。このラボでは、Cloud Shell コードエディタを使用します。
Cloud Shell テキスト エディタを起動する
Cloud Shell で [エディタを開く] アイコンをクリックします。
コードを確認する
このアプリケーションは、一般的な Spring Boot アプリケーション フレームワークを使用して記述された標準の Java アプリケーションです。
- エディタの左側にあるファイル ブラウザ パネルを使用して、
/training-data-analyst/courses/developingapps/v1.3/java/datastore/start フォルダに移動します。
これがこのアプリケーションのルートフォルダです。
datastore フォルダ内には end というフォルダもあります。この end フォルダには start フォルダと同じファイルが含まれていますが、end フォルダ内の各ファイルには、このラボの実行に必要なコードがすべて正しく記述されています。
-
エディタの左側にあるファイル ブラウザ パネルを使用して、start フォルダから src/main/java/com/google/training/appdev フォルダに移動します。
Java ソースコード ファイルのパスは、この appdev フォルダからの相対パスです。
Spring Boot ウェブ アプリケーションを確認する
-
.../QuizApplication.java ファイルを選択します。
このファイル内のクラスには、Spring Boot アプリケーションのエントリポイントが含まれています。
-
.../services/gcp/domain/Question.java ファイルを選択します。
このファイルのドメインクラスは、質問フォームで送信された質問データと、クイズに答えるときに表示される質問を表します。
-
.../web/QuestionsController.java ファイルを選択します。
このファイルには、フォームを表示するハンドラと、出題者がこのウェブ アプリケーションに投稿したフォームデータを収集するハンドラが含まれています。
QuestionsController.java ファイルで、/questions/add ルートに対する HTTP POST リクエストに応答するハンドラを見つけてください。
このハンドラの実装は、コントローラから questionService というサービスに委任されています。
- エディタの左側にあるファイル ブラウザ パネルを使用して、
/training-data-analyst/courses/developingapps/v1.3/java/datastore/start/src/main/resources フォルダに移動します。
このフォルダには、ウェブ アプリケーション ユーザー インターフェースのテンプレートと、クライアント側ウェブ アプリケーションに表示される静的コンテンツが含まれています。
-
templates フォルダを選択します。
このフォルダには、Thyme テンプレート エンジンを使用するウェブ アプリケーション ユーザー インターフェースのテンプレートが含まれています。
-
.../templates/new_question.html ファイルを選択します。
このファイルには、[Create Question] フォームのテンプレートが含まれています。クイズを選択するための選択リストと、出題者が質問と解答を入力できるテキストボックス、正解を選択するためのラジオボタンがあることを確認してください。
エディタの左側にあるファイル ブラウザ パネルを使用して、Java ソースコードを含むフォルダに戻ります(どのフォルダか覚えていますか?start/src/main/java/com/google/training/appdev です)。
-
.../api/QuizEndpoint.java ファイルを選択します。
このファイルには、クイズを受けるユーザーに JSON データを送信するハンドラが含まれています。これらのハンドラも questionService オブジェクトを利用しています。
-
.../services/gcp/datastore/QuestionService.java ファイルを選択します。
このファイルに、Cloud Datastore でクイズの質問の保存と読み込みを行うための Datastore コードを記述します。このウェブ アプリケーションと API はこのクラスを使用します。
Cloud Datastore にエンティティを追加する
このセクションでは、フォームデータを Cloud Datastore に保存するためのコードを記述します。
重要: 「// TODO」と「// END TODO」のコメント行の間にあるコードを更新します。
学習効果を最大限に高めるために、コード、インライン コメント、関連する API ドキュメントを確認してください。
詳細については、Datastore モードの Cloud Firestore に関するドキュメントをご覧ください。
App Engine アプリケーションを作成して Cloud Datastore をプロビジョニングする
Cloud Shell で [ターミナルを開く] アイコンをクリックし、Ctrl+C キーを押してアプリケーションを停止します。
プロジェクトに App Engine アプリケーションを作成するために、Cloud Shell で次のコマンドを実行します。
gcloud app create --region "us-central"
注: このウェブ アプリケーションではまだ App Engine を使用していませんが、Cloud Datastore を使用するには、プロジェクトに App Engine アプリケーションを作成する必要があります。
Java Datastore パッケージをインポートして使用する
-
Cloud Shell エディタで .../services/gcp/datastore/QuestionService.java ファイルを開きます。
-
com.google.cloud.datastore.* パッケージのワイルドカード インポートを記述します。
// TODO: com.google.cloud.datastore.* パッケージをインポートする
import com.google.cloud.datastore.*;
// END TODO
-
datastore という名前の Datastore クライアント オブジェクトを宣言して初期化します。
// TODO: Datastore クライアント オブジェクト datastore を作成する
// DatastoreOptions クラスには getDefaultInstance()
// 静的メソッドがあります。
// DatastoreOptions オブジェクトの getService() メソッドを
// 使用して Datastore クライアントを取得します。
private Datastore datastore =
DatastoreOptions.getDefaultInstance().getService();
// END TODO
これらの更新が完了すると、QuestionService.java の前半部分が次のようになります。
package com.google.training.appdev.services.gcp.datastore;
// TODO: com.google.cloud.datastore.* パッケージをインポートする
import com.google.cloud.datastore.*;
// END TODO
import com.google.training.appdev.services.gcp.domain.Question;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.springframework.stereotype.Service;
@Service
public class QuestionService {
// TODO: Datastore クライアント オブジェクト datastore を作成する
// DatastoreOptions クラスには getDefaultInstance()
// 静的メソッドがあります。
// DatastoreOptions オブジェクトの getService() メソッドを
// 使用して Datastore クライアントを取得します。
private Datastore datastore =
DatastoreOptions.getDefaultInstance().getService();
// END TODO
Cloud Datastore エンティティを作成するコードを記述する
-
ENTITY_KIND という名前の静的最終文字列を宣言して、値 "Question" で初期化します。
// TODO: kind という名前の静的最終文字列を宣言する
// Datastore のキーはリレーショナル データベースの
// 主キーに相当します。
// キーを記述する方法は主に 2 つあります。
// 1. kind を指定し、Datastore で一意の数値 ID を // 生成する
// 2. kind と一意の文字列 ID を指定する
private static final String ENTITY_KIND = "Question";
// END TODO
-
Question エンティティの KeyFactory を作成します。
エンティティの詳細については、エンティティ、プロパティ、キーをご覧ください。
// TODO: Question エンティティの KeyFactory を作成する
private final KeyFactory keyFactory =
datastore.newKeyFactory().setKind(ENTITY_KIND);
// END TODO
-
createQuestion(Question question) メソッドで、このメソッドの戻り値の型を Key に変更します。
// TODO: 戻り値の型を Key に変更する
public Key createQuestion(Question question) {
// END TODO
-
Datastore クライアントと KeyFactory を使用して、Question エンティティに割り当てられた ID を持つキーを宣言します。
// TODO: Datastore で割り当てられた ID を持つ
// エンティティ キーを宣言する
Key key = datastore.allocateId(keyFactory.newKey());
// END TODO
詳細については、クラス KeyFactory をご覧ください。
-
questionEntity という名前のエンティティを宣言し、エンティティ ビルダーを使用して初期化します。
// TODO: キーと値を使用してエンティティ オブジェクトを宣言する
// Entity.Builder を使用してエンティティのメンバーを設定します。
// これにはプロパティの名前と値を設定する set メソッドがあります。
// 値はドメイン オブジェクトから取得します。
Entity questionEntity = Entity.newBuilder(key)
.set(Question.QUIZ, question.getQuiz())
.set(Question.AUTHOR, question.getAuthor())
.set(Question.TITLE, question.getTitle())
.set(Question.ANSWER_ONE,question.getAnswerOne())
.set(Question.ANSWER_TWO, question.getAnswerTwo())
.set(Question.ANSWER_THREE,question.getAnswerThree())
.set(Question.ANSWER_FOUR, question.getAnswerFour())
.set(Question.CORRECT_ANSWER,
question.getCorrectAnswer())
.build();
// END TODO
-
Datastore クライアント オブジェクト(datastore)の put(questionEntity) メソッドを呼び出してこのエンティティを保存します。
// TODO: エンティティを保存する
datastore.put(questionEntity);
// END TODO
-
このエンティティのキーを返すように return ステートメントを変更します。
// TODO: キーを返す
return key;
// END TODO
-
ファイルを保存します。
ここまでの更新がすべて完了すると、QuestionService.java の内容が次のようになります。
// createQuestion(Question question) メソッドに、
// フォームデータを使用した Question オブジェクトを渡します。
// フォームデータを抽出して Datastore に追加します。
// TODO: 戻り値の型を Key に変更する
public Key createQuestion(Question question) {
// END TODO
// TODO: Datastore で割り当てられた ID を持つ
// エンティティ キーを宣言する
Key key = datastore.allocateId(keyFactory.newKey());
// END TODO
// TODO: キーと値を使用してエンティティ オブジェクトを宣言する
// Entity.Builder を使用してエンティティのメンバーを設定します。
// これにはプロパティの名前と値を設定する set メソッドがあります。
// 値はドメイン オブジェクトから取得します。
Entity questionEntity = Entity.newBuilder(key)
.set(Question.QUIZ, question.getQuiz())
.set(Question.AUTHOR, question.getAuthor())
.set(Question.TITLE, question.getTitle())
.set(Question.ANSWER_ONE,question.getAnswerOne())
.set(Question.ANSWER_TWO, question.getAnswerTwo())
.set(Question.ANSWER_THREE,question.getAnswerThree())
.set(Question.ANSWER_FOUR, question.getAnswerFour())
.set(Question.CORRECT_ANSWER,
question.getCorrectAnswer())
.build();
// END TODO
// TODO: エンティティを保存する
datastore.put(questionEntity);
// END TODO
// TODO: キーを返す
return key;
// END TODO
アプリケーションを実行して Cloud Datastore エンティティを作成する
-
Cloud Shell で [ターミナルを開く] アイコンをクリックし、アプリケーションを実行します。
mvn spring-boot:run
アプリケーションの実行が開始されると、出力の最後の行が次のようになります。
11:50:12.862 [restartedMain] INFO c.g.training.appdev.QuizApplication - Started QuizApplication in 6.048 seconds (JVM running for 7.66)
-
Cloud Shell でウェブでプレビュー > [ポート 8080 でプレビュー] をクリックし、クイズ アプリケーションをプレビューします。
-
[Create Question] をクリックし、フォームに次の値を入力して、[Save] をクリックします。
|
フォームの項目
|
値
|
|
Author
|
[自分の名前]
|
|
Quiz
|
Google Cloud Platform
|
|
Title
|
Which company owns GCP?
|
|
Answer 1
|
Amazon
|
|
Answer 2
|
Google([Answer 2] のラジオボタンを選択します)
|
|
Answer 3
|
IBM
|
|
Answer 4
|
Microsoft
|
アプリケーションのホームページに戻ります。
作成した質問が DataReturn に格納されます。Cloud Platform Console でナビゲーション メニュー > [Datastore] > [エンティティ] をクリックすると、この新しい質問が表示されます。
Cloud Datastore のクエリを実行する
このセクションでは、Cloud Datastore からエンティティ データを取得するためのコードを記述します。
Cloud Datastore エンティティを取得するためのコードを記述する
-
Cloud Shell で [エディタを開く] アイコンをクリックします。.../services/gcp/datastore/QuestionService.java ファイルの getAllQuestions(String quiz) メソッドに移動して、既存の Dummy 質問のコードを削除します。
// TODO: このコードを削除する
List<Question> questions = new ArrayList<>();
Question dummy = new Question.Builder()
.withQuiz("gcp")
.withAuthor("Dummy Author")
.withTitle("Dummy Title")
.withAnswerOne("Dummy Answer One")
.withAnswerTwo("Dummy Answer Two")
.withAnswerThree("Dummy Answer Three")
.withAnswerFour("Dummy Answer Four")
.withCorrectAnswer(1)
.withId(-1)
.build();
questions.add(dummy);
return questions;
// END TODO
-
引き続き、getAllQuestions(String quiz) メソッドでクエリ オブジェクトを作成して、Cloud Datastore から特定のクイズの Question エンティティを取得するクエリで初期化します。
// TODO: クエリを作成する
// Query クラスに静的メソッド newEntityQueryBuilder() が
// あります。このメソッドを使用して、取得する
// エンティティの kind を指定できます。
// 質問ごとに Question エンティティをフィルタ
// するようにクエリをカスタマイズできます。
Query<Entity> query = Query.newEntityQueryBuilder()
.setKind(ENTITY_KIND)
.setFilter(StructuredQuery.PropertyFilter.eq(
Question.QUIZ, quiz))
.build();
// END TODO
詳細については、Datastore クエリをご覧ください。
-
Datastore クライアント オブジェクトの datastore.run(query) メソッドを呼び出して、結果を entities という名前のエンティティ イテレータに代入します。
// TODO: クエリを実行する
// datastore.run(query) メソッドはエンティティの
// イテレータを返します。
Iterator<Entity> entities = datastore.run(query);
// END TODO
-
buildQuestions(entities) メソッドを使用して Datastore エンティティをドメイン オブジェクトに変換して、変換結果を返します。
// TODO: 変換結果を返す
// buildQuestions(entities) メソッドを使用して
// Datastore エンティティをドメイン オブジェクトに変換します。
return buildQuestions(entities);
// END TODO
-
QuestionService クラスで提供されているヘルパー メソッドの buildQuestions(...) と entityToQuestion(...) のコメント化を解除し、それらを使用してこのイテレータを質問ドメイン オブジェクトのリストにマッピングします。
更新された QuestionService.java は次のようになります。
public List<Question> getAllQuestions(String quiz){
// TODO: クエリを作成する
// Query クラスに静的メソッド newEntityQueryBuilder()
// があります。このメソッドを使用して、取得する
// エンティティの kind を指定できます。
// 質問ごとに Question エンティティをフィルタ
// するようにクエリをカスタマイズできます。
Query<Entity> query = Query.newEntityQueryBuilder()
.setKind(ENTITY_KIND)
.setFilter(StructuredQuery.PropertyFilter.eq(
Question.QUIZ, quiz))
.build();
// END TODO
// TODO: クエリを実行する
// datastore.run(query) メソッドはエンティティの
// イテレータを返します。
Iterator<Entity> entities = datastore.run(query);
// END TODO
// TODO: 変換結果を返す
// buildQuestions(entities) メソッドを使用して
// Datastore エンティティをドメイン オブジェクトに変換します。
return buildQuestions(entities);
// END TODO
}
private List<Question> buildQuestions(Iterator<Entity> entities){
List<Question> questions = new ArrayList<>();
entities.forEachRemaining(entity-> questions.add(entityToQuestion(entity)));
return questions;
}
private Question entityToQuestion(Entity entity){
return new Question.Builder()
.withQuiz(entity.getString(Question.QUIZ))
.withAuthor(entity.getString(Question.AUTHOR))
.withTitle(entity.getString(Question.TITLE))
.withAnswerOne(entity.getString(Question.ANSWER_ONE))
.withAnswerTwo(entity.getString(Question.ANSWER_TWO))
.withAnswerThree(entity.getString(Question.ANSWER_THREE))
.withAnswerFour(entity.getString(Question.ANSWER_FOUR))
.withCorrectAnswer(entity.getLong(Question.CORRECT_ANSWER))
.withId(entity.getKey().getId())
.build();
}
}
アプリケーションを実行して Cloud Datastore に対するクエリをテストする
-
.../services/gcp/datastore/QuestionService.java ファイルを保存して、Cloud Shell コマンドに戻ります。
-
Cloud Shell で [ターミナルを開く] をクリックし、Ctrl+C キーを押してアプリケーションを停止します。
-
アプリケーションを開始します。
-
Cloud Shell でウェブでプレビュー > [ポート 8080 でプレビュー] をクリックして、クイズ アプリケーションをプレビューします。
-
アプリケーションの URL の末尾のクエリ文字列を /api/quizzes/gcp に置き換えます。
この URL の形式は、https://8080-####-####.cloudshell.dev/api/quizzes/gcp です。先ほどこのウェブ アプリケーションに追加した質問に対応する JSON データがクライアントに返されます。
- アプリケーションのホームページに戻り、[Take Test] をクリックし、[GCP] をクリックします。
クライアント側ウェブ アプリケーションにクイズの質問が表示されます。
正しく回答できますか?
ラボを終了する
ラボが完了したら、[ラボを終了] をクリックします。ラボで使用したリソースが Google Cloud Skills Boost から削除され、アカウントの情報も消去されます。
ラボの評価を求めるダイアログが表示されたら、星の数を選択してコメントを入力し、[送信] をクリックします。
星の数は、それぞれ次の評価を表します。
- 星 1 つ = 非常に不満
- 星 2 つ = 不満
- 星 3 つ = どちらともいえない
- 星 4 つ = 満足
- 星 5 つ = 非常に満足
フィードバックを送信しない場合は、ダイアログ ボックスを閉じてください。
フィードバックやご提案の送信、修正が必要な箇所をご報告いただく際は、[サポート] タブをご利用ください。
Copyright 2026 Google LLC All rights reserved. Google および Google のロゴは、Google LLC の商標です。その他すべての社名および製品名は、それぞれ該当する企業の商標である可能性があります。