Activadores de Firestore
Puedes configurar tus funciones de Cloud Run para que se activen con eventos en una base de datos de Firestore. Una vez activada, tu función puede leer y actualizar una base de datos de Firestore en respuesta a estos eventos a través de las APIs de Firestore y las bibliotecas cliente.
En un ciclo de vida típico, una función de Firestore hace lo siguiente:
Espera a que ocurran cambios en un documento en particular.
Se activa cuando ocurre un evento y realiza sus tareas.
Recibe un objeto de datos con una instantánea del documento afectado. En el caso de los eventos
write
oupdate
, el objeto de datos contiene instantáneas que representan el estado del documento antes y después del evento de activación.
Tipos de eventos
Firestore admite los eventos create
, update
, delete
y write
. El evento write
comprende todas las modificaciones que se realizan a un documento.
Tipo de evento | Activador |
---|---|
google.cloud.firestore.document.v1.created (predeterminada) |
Se activa cuando se escribe en un documento por primera vez. |
google.cloud.firestore.document.v1.updated |
Se activa cuando un documento ya existe y se cambia uno de sus valores. |
google.cloud.firestore.document.v1.deleted |
Se activa cuando se borra un documento con datos. |
google.cloud.firestore.document.v1.written |
Se activa cuando se crea, actualiza o borra un documento. |
Los comodines se escriben en los activadores con llaves, como se muestra en el siguiente ejemplo: "projects/YOUR_PROJECT_ID/databases/(default)/documents/collection/{document_wildcard}"
Especifica la ruta del documento
Para activar tu función, especifica una ruta de acceso al documento que deseas escuchar. La ruta de acceso al documento debe estar en el mismo proyecto de Google Cloud que la función.
A continuación, se muestran algunos ejemplos de rutas de acceso de documentos válidas:
users/marie
: Activador válido. Supervisa un solo documento,/users/marie
.users/{username}
: activador válido. Supervisa todos los documentos del usuario. Los comodines se usan para supervisar todos los documentos de la colección.users/{username}/addresses
: activador no válido. Se refiere a la subcolecciónaddresses
, no a un documento.users/{username}/addresses/home
: activador válido. Supervisa el documento de dirección particular de todos los usuarios.users/{username}/addresses/{addressId}
: activador válido. Supervisa todos los documentos de dirección.users/{user=**}
: Activador válido. Supervisa todos los documentos del usuario y los documentos de las subcolecciones de cada documento del usuario, como/users/userID/address/home
o/users/userID/phone/work
.
Comodines y parámetros
Si no conoces el documento específico que quieres supervisar, usa un {wildcard}
en lugar del ID del documento:
users/{username}
escucha cambios en todos los documentos del usuario.
En este ejemplo, cuando se cambia cualquier campo en los documentos de users
, coincide con un comodín llamado {username}
.
Si un documento de users
tiene subcolecciones y se modifica un campo de uno de los documentos en ellas, no se activará el comodín {username}
. Si tu objetivo es responder también a los eventos en las subcolecciones, usa el comodín de varios segmentos {username=**}
.
Las coincidencias de comodines se extraen de las rutas de acceso de documentos. Puedes definir tantos comodines como desees para sustituir los IDs explícitos de colección o documento. Puedes usar hasta un comodín de varios segmentos, como {username=**}
.
Estructuras de eventos
Este activador invoca tu función con un evento similar al siguiente:
{ "oldValue": { // Update and Delete operations only A Document object containing a pre-operation document snapshot }, "updateMask": { // Update operations only A DocumentMask object that lists changed fields. }, "value": { // A Document object containing a post-operation document snapshot } }
Cada objeto Document
contiene uno o más objetos Value
. Consulta la documentación de Value
para obtener referencias de tipo. Esto resulta muy útil si usas un lenguaje escrito (como Go) para escribir tus funciones.
Ejemplos
En los siguientes ejemplos, se muestra cómo escribir funciones que respondan a un activador de Firestore.
Antes de comenzar
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud Functions, Cloud Build, Artifact Registry, Eventarc, Logging, Pub/Sub, and Cloud Run APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud Functions, Cloud Build, Artifact Registry, Eventarc, Logging, Pub/Sub, and Cloud Run APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
- Prepara tu entorno de desarrollo.
Si ya tienes instalado gcloud CLI, ejecuta el siguiente comando para actualizarla:
gcloud components update
Configura la base de datos de Firestore
Necesitas una base de datos de Firestore para probar las muestras en este documento. Debe estar en su lugar antes de implementar las funciones. Si aún no está lista la base de datos de Firestore, crea una de la siguiente manera:
Ir a la página de Datos de Firestore.
Haz clic en Elegir modo nativo.
Elige la región (ubicación) en la que residirá tu base de datos. Esta elección es permanente.
Haz clic en Crear base de datos.
El modelo de datos de Firestore consta de colecciones que contienen documentos. Cada documento contiene un conjunto de pares clave-valor.
Las funciones que creas en este instructivo se activan cuando realizas cambios en un documento dentro de una colección especificada.
Ejemplo 1: Función Hola Firestore
En la siguiente función de Cloud Run de muestra, se imprimen los campos de un evento de activación de Firestore:
Node.js
Usa protobufjs para decodificar los datos del evento. Incluye el google.events.cloud.firestore.v1
data.proto
en la fuente.
Python
Go
Java
C#
Implementa la función Hola Firestore
Si aún no está lista, configura la base de datos de Firestore.
Para ejecutar la función de Hola Firestore con un activador de Firestore, ejecuta el siguiente comando en el directorio que contiene el código de muestra (o, en el caso de Java, el archivo
pom.xml
):gcloud functions deploy FUNCTION_NAME \ --gen2 \ --runtime=RUNTIME \ --region=REGION \ --trigger-location=TRIGGER REGION \ --source=. \ --entry-point=ENTRY_POINT \ --trigger-event-filters=type=google.cloud.firestore.document.v1.written \ --trigger-event-filters=database='(default)' \ --trigger-event-filters-path-pattern=document='users/{username}'
Reemplaza lo siguiente:
FUNCTION_NAME
: un nombre para la función implementada.RUNTIME
: el entorno de ejecución de lenguaje que usa tu función.REGION
: la región en la que se implementará la función.TRIGGER_REGION
: La ubicación del activador, que debe ser la misma que la región de la base de datos de Firestore.ENTRY_POINT
: el punto de entrada a tu función en tu código fuente. Este es el código que se ejecuta cuando se ejecuta tu función.
Usa los otros campos tal como están:
--trigger-event-filters=type=google.cloud.firestore.document.v1.written
especifica que la función se activa cuando se crea, actualiza o borra un documento, según el tipo de eventogoogle.cloud.firestore.document.v1.written
.--trigger-event-filters=database='(default)'
especifica la base de datos de Firebase. Para ver el nombre de la base de datos predeterminada, usa(default)
.--trigger-event-filters-path-pattern=document='users/{username}'
proporciona el patrón de ruta de acceso de los documentos que deben supervisarse para detectar cambios relevantes. En este patrón de ruta de acceso, se indica que se deben supervisar todos los documentos de la colecciónusers
. Para obtener más información, consulta Información sobre los patrones de ruta de acceso.
Prueba la función Hola Firestore
Para probar la función Hola Firestore, configura una colección llamada users
en tu base de datos de Firestore:
En la página de datos de Firestore, haz clic en Iniciar una colección.
Especifica
users
como el ID de colección.Para empezar a agregar el primer documento de la colección, en Agregar su primer documento, acepta el ID de documento generado de forma automática.
Agrega al menos un campo para el documento y especifica un nombre y un valor. En este ejemplo, el nombre es “username” y el valor es “rowan:”
Cuando termines, haz clic en Guardar.
Esta acción crea un documento nuevo, lo que activa tu función.
Para confirmar que tu función se activó, haz clic en el nombre vinculado de la función en la consola de Google Cloud.Página de resumen de Cloud Run Functions para abrir la página Detalles de la función.
Abre la pestaña Registros y busca esta cadena:
Function triggered by change to: //firestore.googleapis.com/projects/your-project-id/databases/(default)'
Ejemplo 2: función Convertir en mayúsculas
Este ejemplo recupera el valor que agrega el usuario, se convierte la cadena en esa ubicación a mayúscula y se reemplaza el valor por la cadena en mayúscula:
Node.js
Usa protobufjs para decodificar los datos del evento. Incluye el google.events.cloud.firestore.v1
data.proto
en la fuente.
Python
Go
Java
C#
Implementa la función Convertir en mayúsculas
Si aún no está lista, configura la base de datos de Firestore.
Usa el siguiente comando para implementar una función que se activa a través de eventos de escritura en el documento
companies/{CompanyId}
:gcloud functions deploy FUNCTION_NAME \ --gen2 \ --runtime=RUNTIME \ --trigger-location=TRIGGER REGION \ --region=REGION \ --source=. \ --entry-point=ENTRY_POINT \ --set-env-vars GOOGLE_CLOUD_PROJECT=PROJECT_ID \ --trigger-event-filters=type=google.cloud.firestore.document.v1.written \ --trigger-event-filters=database='(default)' \ --trigger-event-filters-path-pattern=document='messages/{pushId}'
Reemplaza lo siguiente:
FUNCTION_NAME
: un nombre para la función implementada.RUNTIME
: el entorno de ejecución de lenguaje que usa tu función.REGION
: la región en la que se implementará la función.TRIGGER_REGION
: La ubicación del activador, que debe ser la misma que la región de la base de datos de Firestore.ENTRY_POINT
: el punto de entrada a tu función en tu código fuente. Este es el código que se ejecuta cuando se ejecuta tu función.PROJECT_ID
: Es el identificador único del proyecto.
Usa los otros campos tal como están:
--trigger-event-filters=type=google.cloud.firestore.document.v1.written
especifica que la función se activa cuando se crea, actualiza o borra un documento, según el tipo de eventogoogle.cloud.firestore.document.v1.written
.--trigger-event-filters=database='(default)'
especifica la base de datos de Firestore. Para ver el nombre de la base de datos predeterminada, usa(default)
.--trigger-event-filters-path-pattern=document='messages/{pushId}'
proporciona el patrón de ruta de acceso de los documentos que deben supervisarse para detectar cambios relevantes. En este patrón de ruta de acceso, se indica que se deben supervisar todos los documentos de la colecciónmessages
. Para obtener más información, consulta Información sobre los patrones de ruta de acceso.
Prueba la función Convertir en mayúsculas
Para probar la función Convertir en mayúsculas que acabas de implementar, configura una colección llamada messages
en la base de datos de Firestore:
Ir a la página de Datos de Firestore.
Haz clic en Iniciar una colección.
Especifica
messages
como el ID de colección.Para empezar a agregar el primer documento de la colección, en Agregar su primer documento, acepta el ID de documento generado de forma automática.
Para activar la función implementada, agrega un documento en el que el nombre del campo sea “original” y el valor del campo sea una palabra en minúscula, por ejemplo:
Cuando guardes el documento, verás la palabra en minúsculas en el campo de valor que convierte a mayúsculas.
Si luego editas el valor del campo para que contenga letras minúsculas, se activará la función de nuevo y se convertirán todas las letras minúsculas en mayúsculas.
Limitaciones
- No se garantiza el ordenamiento. Los cambios rápidos pueden activar invocaciones de funciones en un orden inesperado.
- Los eventos se entregan al menos una vez, pero un solo evento puede dar lugar a varias invocaciones de funciones. Evita depender de la mecánica de entrega de eventos exactamente una vez y escribe funciones idempotentes.
- Un activador se asocia con una sola base de datos. No puedes crear un activador que coincida con varias bases de datos.
- Cuando se borra una base de datos, no se borra automáticamente ningún activador de la base de datos. El activador deja de entregar eventos, pero sigue existiendo hasta que lo borras.