Informationen zu diesem Codelab
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
oderphp83
. 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:
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:
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:
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