Firestore でのセッション処理

多くのアプリでは、認証設定とユーザー設定用にセッション管理が必要です。ASP.NET Core には、セッションを分散キャッシュに保存するためのミドルウェアが付属しています。

ASP.NET のデフォルトの分散キャッシュは、実際には分散されていません。 セッションデータはウェブサーバーのメモリに保存されます。1 つのウェブサーバーのみがウェブサイトを提供している場合、これが適しています。しかし、多くのウェブサーバーがウェブサイトを提供している場合、エラーやデータの消失が発生する可能性があります。

エラーとデータの損失を回避するために、ASP.NET アプリは、永続データストアにデータを保存する分散キャッシュを使用する必要があります。このチュートリアルでは、Cloud Run でセッションを Firestore に保存し、Cloud Key Management Service で Cookie を暗号化してセッションを管理する方法を説明します。

目標

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

費用

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

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

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

始める前に

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

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

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

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

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

  4. Firestore, Cloud Run, Cloud Key Management Service, and Cloud Storage API を有効にします。

    API を有効にする

  5. Firestore データベースをネイティブ モードで作成するには、次の手順に沿って操作してください。
    1. Cloud Console で、[Firestore Viewer] ページに移動します。
      Firestore Viewer に移動
    2. [Cloud Firestore モードの選択] 画面から、[ネイティブ モードを選択] をクリックします。
    3. Firestore データベースのロケーションを選択します。このロケーション設定は、Cloud プロジェクトのデフォルトの Google Cloud リソースのロケーションです。このロケーションは、特にデフォルトの Cloud Storage バケットおよび App Engine アプリの、ロケーション設定を必要とする Cloud プロジェクト内の Google Cloud サービスで使用されます。
    4. [データベースを作成] をクリックします。
  6. Cloud Shell で、アプリのソースコードを開きます。
    Cloud Shell に移動

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

  7. サンプルコードをダウンロードしてアプリのディレクトリに移動するには、[続行] をクリックします。
  8. Cloud Shell で、gcloud ツールを構成して新しい Google Cloud プロジェクトを使用します。

    # Configure gcloud for your project
    gcloud config set project PROJECT_ID
    

    PROJECT_ID を、Cloud Console を使用して作成した Google Cloud プロジェクト ID に置き換えます。

    gcloudコマンドライン ツールは、コマンドラインから Google Cloud リソースを操作する基本的な方法です。このチュートリアルでは、gcloud ツールを使用してアプリをデプロイおよびモニタリングします。

ソースコードを調べる

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

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

Startup.cs ファイルの ConfigureServices メソッドは、暗号化に Cloud KMS を使用し、暗号化された鍵を Cloud Storage に保存するようにアプリを設定します。

  1. Cloud Shell で、[エディタを立ち上げる] をクリックしてエディタを起動し、Startup.cs ファイルを調べます。

    public void ConfigureServices(IServiceCollection services)
    {
        // Antiforgery tokens require data protection.
        services.AddDataProtection()
            // Store keys in Cloud Storage so that multiple instances
            // of the web application see the same keys.
            .PersistKeysToGoogleCloudStorage(
                Configuration["DataProtection:Bucket"],
                Configuration["DataProtection:Object"])
            // Protect the keys with Google KMS for encryption and fine-
            // grained access control.
            .ProtectKeysWithGoogleKms(
                Configuration["DataProtection:KmsKeyName"]);
        services.AddFirestoreDistributedCache(
                Configuration["FIRESTORE_PROJECT_ID"])
            .AddFirestoreDistributedCacheGarbageCollector();
        services.AddSession();
    }
    

Google Cloud プロジェクトを設定する

  1. Cloud Shell エディタで、appsettings.json ファイルを編集し、YOUR-PROJECT-ID の 2 つのインスタンスを Cloud プロジェクト ID に置き換えます。ファイルを保存します。

    {
      "Logging": {
        "LogLevel": {
          "Default": "Warning"
        }
      },
      "AllowedHosts": "*",
      "DataProtection": {
        "Bucket": "YOUR-PROJECT-ID-bucket",
        "Object": "DataProtectionProviderKeys.xml",
        "KmsKeyName": "projects/YOUR-PROJECT-ID/locations/global/keyRings/dataprotectionprovider/cryptoKeys/masterkey"
      }
    }
    
  2. dataprotectionprovider という名前の新しい Cloud Key Management Service キーリングを作成します。

    gcloud kms keyrings create dataprotectionprovider --location global

  3. masterkey という名前の新しい Cloud Key Management Service 鍵を作成します。

    gcloud kms keys create masterkey --location global --keyring dataprotectionprovider --purpose=encryption

  4. 暗号化された鍵を保存する Cloud Storage バケットを作成します。

    gsutil mb gs://PROJECT_ID-bucket

Cloud Run でのデプロイと実行

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

このチュートリアルでは、Cloud Run を使用してサーバーをデプロイします。

  1. Cloud Shell で、アプリを公開します。

    dotnet publish -c Release
    
  2. Cloud Build を使用して Docker コンテナをビルドし、Container Registry に公開します。

    gcloud builds submit --tag gcr.io/PROJECT_ID/sessions bin/Release/netcoreapp2.1/publish

  3. Cloud Run でコンテナを実行します。

    gcloud beta run deploy sessions --region us-central1 --platform managed --image gcr.io/PROJECT_ID/sessions --allow-unauthenticated

    出力の URL をメモしておきます。

    Service [sessions] revision [sessions-00003-xiz] has been deployed and is serving
    100 percent of traffic at https://sessions-r3f3em7nuq-uc.a.run.app
  4. ライブアプリを表示するには、前の手順でメモした URL に移動します。

セッションの削除

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

アプリのデバッグ

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

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

クリーンアップ

プロジェクトの削除

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

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

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

次のステップ