Gérer les sessions avec Firestore

De nombreuses applications nécessitent une gestion de session pour l'authentification et les préférences utilisateur. ASP.NET Core est fourni avec un middleware pour stocker les sessions dans un cache distribué.

Le cache distribué par défaut d'ASP.NET n'est pas distribué du tout. Il stocke les données de session dans la mémoire du serveur Web. Lorsqu'un seul serveur Web diffuse un site Web, cette stratégie est adaptée. Toutefois, lorsque de nombreux serveurs Web diffusent un site Web, leurs utilisateurs peuvent rencontrer des erreurs et perdre des données.

Pour éviter les erreurs et la perte de données, une application ASP.NET doit utiliser un cache distribué qui stocke les données dans un magasin de données persistant. Ce tutoriel explique comment gérer les sessions sur Cloud Run en les stockant dans Firestore et en chiffrant les cookies avec Cloud Key Management Service.

Objectifs

  • Déployez l'application sur Cloud Run.

Coûts

Ce tutoriel utilise les composants facturables suivants de Google Cloud :

Obtenez une estimation des coûts en fonction de votre utilisation prévue à l'aide du simulateur de coût. Les nouveaux utilisateurs de Google Cloud peuvent bénéficier d'un essai gratuit.

Une fois que vous avez terminé ce tutoriel, vous pouvez éviter de continuer à payer des frais en supprimant les ressources que vous avez créées. Consultez la page Effectuer un nettoyage pour en savoir plus.

Avant de commencer

  1. Connectez-vous à votre compte Google.

    Si vous n'en possédez pas déjà un, vous devez en créer un.

  2. Dans Cloud Console, sur la page de sélection du projet, sélectionnez ou créez un projet Cloud.

    Accéder à la page de sélection du projet

  3. Vérifiez que la facturation est activée pour votre projet Google Cloud. Découvrez comment vérifier que la facturation est activée pour votre projet.

  4. Activer les API Firestore, Cloud Run, Cloud Key Management Service, and Cloud Storage.

    Activer les API

  5. Pour créer une base de données Firestore en mode natif, effectuez la procédure suivante :
    1. Dans Cloud Console, accédez à la page du lecteur Firestore.
      Accéder au lecteur Firestore
    2. Sur l'écran Sélectionner un mode Cloud Firestore, cliquez sur Sélectionner le mode natif.
    3. Sélectionnez un emplacement pour votre base de données Firestore. Ce paramètre d'emplacement correspond à l'emplacement par défaut des ressources Google Cloud de votre projet Cloud. Cet emplacement est utilisé pour les services Google Cloud exploités dans votre projet Cloud qui requièrent un paramètre d'emplacement, plus précisément le bucket Cloud Storage par défaut et l'application App Engine.
    4. Cliquez sur Créer une base de données.
  6. Dans Cloud Shell, ouvrez le code source de l'application.
    Accéder à Cloud Shell

    Cloud Shell vous permet d'accéder en ligne de commande à vos ressources Google Cloud, directement depuis votre navigateur.

  7. Pour télécharger l'exemple de code et accéder au répertoire de l'application, cliquez sur Continuer.
  8. Dans Cloud Shell, configurez l'outil gcloud pour qu'il utilise votre nouveau projet Google Cloud :

    # Configure gcloud for your project
    gcloud config set project PROJECT_ID
    

    Remplacez PROJECT_ID par l'ID de projet Google Cloud que vous avez créé à l'aide de la Cloud Console.

    L'outil de ligne de commande gcloud est le principal moyen d'interagir avec vos ressources Google Cloud via la ligne de commande. Dans ce tutoriel, l'outil gcloud vous permet de déployer et de surveiller votre application.

Examiner le code source

Le diagramme suivant illustre la façon dont Firestore gère les sessions pour l'application Cloud Run.

Schéma d'architecture : utilisateur, Cloud Run, Firestore.

La méthode ConfigureServices du fichier Startup.cs configure l'application pour qu'elle utilise Cloud KMS pour le chiffrement et que Cloud Storage stocke les clés chiffrées.

  1. Dans Cloud Shell, cliquez sur Lancer l'éditeur pour lancer l'éditeur et examiner le fichier 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();
    }
    

Configuration du projet Google Cloud

  1. Dans l'éditeur Cloud Shell, modifiez le fichier appsettings.json et remplacez les deux instances de YOUR-PROJECT-ID par votre ID de projet Cloud. Enregistrez le fichier.

    {
      "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. Créez un nouveau trousseau de clés Cloud Key Management Service nommé dataprotectionprovider :

    gcloud kms keyrings create dataprotectionprovider --location global

  3. Créez une nouvelle clé Cloud Key Management Service nommée masterkey :

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

  4. Créez un bucket Cloud Storage pour stocker les clés chiffrées :

    gsutil mb gs://PROJECT_ID-bucket

Déployer et exécuter sur Cloud Run

Vous pouvez utiliser Cloud Run pour créer et déployer une application qui fonctionne de manière fiable sous une charge élevée et avec de grandes quantités de données.

Ce tutoriel utilise Cloud Run pour déployer le serveur.

  1. Dans votre Cloud Shell, publiez votre application :

    dotnet publish -c Release
    
  2. Utilisez Cloud Build pour créer un conteneur Docker et publier dans Container Registry :

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

  3. Exécutez le conteneur avec Cloud Run :

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

    Notez l'URL dans la sortie :

    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. Pour afficher l'application en direct, accédez à l'URL que vous avez copiée à l'étape précédente.

Supprimer des sessions

Google Cloud Console vous permet de supprimer les données de session. Vous pouvez également mettre en œuvre une stratégie de suppression automatique. Si vous utilisez des solutions de stockage pour des sessions telles que Memcache ou Redis, les sessions expirées sont automatiquement supprimées.

Déboguer l'application

Si vous ne pouvez pas vous connecter à votre application Cloud Run, vérifiez les points suivants :

  1. Vérifiez que les commandes de déploiement gcloud ont bien abouti et n'ont généré aucune erreur. S'il y a eu des erreurs (par exemple, message=Build failed), corrigez-les et réessayez de déployer l'application Cloud Run.
  2. Consultez le guide Cloud Run sur l'affichage des journaux.

Nettoyer

Supprimer le projet

  1. Dans Cloud Console, accédez à la page Gérer les ressources.

    Accéder à la page Gérer les ressources

  2. Dans la liste des projets, sélectionnez le projet que vous souhaitez supprimer, puis cliquez sur Supprimer .
  3. Dans la boîte de dialogue, saisissez l'ID du projet, puis cliquez sur Arrêter pour supprimer le projet.

Étape suivante