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

In dieser Anleitung erfahren Sie, wie Sie eine HTTP-Cloud Run-Funktion schreiben, die Cloud Spanner-Ergebnisse zurückgibt.

Ziele

Schreiben, bereitstellen und auslösen Sie eine HTTP-Funktion, die auf Cloud Spanner zugreift.

Kosten

In diesem Dokument werden Cloud 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. Spanner pricing.

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

Hinweis

  1. In diesem Dokument wird davon ausgegangen, dass Ihnen eine Cloud Spanner-Instanz namens test-instance und eine Datenbank namens example-db mit dem Musik anwendungs schema zur Verfügung stehen. Eine Anleitung zum Erstellen einer Instanz und einer Datenbank mit dem Musikanwendung schema finden Sie unter Schnellstart mit der Konsole oder in den Anleitungen für erste Schritte mit Node.js, oder Python.

  2. Aktivieren Sie die 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.

Erforderliche Rollen

Bitten Sie Ihren Administrator, Ihnen die folgenden IAM-Rollen zuzuweisen, um die Berechtigungen zu erhalten, die Sie zum Bereitstellen von Cloud Run-Diensten aus der Quelle benötigen:

Eine Liste der IAM-Rollen und -Berechtigungen im Zusammenhang mit Cloud Run finden Sie unter IAM-Rollen für Cloud Run und IAM-Berechtigungen für Cloud Run. Wenn Ihr Cloud Run-Dienst mit Google Cloud APIs wie Cloud-Clientbibliotheken verknüpft ist, lesen Sie die Konfigurationsanleitung für Dienstidentitäten. Weitere Informationen zum Zuweisen von Rollen finden Sie unter Bereitstellungsberechtigungen und Zugriff verwalten.

Rollen für das Cloud Build-Dienstkonto

Sie oder Ihr Administrator müssen dem Cloud Build-Dienstkonto die folgende IAM-Rolle zuweisen.

Erforderliche Rollen für das Cloud Build-Dienstkonto aufrufen

Cloud Build verwendet automatisch das Compute Engine-Standarddienstkonto als Standard-Cloud Build-Dienstkonto, um Ihren Quellcode und Ihre Cloud Run-Ressource zu erstellen, es sei denn, Sie überschreiben dieses Verhalten. Damit Cloud Build Ihre Quellen erstellen kann, bitten Sie Ihren Administrator, dem Cloud Run-Builder (roles/run.builder) die Rolle Compute Engine-Standarddienstkonto in Ihrem Projekt zuzuweisen:

  gcloud projects add-iam-policy-binding PROJECT_ID \
      --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \
      --role=roles/run.builder
  

Ersetzen Sie PROJECT_NUMBER durch Ihre Google Cloud Projektnummer und PROJECT_ID durch Ihre Google Cloud Projekt-ID. Eine detaillierte Anleitung zum Ermitteln der Projekt-ID und der Projektnummer, siehe Projekte erstellen und verwalten.

Es dauert einige Minuten, bis die Zuweisung der Rolle „Cloud Run-Builder“ für das Compute Engine-Standarddienstkonto übertragen wurde.

Rollen für die Dienstidentität

Sie müssen der Dienstidentität, die Sie für den Cloud Run-Dienst verwenden, die folgende IAM-Rolle zuweisen.

  • Cloud Spanner-Datenbankleser (roles/spanner.databaseReader)

Weitere Informationen zum Zuweisen von Rollen finden Sie unter Zugriff auf Projekte, Ordner und Organisationen verwalten.

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 run deploy nodejs-spanner-function \
    --source . \
    --region REGION \
    --function spannerQuickstart \
    --base-image RUNTIME_ID \
    --log-http

Python

gcloud 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 Konsole 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 „Erste Schritte“-Anleitung absolviert 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