Mit Cloud Run-Funktionen (2. Generation) erweitern
Mit Cloud Run-Funktionen können Sie Code bereitstellen, um Ereignisse zu verarbeiten, die durch Änderungen in Ihrer Firestore-Datenbank ausgelöst werden. Hier können Sie ohne eigene Server betreiben zu müssen.
Firestore mit Cloud Run-Funktionen erweitern (2. Generation)
Cloud Run-Funktionen (2. Generation) unterstützen die folgenden Firestore-Ereignistrigger, mit denen Sie Handler erstellen können, die mit Firestore-Ereignissen verknüpft sind:
Ereignistyp | Trigger |
---|---|
google.cloud.firestore.document.v1.created |
Wird ausgelöst, wenn ein Dokument zum ersten Mal beschrieben wird. |
google.cloud.firestore.document.v1.updated |
Wird ausgelöst, wenn ein Dokument bereits existiert und sich ein Wert geändert hat. |
google.cloud.firestore.document.v1.deleted |
Wird ausgelöst, wenn ein Dokument gelöscht wird |
google.cloud.firestore.document.v1.written |
Wird ausgelöst, wenn created , updated oder deleted ausgelöst wird. |
google.cloud.firestore.document.v1.created.withAuthContext |
Entspricht created , fügt aber Authentifizierungsinformationen hinzu. |
google.cloud.firestore.document.v1.updated.withAuthContext |
Wie „updated “, aber es werden Authentifizierungsinformationen hinzugefügt. |
google.cloud.firestore.document.v1.deleted.withAuthContext |
Wie „deleted “, aber es werden Authentifizierungsinformationen hinzugefügt. |
google.cloud.firestore.document.v1.written.withAuthContext |
Entspricht written , fügt aber Authentifizierungsinformationen hinzu. |
Firestore-Ereignisse werden nur bei Dokumentänderungen ausgelöst. Die Aktualisierung eines Firestore-Dokuments, bei der die Daten unverändert bleiben (also ohne Schreibvorgang), generiert kein Aktualisierungs- oder Schreibereignis. Es ist nicht möglich, bestimmten Feldern Ereignisse hinzuzufügen.
Authentifizierungskontext in das Ereignis aufnehmen
Wenn Sie zusätzliche Authentifizierungsinformationen zum Ereignis einbeziehen möchten, verwenden Sie einen Ereignistrigger mit der Erweiterung withAuthContext
. Diese Erweiterung fügt zusätzliche Informationen zum Hauptkonto hinzu, das das Ereignis ausgelöst hat. Es fügt die
authtype
- und authid
-Attribute zusätzlich zu den zurückgegebenen Informationen
das Basisereignis. Weitere Informationen finden Sie in der
authcontext
.
Firestore-ausgelöste Funktion schreiben
Wenn Sie eine Funktion schreiben möchten, die auf Firestore-Ereignisse reagiert, müssen Sie bei der Bereitstellung Folgendes angeben:
- Triggerereignistyp
- einen Triggerereignisfilter, um die mit der Funktion verknüpften Dokumente auszuwählen
- den auszuführenden Funktionscode
Triggerereignisfilter
Wenn Sie einen Ereignisfilter festlegen, können Sie entweder ein genaues Dokument
oder ein Pfadmuster sein. Verwenden Sie ein Pfadmuster, um mehrere Dokumente mit Platzhaltern wie *
oder **
abzugleichen.
Sie können beispielsweise auf Änderungen am folgenden Dokument reagieren:
users/marie
Verwenden Sie Platzhalter wie *
oder **
, um auf Änderungen in Dokumenten zu reagieren
die einem Muster entsprechen. Ein Platzhalter *
entspricht einem einzelnen Segment und ein Platzhalter mit mehreren Segmenten **
entspricht null oder mehr Segmenten im Muster.
Für einzelne Segmentübereinstimmungen (*
) können Sie auch eine benannte Erfassungsgruppe verwenden. Beispiel: users/{userId}
Beispiel:
Muster | Beschreibung |
---|---|
/users/* oder /users/{userId} |
Entspricht allen Dokumenten in der Sammlung /users . Stimmt nicht mit Dokumenten in untergeordneten Sammlungen wie /users/marie/messages/33e2IxYBD9enzS50SJ68 überein |
/users/** |
Führt zu Übereinstimmung mit allen Dokumenten in der Sammlung /users und Dokumenten in Untersammlungen wie /users/marie/messages/33e2IxYBD9enzS50SJ68 |
Weitere Informationen zu Pfadmustern finden Sie unter Eventarc-Pfadmuster.
Der Trigger muss immer auf ein Dokument verweisen, auch wenn Sie einen Platzhalter verwenden.
Beispiel: users/{userId=*}/{messageCollectionId=*}
ist ungültig, da {messageCollectionId=*}
eine Sammlung ist. users/{userId=*}/{messageCollectionId}/{messageId=*}
ist jedoch gültig, da {messageId=*}
immer auf ein Dokument verweist.
Beispielfunktionen
Im folgenden Beispiel wird gezeigt, wie Firestore-Ereignisse empfangen werden.
Wenn Sie mit den Dokumentdaten eines Ereignisses arbeiten möchten, sehen Sie sich die value
und
old_value
-Feldern.
value
: EinDocument
-Objekt, das einen Snapshot des Dokuments nach der Operation enthält. Dieses Feld wird bei Löschereignissen nicht ausgefüllt.old_value
: EinDocument
-Objekt, das einen Snapshot des Dokuments vor dem Vorgang enthält. Dieses Feld wird nur bei Aktualisierungs- und Löschereignissen ausgefüllt.
Go
Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei Firestore zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.
Java
Richten Sie Standardanmeldedaten für Anwendungen ein, um sich bei Firestore zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.
Node.js
Richten Sie Standardanmeldedaten für Anwendungen ein, um sich bei Firestore zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.
Verwenden Sie protobufjs, um die Ereignisdaten zu decodieren. Fügen Siegoogle.events.cloud.firestore.v1
data.proto
in Ihre Quelle ein.
Python
Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei Firestore zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.
C#
Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei Firestore zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.
In den folgenden Beispielen werden Strings, die dem Feld original
eines betroffenen Dokuments hinzugefügt wurden, in Großbuchstaben umgewandelt und der neue Wert in dasselbe Dokument geschrieben:
Go
Richten Sie Standardanmeldedaten für Anwendungen ein, um sich bei Firestore zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.
Java
Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei Firestore zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.
Node.js
Richten Sie Standardanmeldedaten für Anwendungen ein, um sich bei Firestore zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.
Verwenden Sie protobufjs, um die Ereignisdaten zu decodieren. Fügen Siegoogle.events.cloud.firestore.v1
data.proto
in Ihre Quelle ein.
Python
Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei Firestore zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.
C#
Richten Sie Standardanmeldedaten für Anwendungen ein, um sich bei Firestore zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.
Proto-Abhängigkeiten in die Quelle aufnehmen
Sie müssen den Firestore-data.proto
angeben
im Quellverzeichnis für Ihre Funktion. Diese Datei importiert Folgendes
Protos, die Sie auch in Ihr Quellverzeichnis aufnehmen müssen:
Verwenden Sie für die Abhängigkeiten dieselbe Verzeichnisstruktur. Beispiel:
struct.proto
in google/protobuf
.
Diese Dateien sind erforderlich, um Ereignisdaten zu decodieren. Wenn Ihre Funktionsquelle diese Dateien nicht enthält, wird beim Ausführen ein Fehler zurückgegeben.
Ereignisattribute
Jedes Ereignis enthält Datenattribute mit Informationen zum Ereignis, z. B. zum Zeitpunkt des Auslösens. Firestore fügt zusätzliche Daten zur Datenbank und zum Dokument hinzu, die am Ereignis beteiligt sind. So greifen Sie auf diese Attribute zu:
Java
logger.info("Function triggered by event on: " + event.getSource()); logger.info("Event type: " + event.getType()); logger.info("Event time " + event.getTime()); logger.info("Event project: " + event.getExtension("project")); logger.info("Event location: " + event.getExtension("location")); logger.info("Database name: " + event.getExtension("database")); logger.info("Database document: " + event.getExtension("document")); // For withAuthContext events logger.info("Auth information: " + event.getExtension("authid")); logger.info("Auth information: " + event.getExtension("authtype"));
Node.js
console.log(`Function triggered by event on: ${cloudEvent.source}`); console.log(`Event type: ${cloudEvent.type}`); console.log(`Event time: ${cloudEvent.time}`); console.log(`Event project: ${cloudEvent.project}`); console.log(`Event location: ${cloudEvent.location}`); console.log(`Database name: ${cloudEvent.database}`); console.log(`Document name: ${cloudEvent.document}`); // For withAuthContext events console.log(`Auth information: ${cloudEvent.authid}`); console.log(`Auth information: ${cloudEvent.authtype}`);
Python
print(f"Function triggered by change to: {cloud_event['source']}") print(f"Event type: {cloud_event['type']}") print(f"Event time: {cloud_event['time']}") print(f"Event project: {cloud_event['project']}") print(f"Location: {cloud_event['location']}") print(f"Database name: {cloud_event['database']}") print(f"Document: {cloud_event['document']}") // For withAuthContext events print(f"Auth information: {cloud_event['authid']}") print(f"Auth information: {cloud_event['authtype']}")
Funktion bereitstellen
Nutzer, die Cloud Run-Funktionen bereitstellen, müssen die IAM-Rolle Cloud Run-Entwickler oder eine Rolle mit denselben Berechtigungen haben. Siehe auch Zusätzliche Konfiguration für die Bereitstellung.
Sie können eine Funktion entweder mit der gcloud CLI oder der Google Cloud Console bereitstellen. Das folgende Beispiel zeigt die Bereitstellung mit über die gcloud CLI. Weitere Informationen zur Bereitstellung mit der Google Cloud Console Siehe Cloud Run-Funktionen bereitstellen
gcloud
-
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
Verwenden Sie den Befehl
gcloud functions deploy
, um eine Funktion bereitzustellen:gcloud functions deploy YOUR_FUNCTION_NAME \ --gen2 \ --region=FUNCTION_LOCATION \ --trigger-location=TRIGGER_LOCATION \ --runtime=YOUR_RUNTIME \ --source=YOUR_SOURCE_LOCATION \ --entry-point=YOUR_CODE_ENTRYPOINT \ --trigger-event-filters="type=EVENT_FILTER_TYPE" \ --trigger-event-filters="database=DATABASE" \ --trigger-event-filters-path-pattern="document=DOCUMENT" \
Das erste Argument,
YOUR_FUNCTION_NAME
, ist ein Name für Ihre bereitgestellte Funktion. Der Name muss mit einem Buchstaben beginnen, gefolgt von bis zu 62 Buchstaben, Ziffern, Bindestrichen oder Unterstrichen. Das letzte Zeichen muss ein Buchstabe oder eine Ziffer sein.Das Flag
--gen2
gibt an, dass Sie die Bereitstellung in Cloud Run-Funktionen (2. Generation) vornehmen möchten. Auslassen Dieses Flag führt zur Bereitstellung für Cloud Run-Funktionen (1st gen).Das Flag
--region
gibt die Region an, in der die Funktion bereitgestellt werden soll.Legen Sie für eine maximale Nähe eine Region in der Nähe Ihrer Firestore-Datenbank fest. Wenn sich Ihre Firestore-Datenbank an einem multiregionalen Standort befindet Speicherort, für Datenbanken in
nam5
aufus-central1
und aufeurope-west4
für Datenbanken ineur3
. Für regionale Firestore-Standorte, die auf dieselbe Region festgelegt sind.Das Flag
--trigger-location
gibt den Speicherort des Trigger an. Sie müssen dieses Flag auf den Speicherort Ihrer Firestore-Datenbank festlegen.Das Flag
--runtime
gibt an, welche Sprachlaufzeit die Funktion verwendet. Cloud Run-Funktionen unterstützen mehrere Laufzeiten. Weitere Informationen finden Sie unter Laufzeiten.Das Flag
--source
gibt den Speicherort des Quellcodes der Funktion an. Weitere Informationen finden Sie hier:Das Flag
--entry-point
gibt den Einstiegspunkt für die Funktion in Ihrem Quellcode an. Dies ist der Code, der beim Ausführen der Funktion ausgeführt wird. Der Wert dieses Flags muss ein Funktionsname oder ein voll qualifizierter Klassenname sein, der in Ihrem Quellcode vorhanden ist. Weitere Informationen finden Sie unter Funktionseinstiegspunkt.EVENT_FILTER_TYPE
: Firestore unterstützt die folgenden Ereignistypen.google.cloud.firestore.document.v1.created
: Ereignis wird gesendet, wenn ein in das Dokument zum ersten Mal geschrieben wird.google.cloud.firestore.document.v1.updated
: Ereignis wird gesendet, wenn ein Dokument ist bereits vorhanden und hat sich ein Wert geändert.google.cloud.firestore.document.v1.deleted
: Dieses Ereignis wird gesendet, wenn ein Dokument gelöscht wird.google.cloud.firestore.document.v1.written
: Dieses Ereignis wird gesendet, wenn ein Dokument erstellt, aktualisiert oder gelöscht wird.google.cloud.firestore.document.v1.created.withAuthContext
: Ereignis wird gesendet, wenn ein in das Dokument zum ersten Mal geschrieben wird und das Ereignis zusätzliche Authentifizierungsinformationen enthält.google.cloud.firestore.document.v1.updated.withAuthContext
: Dieses Ereignis wird gesendet, wenn ein Dokument bereits vorhanden ist und sich ein Wert geändert hat. Enthält zusätzliche Authentifizierungsinformationengoogle.cloud.firestore.document.v1.deleted.withAuthContext
: Ereignis wird gesendet, wenn ein Dokument gelöscht. Enthält zusätzliche Authentifizierungsinformationengoogle.cloud.firestore.document.v1.written.withAuthContext
: Dieses Ereignis wird gesendet, wenn ein Dokument erstellt, aktualisiert oder gelöscht wird. Enthält zusätzliche Authentifizierungsinformationen
DATABASE
: Firestore-Datenbank. Verwenden Sie(default)
als Standarddatenbanknamen.DOCUMENT
: der Datenbankpfad, der Ereignisse auslöst, wenn Daten erstellt, aktualisiert oder gelöscht werden. Als Operator kommen die folgenden Zeichen infrage:- Gleich. Beispiel:
--trigger-event-filters=document='users/marie'
- Pfadmuster. Beispiel:
--trigger-event-filters-path-pattern=document='users/*'
. Weitere Informationen finden Sie unter Informationen zu Pfadmustern.
- Gleich. Beispiel:
Sie können optional weitere Konfigurations-, Netzwerk- und Sicherheitsoptionen angeben, wenn Sie eine Funktion bereitstellen.
Eine vollständige Referenz zum Bereitstellungsbefehl und seinen Flags finden Sie in der Dokumentation zu
gcloud functions deploy
.
Beispielbereitstellungen
Die folgenden Beispiele zeigen Bereitstellungen mit der Google Cloud CLI.
Funktion für eine Datenbank in der Region us-west2
bereitstellen:
gcloud functions deploy gcfv2-trigger-firestore-node \
--gen2 \
--region=us-west2 \
--trigger-location=us-west2 \
--runtime=nodejs18 \
--source=gs://CLOUD_STORAGE_BUCKET/firestoreEventFunction.zip \
--entry-point=makeUpperCase \
--trigger-event-filters=type=google.cloud.firestore.document.v1.written \
--trigger-event-filters=database='(default)' \
--trigger-event-filters-path-pattern=document='messages/{pushId}'
Stellen Sie eine Funktion für eine Datenbank am multiregionalen Standort nam5
bereit:
gcloud functions deploy gcfv2-trigger-firestore-python \
--gen2 \
--region=us-central1 \
--trigger-location=nam5 \
--runtime=python311 \
--source=gs://CLOUD_STORAGE_BUCKET/firestoreEventFunction.zip \
--entry-point=make_upper_case \
--trigger-event-filters=type=google.cloud.firestore.document.v1.written.withAuthContext \
--trigger-event-filters=database='(default)' \
--trigger-event-filters-path-pattern=document='messages/{pushId}'
Beschränkungen
Beachten Sie die folgenden Einschränkungen für Firestore-Trigger für Cloud Run Functions:
- Cloud Run Functions (1. Generation) erfordert eine vorhandene „(default)“-Datenbank im nativen Firestore-Modus. Es unterstützt keine benannten Firestore-Datenbanken und keinen Datastore-Modus. Verwenden Sie in solchen Fällen Cloud Run Functions (2. Generation), um Ereignisse zu konfigurieren.
- Die Reihenfolge ist nicht garantiert. Schnelle Änderungen können Funktionsaufrufe in einer unvorhergesehenen Reihenfolge auslösen.
- Ereignisse werden mindestens einmal übergeben. Ein einzelnes Ereignis kann aber zu mehreren Funktionsaufrufen führen. Vermeiden Sie die Abhängigkeit von genau einmal vorkommenden Verfahren und schreiben Sie idempotente Funktionen.
- Firestore im Datastore-Modus erfordert Cloud Run Functions (2. Generation). Cloud Run Functions (1. Generation) unterstützt den Datastore-Modus nicht.
- Ein Trigger ist mit einer einzelnen Datenbank verknüpft. Sie können keinen Trigger erstellen, der mit mehreren Datenbanken übereinstimmt.
- Durch das Löschen einer Datenbank werden nicht automatisch die Trigger für diese Datenbank gelöscht. Der Trigger sendet keine Ereignisse mehr, bleibt aber bestehen, bis Sie ihn löschen.
- Wenn ein übereinstimmendes Ereignis die maximale Anfragegröße überschreitet, wird es möglicherweise nicht an Cloud Run Functions der 1. Generation gesendet.
- Ereignisse, die aufgrund der Anfragegröße nicht gesendet wurden, werden in Plattform-Logs protokolliert und auf die Lognutzung für das Projekt angerechnet.
- Sie finden diese Logs im Log-Explorer mit der Meldung "Ereignis kann nicht an die Cloud Functions-Funktion gesendet werden, da die Größe das Limit für die 1. Generation überschreitet..." mit dem Schweregrad
error
. Den Funktionsnamen finden Sie im FeldfunctionName
. Wenn das FeldreceiveTimestamp
noch eine Stunde gültig ist, können Sie den tatsächlichen Ereignisinhalt ableiten, indem Sie das betreffende Dokument mit einem Snapshot vor und nach dem Zeitstempel lesen. - So können Sie das vermeiden:
- Migrieren und Upgrade auf Cloud Run Functions (2. Generation)
- Dokument verkleinern
- Die betreffenden Cloud Run Functions-Funktionen löschen
- Sie können das Logging selbst mithilfe von Ausschlüssen deaktivieren. Beachten Sie jedoch, dass die betreffenden Ereignisse dennoch nicht übermittelt werden.
Eventarc- und Firestore-Standorte
Eventarc unterstützt keine Mehrfachregionen für Firestore-Ereignisse Trigger, aber Sie können trotzdem Trigger für Firestore-Datenbanken erstellen an multiregionalen Standorten. In Eventarc werden Firestore-Standorte mit mehreren Regionen den folgenden Eventarc-Regionen zugeordnet:
Firestore (multiregional) | Eventarc-Region |
---|---|
nam5 |
us-central1 |
eur3 |
europe-west4 |
Unterschiede zwischen Cloud Run-Funktionen der 2. Generation und der 1. Generation
Cloud Run-Funktionen (2. Generation) verwenden Eventarc-Ereignisse für alle Laufzeiten. Bisher haben Cloud Run-Funktionen (1. Generation) Eventarc-Ereignisse für nur einige Laufzeiten. Eventarc-Ereignisse unterscheiden sich von Cloud Run-Funktionen (1. Generation) in folgenden Punkten:
Die Firestore-Trigger für Eventarc unterstützen neben Cloud Run-Funktionen auch zusätzliche Ziele. Sie können
CloudEvents
an eine Reihe von Zielen weiterleiten, darunter Cloud Run, GKE und Workflows.Firestore-Trigger für Eventarc rufen die Triggerdefinition zu Beginn eines Datenbankschreibvorgangs um zu entscheiden, ob Firestore ein Ereignis ausgeben soll. Der Schreibvorgang berücksichtigt keine Änderungen an der Triggerdefinition, die während der Ausführung auftreten können.
Bei Cloud Run Functions (1. Generation) wird die Triggerdefinition während der Auswertung des Datenbankschreibens abgerufen. Änderungen am Trigger während der Auswertung können sich darauf auswirken, ob Firestore ein Ereignis ausgibt oder nicht.
Weitere Informationen finden Sie im Vergleich der Cloud Run-Funktionen.