Erste Schritte mit Cloud Run-Funktionen

Erste Schritte mit Cloud Run-Funktionen

Informationen zu diesem Codelab

subjectZuletzt aktualisiert: Mai 7, 2025
account_circleVerfasst von Mete Atamel

1. Einführung

Übersicht

Cloud Run-Funktionen sind das FaaS-Angebot (Function as a Service) von Google Cloud, das auf Cloud Run und Eventarc basiert. Sie erhalten damit erweiterte Möglichkeiten zur Steuerung von Leistung und Skalierbarkeit sowie mehr Kontrolle über die Funktionslaufzeit und Trigger aus über 90 Ereignisquellen.

In diesem Codelab erfahren Sie, wie Sie Cloud Run-Funktionen erstellen, die auf HTTP-Aufrufe reagieren und durch Pub/Sub-Nachrichten und Cloud Audit Logs ausgelöst werden.

In diesem Codelab werden auch automatische Basis-Image-Updates für Funktionsbereitstellungen verwendet. Dazu wird ein Basis-Image mit dem Flag --base-image angegeben. Wenn Sie automatische Basis-Image-Aktualisierungen für Cloud Run konfigurieren, kann Google automatisch Sicherheits-Patches für die Betriebssystem- und Sprachlaufzeitkomponenten des Basis-Images anwenden. Sie müssen den Dienst nicht neu erstellen oder neu bereitstellen, damit das Basis-Image aktualisiert wird. Weitere Informationen finden Sie unter automatische Updates für Basis-Images.

Wenn Sie keine automatischen Basis-Image-Updates verwenden möchten, können Sie das Flag --base-image aus den Beispielen in diesem Codelab entfernen.

Lerninhalte

  • Cloud Run-Funktionen und automatische Basis-Image-Updates
  • So schreiben Sie eine Funktion, die auf HTTP-Aufrufe reagiert.
  • Eine Funktion schreiben, die auf Pub/Sub-Nachrichten reagiert
  • Eine Funktion schreiben, die auf Cloud Storage-Ereignisse reagiert
  • So teilen Sie den Traffic auf zwei Überarbeitungen auf.
  • Kaltstarts mit einer Mindestanzahl von Instanzen vermeiden

2. Einrichtung und Anforderungen

Stammordner erstellen

Erstellen Sie einen Stammordner für alle Beispiele.

mkdir crf-codelab
cd crf-codelab

Umgebungsvariablen einrichten

Legen Sie Umgebungsvariablen fest, die in diesem Codelab verwendet werden.

gcloud config set project <YOUR-PROJECT-ID>
REGION=<YOUR_REGION>

PROJECT_ID=$(gcloud config get-value project)

APIs aktivieren

Aktivieren Sie alle erforderlichen Dienste:

gcloud services enable \
  artifactregistry.googleapis.com \
  cloudbuild.googleapis.com \
  eventarc.googleapis.com \
  run.googleapis.com \
  logging.googleapis.com \
  pubsub.googleapis.com

3. HTTP-Funktion

Als Erstes erstellen wir eine authentifizierte Node.js-Funktion, die auf HTTP-Anfragen reagiert. Verwenden wir außerdem eine Zeitüberschreitung von 10 Minuten, um zu zeigen, wie eine Funktion mehr Zeit für die Beantwortung von HTTP-Anfragen haben kann.

Erstellen

Erstellen Sie einen Ordner für die App und rufen Sie ihn auf:

mkdir hello-http
cd hello-http

Erstellen Sie eine index.js-Datei, die auf HTTP-Anfragen reagiert:

const functions = require('@google-cloud/functions-framework');

functions.http('helloWorld', (req, res) => {
  res.status(200).send('HTTP with Node.js in Cloud Run functions!');
});

Erstellen Sie eine package.json-Datei, um die Abhängigkeiten anzugeben:

{
  "name": "nodejs-run-functions-codelab",
  "version": "0.0.1",
  "main": "index.js",
  "dependencies": {
    "@google-cloud/functions-framework": "^2.0.0"
  }
}

Bereitstellen

Die Funktion bereitstellen:

gcloud run deploy nodejs-run-function \
      --source . \
      --function helloWorld \
      --base-image nodejs22 \
      --region $REGION \
      --timeout 600 \
      --no-allow-unauthenticated

Mit diesem Befehl wird der Quellcode Ihrer Funktion mithilfe von Buildpacks in ein produktionsreifes Container-Image umgewandelt.

Hinweis:

  • Das Flag --source weist Cloud Run an, die Funktion in einem ausführbaren containerbasierten Dienst zu erstellen.
  • Mit dem Flag --function (neu) wird der Einstiegspunkt des neuen Dienstes auf die Funktionssignatur festgelegt, die aufgerufen werden soll.
  • Das Flag --base-image (neu) gibt die Umgebung des Basis-Images für Ihre Funktion an, z. B. nodejs22, python312, go123, java21, dotnet8, ruby33 oder php83. Weitere Informationen zu Basis-Images und den in den einzelnen Images enthaltenen Paketen finden Sie unter Basis-Images für Laufzeiten.
  • Optional: Mit dem Flag --timeout kann für die Funktion eine längere Zeitüberschreitung für die Beantwortung von HTTP-Anfragen festgelegt werden. In diesem Beispiel wird mit 600 Sekunden eine Antwortzeit von 10 Minuten simuliert.
  • Optional: das --no-allow-unauthenticated, um zu verhindern, dass Ihre Funktion öffentlich aufgerufen werden kann

Testen

Testen Sie die Funktion mit den folgenden Befehlen:

# get the Service URL
SERVICE_URL="$(gcloud run services describe nodejs-run-function --region $REGION --format 'value(status.url)')"

# invoke the service
curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL

Als Antwort sollte die Meldung HTTP with Node.js in Cloud Run functions! angezeigt werden.

4. Pub/Sub-Funktion

Als zweite Funktion erstellen wir eine Python-Funktion, die durch eine Pub/Sub-Nachricht ausgelöst wird, die in einem bestimmten Thema veröffentlicht wird.

Pub/Sub-Authentifizierungstokens einrichten

Wenn Sie das Pub/Sub-Dienstkonto am oder vor dem 8. April 2021 aktiviert haben, weisen Sie dem Pub/Sub-Dienstkonto die Rolle iam.serviceAccountTokenCreator zu:

PROJECT_NUMBER=$(gcloud projects list --filter="project_id:$PROJECT_ID" --format='value(project_number)')

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member  serviceAccount:service-$PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \
  --role roles/iam.serviceAccountTokenCreator

Erstellen

Erstellen Sie ein Pub/Sub-Thema für das Beispiel:

TOPIC=cloud-run-functions-pubsub-topic
gcloud pubsub topics create $TOPIC

Erstellen Sie einen Ordner für die App und rufen Sie ihn auf:

mkdir ../hello-pubsub
cd ../hello-pubsub

Erstellen Sie eine main.py-Datei, in der eine Nachricht mit der CloudEvent-ID protokolliert wird:

import functions_framework

@functions_framework.cloud_event
def hello_pubsub(cloud_event):
   print('Pub/Sub with Python in Cloud Run functions! Id: ' + cloud_event['id'])

Erstellen Sie eine requirements.txt-Datei mit folgendem Inhalt, um die Abhängigkeiten anzugeben:

functions-framework==3.*

Bereitstellen

Die Funktion bereitstellen:

gcloud run deploy python-pubsub-function \
       --source . \
       --function hello_pubsub \
       --base-image python313 \
       --region $REGION \
       --no-allow-unauthenticated

Rufen Sie die Projektnummer ab, die für die Dienstkonto-Identität verwendet werden soll.

PROJECT_NUMBER=$(gcloud projects list --filter="project_id:$PROJECT_ID" --format='value(project_number)')

Trigger erstellen

gcloud eventarc triggers create python-pubsub-function-trigger  \
    --location=$REGION \
    --destination-run-service=python-pubsub-function  \
    --destination-run-region=$REGION \
    --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
    --transport-topic=projects/$PROJECT_ID/topics/$TOPIC \
    --service-account=$PROJECT_NUMBER-compute@developer.gserviceaccount.com

Testen

Testen Sie die Funktion, indem Sie eine Nachricht an das Thema senden:

gcloud pubsub topics publish $TOPIC --message="Hello World"

Das empfangene CloudEvent sollte in den Logs angezeigt werden:

gcloud run services logs read python-pubsub-function --region $REGION --limit=10

5. Cloud Storage-Funktion

Als Nächstes erstellen wir eine Node.js-Funktion, die auf Ereignisse aus einem Cloud Storage-Bucket reagiert.

Einrichten

Wenn Sie Cloud Storage-Funktionen verwenden möchten, weisen Sie dem Cloud Storage-Dienstkonto die IAM-Rolle pubsub.publisher zu:

SERVICE_ACCOUNT=$(gsutil kms serviceaccount -p $PROJECT_NUMBER)

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT \
  --role roles/pubsub.publisher

Erstellen

Erstellen Sie einen Ordner für die App und rufen Sie ihn auf:

mkdir ../hello-storage
cd ../hello-storage

Erstellen Sie eine index.js-Datei, die einfach auf Cloud Storage-Ereignisse reagiert:

const functions = require('@google-cloud/functions-framework');

functions.cloudEvent('helloStorage', (cloudevent) => {
  console.log('Cloud Storage event with Node.js in Cloud Run functions!');
  console.log(cloudevent);
});

Erstellen Sie eine package.json-Datei, um die Abhängigkeiten anzugeben:

{
  "name": "nodejs-crf-cloud-storage",
  "version": "0.0.1",
  "main": "index.js",
  "dependencies": {
    "@google-cloud/functions-framework": "^2.0.0"
  }
}

Bereitstellen

Erstellen Sie zuerst einen Cloud Storage-Bucket oder verwenden Sie einen vorhandenen:

export BUCKET_NAME="gcf-storage-$PROJECT_ID"
​​export BUCKET="gs://gcf-storage-$PROJECT_ID"
gsutil mb -l $REGION $BUCKET

Die Funktion bereitstellen:

gcloud run deploy nodejs-crf-cloud-storage \
 --source . \
 --base-image nodejs22 \
 --function helloStorage \
 --region $REGION \
 --no-allow-unauthenticated

Nach der Bereitstellung wird die Funktion in der Cloud Console im Bereich „Cloud Run“ angezeigt.

Erstellen Sie nun den Eventarc-Trigger.

BUCKET_REGION=$REGION

gcloud eventarc triggers create nodejs-crf-cloud-storage-trigger \
  --location=$BUCKET_REGION \
  --destination-run-service=nodejs-crf-cloud-storage \
  --destination-run-region=$REGION \
  --event-filters="type=google.cloud.storage.object.v1.finalized" \
  --event-filters="bucket=$BUCKET_NAME" \
  --service-account=$PROJECT_NUMBER-compute@developer.gserviceaccount.com

Testen

Testen Sie die Funktion. Laden Sie dazu eine Datei in den Bucket hoch:

echo "Hello World" > random.txt
gsutil cp random.txt $BUCKET/random.txt

Das empfangene CloudEvent sollte in den Logs angezeigt werden:

gcloud run services logs read nodejs-crf-cloud-storage --region $REGION --limit=10

6. Traffic-Aufteilung

Cloud Run-Funktionen unterstützen mehrere Überarbeitungen Ihrer Funktionen, sodass Sie den Traffic auf verschiedene Überarbeitungen aufteilen und Ihre Funktion auf eine frühere Version zurücksetzen können.

In diesem Schritt stellen Sie zwei Versionen einer Funktion bereit und teilen den Traffic dann im Verhältnis 50:50 auf.

Erstellen

Erstellen Sie einen Ordner für die App und rufen Sie ihn auf:

mkdir ../traffic-splitting
cd ../traffic-splitting

Erstellen Sie eine main.py-Datei mit einer Python-Funktion, die eine Farbumgebungsvariable liest und mit Hello World in dieser Hintergrundfarbe antwortet:

import os

color = os.environ.get('COLOR')

def hello_world(request):
    return f'<body style="background-color:{color}"><h1>Hello World!</h1></body>'

Erstellen Sie eine requirements.txt-Datei mit folgendem Inhalt, um die Abhängigkeiten anzugeben:

functions-framework==3.*

Bereitstellen

Stellen Sie die erste Version der Funktion mit einem orangefarbenen Hintergrund bereit:

COLOR=orange
gcloud run deploy hello-world-colors \
 --source . \
 --base-image python313 \
 --function hello_world \
 --region $REGION \
 --allow-unauthenticated \
 --update-env-vars COLOR=$COLOR

Wenn Sie die Funktion jetzt testen, indem Sie den HTTP-Trigger (die URI-Ausgabe des obigen Bereitstellungsbefehls) in Ihrem Browser aufrufen, sollte Hello World mit einem orangefarbenen Hintergrund angezeigt werden:

36ca0c5f39cc89cf.png

Stellen Sie die zweite Version mit einem gelben Hintergrund bereit:

COLOR=yellow
gcloud run deploy hello-world-colors \
 --source . \
 --base-image python313 \
 --function hello_world \
 --region $REGION \
 --allow-unauthenticated \
 --update-env-vars COLOR=$COLOR

Da dies die neueste Version ist, sollte beim Testen der Funktion Hello World mit einem gelben Hintergrund angezeigt werden:

391286a08ad3cdde.png

Traffic 50:50 aufteilen

Wenn Sie den Traffic auf die orange und die gelbe Version aufteilen möchten, müssen Sie die Überarbeitungs-IDs der Cloud Run-Dienste ermitteln. So rufen Sie die Revisions-IDs auf:

gcloud run revisions list --service hello-world-colors \
  --region $REGION --format 'value(REVISION)'

Die Ausgabe sollte in etwa so aussehen:

hello-world-colors-00001-man
hello-world-colors-00002-wok

Teilen Sie den Traffic jetzt so auf diese beiden Versionen auf: Aktualisieren Sie X-XXX entsprechend den Namen Ihrer Versionen:

gcloud run services update-traffic hello-world-colors \
  --region $REGION \
  --to-revisions hello-world-colors-0000X-XXX=50,hello-world-colors-0000X-XXX=50

Testen

Testen Sie die Funktion, indem Sie ihre öffentliche URL aufrufen. Die orangefarbene Version sollte etwa die Hälfte der Zeit und die gelbfarbene Version die andere Hälfte der Zeit angezeigt werden:

36ca0c5f39cc89cf.png 391286a08ad3cdde.png

Weitere Informationen finden Sie unter Rollbacks, graduelle Einführungen und Trafficmigration.

7. Mindestanzahl von Instanzen

Bei Cloud Run-Funktionen können Sie eine Mindestanzahl von Funktionsinstanzen angeben, die einsatzbereit gehalten werden und zum Verarbeiten von Anfragen bereit sein sollen. Dies ist nützlich, um die Anzahl der Kaltstarts zu begrenzen.

In diesem Schritt stellen Sie eine Funktion mit langsamer Initialisierung bereit. Sie stellen das Kaltstartproblem fest. Anschließend stellen Sie die Funktion mit einer Mindestanzahl von Instanzen von 1 bereit, um den Kaltstart zu vermeiden.

Erstellen

Erstellen Sie einen Ordner für die App und rufen Sie ihn auf:

mkdir ../min-instances
cd ../min-instances

Erstellen Sie eine main.go-Datei. Dieser Go-Dienst hat eine init-Funktion, die 10 Sekunden lang in den Ruhemodus wechselt, um eine lange Initialisierung zu simulieren. Außerdem gibt es eine HelloWorld-Funktion, die auf HTTP-Aufrufe reagiert:

package p

import (
        "fmt"
        "net/http"
        "time"
)

func init() {
        time.Sleep(10 * time.Second)
}

func HelloWorld(w http.ResponseWriter, r *http.Request) {
        fmt.Fprint(w, "Slow HTTP Go in Cloud Run functions!")
}

Bereitstellen

Binden Sie die erste Version der Funktion mit dem Standardwert „0“ für die Mindestanzahl von Instanzen ein:

gcloud run deploy go-slow-function \
 --source . \
 --base-image go123 \
 --function HelloWorld \
 --region $REGION \
 --no-allow-unauthenticated

Testen Sie die Funktion mit diesem Befehl:

# get the Service URL
SERVICE_URL="$(gcloud run services describe go-slow-function --region $REGION --format 'value(status.url)')"

# invoke the service
curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL

Beim ersten Aufruf ist eine Verzögerung von 10 Sekunden (Kaltstart) zu beobachten. Danach wird die Meldung angezeigt. Nachfolgende Aufrufe sollten sofort zurückgegeben werden.

Mindestanzahl von Instanzen festlegen

Um den Kaltstart bei der ersten Anfrage zu vermeiden, stellen Sie die Funktion wie unten beschrieben noch einmal bereit, wobei das Flag --min-instances auf „1“ gesetzt ist:

gcloud run deploy go-slow-function \
 --source . \
 --base-image go123 \
 --function HelloWorld \
 --region $REGION \
 --no-allow-unauthenticated \
 --min-instances 1

Testen

Funktion noch einmal testen:

curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL

Die 10-Sekunden-Verzögerung sollte bei der ersten Anfrage nicht mehr auftreten. Das Problem mit dem Kaltstart bei der ersten Aufrufung (nach langer Zeit ohne) ist dank der Mindestanzahl von Instanzen nicht mehr aufgetreten.

Weitere Informationen finden Sie unter Mindestinstanzen verwenden.

8. Glückwunsch!

Herzlichen Glückwunsch zum Abschluss des Codelabs.

Behandelte Themen

  • Cloud Run-Funktionen und automatische Basis-Image-Updates
  • So schreiben Sie eine Funktion, die auf HTTP-Aufrufe reagiert.
  • Eine Funktion schreiben, die auf Pub/Sub-Nachrichten reagiert
  • Eine Funktion schreiben, die auf Cloud Storage-Ereignisse reagiert
  • So teilen Sie den Traffic auf zwei Überarbeitungen auf.
  • Kaltstarts mit einer Mindestanzahl von Instanzen vermeiden