Firestore でのセッション処理

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

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

目標

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

費用

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

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。新しい Google Cloud ユーザーは無料トライアルをご利用いただけます。

このチュートリアルを終了した後、作成したリソースを削除すると、それ以上の請求は発生しません。詳しくは、クリーンアップをご覧ください。

始める前に

  1. Google アカウントにログインします。

    Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。

  2. Cloud Console のプロジェクト セレクタページで、Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタのページに移動

  3. Google Cloud プロジェクトに対して課金が有効になっていることを確認します。プロジェクトに対して課金が有効になっていることを確認する方法を学習する

  4. Firestore API を有効にします。

    API を有効にする

  5. Google Cloud Console から、Cloud Shell でアプリを開きます。

    Cloud Shell に移動

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

  6. Cloud Shell で、gcloud ツールを構成して新しい Google Cloud プロジェクトを使用します。
    # Configure gcloud for your project
    gcloud config set project YOUR_PROJECT_ID
    
  7. デフォルトで Java 11 を使用するように Maven を更新します。
    sudo update-alternatives --config java
    
    プロンプトが表示されたら、Java 11 を選択する番号を入力します。そのバージョンのパスが表示されるので、メモしておきます。
  8. 前の手順でメモしたパスを環境変数としてエクスポートします。
    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 Consoleセッション データを削除するか、自動削除の手段を実装できます。セッションに、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 Console で表示して編集できます。

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

アプリのデバッグ

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

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

    [ログビューア] ページに移動

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

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

クリーンアップ

プロジェクトの削除

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

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

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

Cloud Run インスタンスの削除

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

  • Cloud Console で、Cloud Run の [サービス] ページに移動します。

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

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

次のステップ