Cloud Run-Funktion erstellen, die Spanner-Ergebnisse zurückgibt

Lernziele

Schreiben, Bereitstellen und Auslösen einer HTTP-Cloud-Funktion, die auf Cloud Spanner zugreift.

Kosten

In diesem Dokument werden Spanner und Cloud Run verwendet, zwei kostenpflichtige Komponenten von Google Cloud.

  • Informationen zu den Kosten für die Verwendung von Cloud Spanner finden Sie auf der Seite zu den Preisen für Cloud Spanner.

  • Informationen zu den Kosten für die Verwendung von Cloud Run, einschließlich kostenloser Aufrufe, finden Sie unter Cloud Run-Preise.

Hinweise

  1. In diesem Thema wird davon ausgegangen, dass Ihnen eine Cloud Spanner-Instanz namens test-instance und eine Datenbank namens example-db mit dem Musikanwendungsschema zur Verfügung stehen. Weitere Informationen zum Erstellen von Instanzen und Datenbanken mit dem Musikanwendungsschema finden Sie unter Schnellstart: Console verwenden oder in den Anleitungen für erste Schritte mit Node.js oder Python.

  2. Aktivieren Sie die Cloud Run Functions, Cloud Run und Cloud Build APIs.

    APIs aktivieren

  3. Installieren und initialisieren Sie die gcloud CLI.

    Wenn Sie die gcloud CLI bereits installiert haben, aktualisieren Sie sie mit dem folgenden Befehl:

    gcloud components update
    
  4. Bereiten Sie Ihre Entwicklungsumgebung vor:

    Node.js

    Weitere Informationen finden Sie im Einrichtungsleitfaden für Node.js.

    Python

    Weitere Informationen finden Sie im Einrichtungsleitfaden für Python.

Anwendung vorbereiten

  1. Klonen Sie das Repository der Beispiel-App auf Ihren lokalen Computer:

    Node.js

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

    Sie können auch das Beispiel als ZIP-Datei herunterladen und extrahieren.

    Python

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

    Sie können auch das Beispiel als ZIP-Datei herunterladen und extrahieren.

  2. Wechseln Sie zu dem Verzeichnis, das den Beispielcode für Cloud Run Functions für den Zugriff auf Cloud Spanner enthält:

    Node.js

    cd nodejs-docs-samples/functions/spanner

    Python

    cd python-docs-samples/functions/spanner
  3. Sehen Sie sich den Beispielcode an:

    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)
    
    

    Die Funktion sendet eine SQL-Abfrage, um alle Albums-Daten aus Ihrer Datenbank abzurufen. Sie wird ausgeführt, wenn Sie eine HTTP-Anfrage an den Endpunkt der Funktion stellen.

Funktion bereitstellen

Führen Sie zum Bereitstellen der Funktion mit einem HTTP-Trigger den folgenden Befehl im Verzeichnis spanner aus:

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

Ersetzen Sie:

Die Bereitstellung der Funktion kann bis zu zwei Minuten dauern.

Beachten Sie den url-Wert, der zurückgegeben wird, wenn die Bereitstellung Ihrer Funktion abgeschlossen ist. Sie benötigen diesen Wert, wenn Sie die Funktion auslösen.

Sie können Ihre bereitgestellten Funktionen in der Google Cloud Console auf der Seite Cloud Run sehen. Sie können auf dieser Seite auch Funktionen erstellen und bearbeiten sowie Details und Diagnosen für Ihre Funktionen abrufen.

Funktion auslösen

Senden Sie einen HTTP-Anfrage an Ihre Funktion:

curl URL

Ersetzen Sie URL durch den URL-Wert, der zurückgegeben wird, wenn die Bereitstellung der Funktion abgeschlossen ist.

Sie sollten eine Ausgabe sehen, die die Ergebnisse der SQL-Abfrage enthält, vorausgesetzt, Sie haben eine Startanleitung durchgearbeitet und die Datenbank aufgefüllt:

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

Sie können auch die URL der Funktion im Browser aufrufen, um das Ergebnis der SQL-Abfrage zu sehen.

Bereinigen

So vermeiden Sie, dass Ihrem Google Cloud -Konto für die in diesem Dokument verwendeten Ressourcen für Cloud Spanner und Cloud Run-Funktionen weitere Gebühren berechnet werden:

  1. Löschen Sie die Instanz:

    gcloud CLI instances delete test-instance
    
  2. Löschen Sie den Cloud Run-Dienst, den Sie in dieser Anleitung bereitgestellt haben:

    Node.js

    gcloud run services delete nodejs-spanner-function

    Python

    gcloud run services delete python-spanner-function

Nächste Schritte