Firestore でのセッション処理

このチュートリアルでは、Cloud Run でセッションを取り扱う方法を示します。

多くのアプリには、認証設定とユーザー設定用のセッション処理が必要です。Jetty フレームワークには、この機能を実行するためのメモリベースの実装が付属しています。ただし、記録されるセッションがインスタンス間で異なる場合があるため、この実装は複数のインスタンスから提供できるアプリには適していません。このチュートリアルでは、Cloud Run でセッションを取り扱う方法を示します。

目標

  • アプリを作成する。
  • アプリをローカルで実行する。
  • アプリを Cloud Run にデプロイする。

費用

このドキュメントでは、課金対象である次の Google Cloudコンポーネントを使用します。

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。

新規の Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。

このドキュメントに記載されているタスクの完了後、作成したリソースを削除すると、それ以上の請求は発生しません。詳細については、クリーンアップをご覧ください。

始める前に

  1. Google Cloud アカウントにログインします。 Google Cloudを初めて使用する場合は、 アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the Firestore API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  6. Verify that billing is enabled for your Google Cloud project.

  7. Enable the Firestore API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

  8. Google Cloud コンソールで、Cloud Shell でアプリを開きます。

    Cloud Shell に移動

    Cloud Shell を使用すると、ブラウザからコマンドラインで直接クラウド リソースにアクセスできます。ブラウザで Cloud Shell を開き、[確認] をクリックしてサンプルコードをダウンロードし、アプリ ディレクトリに移動します。

  9. Cloud Shell で、新しい Google Cloud プロジェクトを使用するように gcloud CLI を構成します。
    # Configure gcloud for your project
    gcloud config set project YOUR_PROJECT_ID
    
  10. Maven を更新して Java 11 をデフォルトで使用します。
    sudo update-alternatives --config java
    
    プロンプトが表示されたら、Java 11 を選択する番号を入力します。そのバージョンのパスが表示されるので、メモしておきます。
  11. 前の手順でメモしたパスを環境変数としてエクスポートします。
    export JAVA_HOME=java-11-path
    

ウェブアプリ

このアプリは、ユーザーごとに異なる言語で挨拶を表示します。リピーターは常に同じ言語で挨拶されます。

さまざまな言語で挨拶が表示されている複数のアプリ ウィンドウ。

アプリでユーザーの設定を保存するには、現在のユーザーに関する情報をセッションに保存する方法が必要です。このサンプルアプリは、WebFilter を使用して Firestore のセッションデータを取得、更新します。

@Override
public void init(FilterConfig config) throws ServletException {
  // Initialize local copy of datastore session variables.
  firestore = FirestoreOptions.getDefaultInstance().getService();
  sessions = firestore.collection("sessions");

  try {
    // Delete all sessions unmodified for over two days.
    Calendar cal = Calendar.getInstance();
    cal.setTime(new Date());
    cal.add(Calendar.HOUR, -48);
    Date twoDaysAgo = Calendar.getInstance().getTime();
    QuerySnapshot sessionDocs =
        sessions.whereLessThan("lastModified", dtf.format(twoDaysAgo)).get().get();
    for (QueryDocumentSnapshot snapshot : sessionDocs.getDocuments()) {
      snapshot.getReference().delete();
    }
  } catch (InterruptedException | ExecutionException e) {
    throw new ServletException("Exception initializing FirestoreSessionFilter.", e);
  }
}

次の図は、Firestore が Cloud Run アプリのセッションを取り扱う方法を示しています。

アーキテクチャの図: ユーザー、Cloud Run、Firestore。

HttpServletRequest は Cookie を使用してローカル セッションの一意の ID を保存します。これは、セッションの詳細を含む Firestore のドキュメントに対応しています。

セッションの削除

Firestore は、古いセッションや期限切れのセッションを削除しません。Google Cloud コンソールセッション データを削除するか、自動削除戦略を実装できます。セッションに、Memcache や Redis などのストレージ ソリューションを使用すると、期限切れのセッションが自動的に削除されます。

ローカルでの実行

  1. HTTP サーバーを起動します。

    mvn jetty:run
    
  2. ウェブブラウザでアプリを表示します。

    Cloud Shell

    Cloud Shell ツールバーの [ウェブでプレビュー] ウェブでプレビュー アイコンをクリックし、[ポート 8080 でプレビュー] を選択します。

    ローカルマシン

    ブラウザで、http://localhost:8080 にアクセスします。

    5 つの挨拶(「Hello World」、「Hallo Welt」、「Hola mundo」、「Salut le Monde」、「Ciao Mondo」)のいずれかが表示されます。別のブラウザまたはシークレット モードでページを開くと、別の言語で表示されます。セッション データは Google Cloud コンソールで表示して編集できます。

     Google Cloud コンソールの Firestore セッション。

  3. HTTP サーバーを停止するには、ターミナル ウィンドウで Control+C を押します。

Cloud Run でのデプロイと実行

Cloud Run を使用すると、高負荷の元で大量のデータを使用して正常に実行されるアプリをビルドしてデプロイできます。

  1. ターミナル ウィンドウで、Jib Maven プラグインを使用してコードのイメージをビルドし、Google Container Registry(GCR)にデプロイします。

    mvn clean package jib:build

  2. Cloud Run にアプリをデプロイします。

       gcloud beta run deploy session-handling --image gcr.io/MY_PROJECT/session-handling 
    --platform managed --region us-central1 --memory 512M

    MY_PROJECT は、作成したGoogle Cloud プロジェクトの ID に置き換えます。このコマンドにより返された URL にアクセスして、ページ移動のときセッションデータがどのように保持されるかを確認してください。

アプリのデバッグ

Cloud Run アプリに接続できない場合は、次の点を確認してください。

  1. gcloud デプロイ コマンドが正常に終了して、エラーを出力しなかったことを確認します。エラー(message=Build failedなど)がある場合は、修正し、Cloud Run アプリのデプロイを再度行ってください。
  2. Google Cloud コンソールで、[ログ エクスプローラ] ページに移動します。

    [ログ エクスプローラ] ページに移動

    1. [最近選択したリソース] プルダウン リストで [Cloud Run アプリケーション] をクリックし、[すべての module_id] をクリックします。アプリにアクセスした以降のリクエストのリストが表示されます。リクエストのリストが表示されない場合は、プルダウン リストで [All module_id ] が選択されていることを確認します。エラー メッセージがGoogle Cloud コンソールに出力された場合は、アプリのコードがウェブアプリの作成に関するセクション内のコードと一致することを確認します。

    2. Firestore API が有効になっていることを確認します。

クリーンアップ

プロジェクトを削除する

  1. Google Cloud コンソールで [リソースの管理] ページに移動します。

    [リソースの管理] に移動

  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。

Cloud Run インスタンスの削除

Cloud Run からサービスを削除します。

  • Google Cloud コンソールで、Cloud Run の [サービス] ページに移動します。

    [サービス] ページに移動

  • 削除するサービスを選択します。
  • [削除] をクリックして、サービスを削除します。

次のステップ