Créer une fonction Cloud Run qui renvoie des résultats Spanner

Objectifs

Rédiger, déployer et déclencher une fonction cloud HTTP qui accède à Spanner

Coûts

Ce document utilise Spanner et Cloud Run, qui sont des composants facturables de Google Cloud.

  • Pour en savoir plus sur le coût d'utilisation de Spanner, consultez la page Tarifs de Spanner.

  • Pour en savoir plus sur le coût d'utilisation de Cloud Run, y compris les appels gratuits, consultez la section Tarifs de Cloud Run.

Avant de commencer

  1. Dans ce document, nous supposons que vous disposez d'une instance Spanner nommée test-instance et d'une base de données nommée example-db qui utilise le schéma d'une application musicale. Pour obtenir des instructions sur la création d'une instance et d'une base de données avec le schéma d'application musicale, consultez la page Démarrage rapide avec la console ou les tutoriels de prise en main de Node.js ou Python.

  2. Activez les API Cloud Run Functions, Cloud Run et Cloud Build.

    Activer les API

  3. Installez et initialisez gcloud CLI.

    Si gcloud CLI est déjà installé, mettez-le à jour en exécutant la commande suivante :

    gcloud components update
    
  4. Préparez votre environnement de développement :

    Node.js

    Consultez le guide de configuration de Node.js.

    Python

    Consultez le guide de configuration de Python.

Préparer l'application

  1. Clonez le dépôt de l'exemple d'application sur votre ordinateur local :

    Node.js

    git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git

    Vous pouvez également télécharger l'exemple en tant que fichier zip et l'extraire.

    Python

    git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git

    Vous pouvez également télécharger l'exemple en tant que fichier zip et l'extraire.

  2. Accédez au répertoire contenant l'exemple de code Cloud Run Functions pour accéder à Spanner :

    Node.js

    cd nodejs-docs-samples/functions/spanner

    Python

    cd python-docs-samples/functions/spanner
  3. Consultez l'exemple de code :

    Node.js

    // Imports the Google Cloud client library
    const {Spanner} = require('@google-cloud/spanner');
    
    // Imports the functions framework to register your HTTP function
    const functions = require('@google-cloud/functions-framework');
    
    // Instantiates a client
    const spanner = new Spanner();
    
    // Your Cloud Spanner instance ID
    const instanceId = 'test-instance';
    
    // Your Cloud Spanner database ID
    const databaseId = 'example-db';
    
    /**
     * HTTP Cloud Function.
     *
     * @param {Object} req Cloud Function request context.
     * @param {Object} res Cloud Function response context.
     */
    functions.http('spannerQuickstart', async (req, res) => {
      // Gets a reference to a Cloud Spanner instance and database
      const instance = spanner.instance(instanceId);
      const database = instance.database(databaseId);
    
      // The query to execute
      const query = {
        sql: 'SELECT * FROM Albums',
      };
    
      // Execute the query
      try {
        const results = await database.run(query);
        const rows = results[0].map(row => row.toJSON());
        rows.forEach(row => {
          res.write(
            `SingerId: ${row.SingerId}, ` +
              `AlbumId: ${row.AlbumId}, ` +
              `AlbumTitle: ${row.AlbumTitle}\n`
          );
        });
        res.status(200).end();
      } catch (err) {
        res.status(500).send(`Error querying Spanner: ${err}`);
      }
    });

    Python

    import functions_framework
    from google.cloud import spanner
    
    instance_id = "test-instance"
    database_id = "example-db"
    
    client = spanner.Client()
    instance = client.instance(instance_id)
    database = instance.database(database_id)
    
    
    @functions_framework.http
    def spanner_read_data(request):
        query = "SELECT * FROM Albums"
    
        outputs = []
        with database.snapshot() as snapshot:
            results = snapshot.execute_sql(query)
    
            for row in results:
                output = "SingerId: {}, AlbumId: {}, AlbumTitle: {}".format(*row)
                outputs.append(output)
    
        return "\n".join(outputs)
    
    

    La fonction envoie une requête SQL pour extraire toutes les données Albums de votre base de données. La fonction est exécutée lorsque vous effectuez une requête HTTP sur le point de terminaison de la fonction.

Déployer la fonction

Pour déployer la fonction avec un déclencheur HTTP, exécutez la commande suivante dans le répertoire spanner :

Node.js

gcloud beta run deploy nodejs-spanner-function \
    --source . \
    --region REGION \
    --function spannerQuickstart \
    --base-image RUNTIME_ID \
    --log-http

Python

gcloud beta run deploy python-spanner-function \
    --source . \
    --region REGION \
    --function spanner_read_data \
    --base-image RUNTIME_ID \
    --log-http

Remplacez :

Le déploiement de la fonction peut prendre jusqu'à deux minutes.

Notez la valeur url affichée lorsque le déploiement de la fonction est terminé. Vous l'utiliserez lorsque vous déclencherez la fonction.

Vous pouvez afficher les fonctions que vous avez déployées sur la page Cloud Run de la console Google Cloud. Cette page vous permet également de créer et de modifier des fonctions, et d'obtenir des détails ou des diagnostics sur vos fonctions.

Déclencher la fonction

Envoyez une requête HTTP à votre fonction :

curl URL

Remplacez URL par la valeur d'URL renvoyée lorsque le déploiement de votre fonction se conclut.

Si vous avez suivi un tutoriel de prise en main et rempli la base de données, le résultat de la requête SQL semblable aux lignes suivantes devrait s'afficher:

SingerId: 2, AlbumId: 2, AlbumTitle: Forever Hold Your Peace
SingerId: 1, AlbumId: 2, AlbumTitle: Go, Go, Go
SingerId: 2, AlbumId: 1, AlbumTitle: Green
SingerId: 2, AlbumId: 3, AlbumTitle: Terrified
SingerId: 1, AlbumId: 1, AlbumTitle: Total Junk

Vous pouvez également accéder à l'URL de la fonction dans votre navigateur pour visualiser le résultat de votre requête SQL.

Effectuer un nettoyage

Afin d'éviter que des frais supplémentaires ne soient facturés sur votre compte Google Cloud pour les ressources Spanner et Cloud Run Functions utilisées dans ce document, procédez comme suit:

  1. Supprimez l'instance :

    gcloud CLI instances delete test-instance
    
  2. Supprimez le service Cloud Run que vous avez déployé dans ce tutoriel :

    Node.js

    gcloud run services delete nodejs-spanner-function

    Python

    gcloud run services delete python-spanner-function

Étape suivante