1. Descripción general
En este lab, integrarás bases de datos sin servidores(Spanner y Firestore) con aplicaciones(Go y Node.js) que se ejecutan en Cloud Run. La aplicación Cymbal Eats incluye varios servicios que se ejecutan en Cloud Run. En los siguientes pasos, configurarás los servicios para que usen la base de datos relacional Cloud Spanner y Cloud Firestore, una base de datos de documentos NoSQL. El uso de productos sin servidores para el nivel de datos y el tiempo de ejecución de la aplicación te permite abstraer toda la administración de la infraestructura y enfocarte en compilar tu aplicación en lugar de preocuparte por la sobrecarga.
2. Qué aprenderás
En este lab, aprenderás a realizar las siguientes tareas:
- Integra Spanner
- Habilita los servicios administrados de Spanner
- Integración en el código
- Implementa código que se conecte a Spanner
- Integra Firestore
- Habilita los servicios administrados de Firestore
- Integración en el código
- Implementa el código que se conecta a Firestore
3. Configuración y requisitos
Cómo configurar el entorno a tu propio ritmo
- Accede a Google Cloud Console y crea un proyecto nuevo o reutiliza uno existente. Si aún no tienes una cuenta de Gmail o de Google Workspace, debes crear una.



- El Nombre del proyecto es el nombre visible de los participantes de este proyecto. Es una cadena de caracteres que no se utiliza en las APIs de Google. Puedes actualizarla cuando quieras.
- El ID del proyecto es único en todos los proyectos de Google Cloud y es inmutable (no se puede cambiar después de configurarlo). La consola de Cloud genera automáticamente una cadena única. Por lo general, no importa cuál sea. En la mayoría de los codelabs, deberás hacer referencia al ID de tu proyecto (suele identificarse como
PROJECT_ID). Si no te gusta el ID que se generó, podrías generar otro aleatorio. También puedes probar uno propio y ver si está disponible. No se puede cambiar después de este paso y se usa el mismo durante todo el proyecto. - Recuerda que hay un tercer valor, un número de proyecto, que usan algunas APIs. Obtén más información sobre estos tres valores en la documentación.
- A continuación, deberás habilitar la facturación en la consola de Cloud para usar las APIs o los recursos de Cloud. Ejecutar este codelab no costará mucho, tal vez nada. Para cerrar recursos y evitar que se generen cobros más allá de este instructivo, puedes borrar los recursos que creaste o borrar el proyecto. Los usuarios nuevos de Google Cloud son aptos para participar en el programa Prueba gratuita de $300.
Configura el entorno
- Crea una variable de ID del proyecto
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
export SPANNER_INSTANCE=inventory-instance
export SPANNER_DB=inventory-db
export REGION=us-east1
export SPANNER_CONNECTION_STRING=projects/$PROJECT_ID/instances/$SPANNER_INSTANCE/databases/$SPANNER_DB
- Habilita las APIs de Spanner, Cloud Run, Cloud Build y Artifact Registry
gcloud services enable \
compute.googleapis.com \
spanner.googleapis.com \
run.googleapis.com \
cloudbuild.googleapis.com \
artifactregistry.googleapis.com \
firestore.googleapis.com \
appengine.googleapis.com \
artifactregistry.googleapis.com
- Clona el repositorio
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git
- Navega al directorio
cd cymbal-eats/inventory-service/spanner
4. Crea y configura una instancia de Spanner
Spanner es la base de datos relacional de backend de los servicios de inventario. En los siguientes pasos, crearás una instancia, una base de datos y un esquema de Spanner.
Crea una instancia
- Crea una instancia de Cloud Spanner
gcloud spanner instances create $SPANNER_INSTANCE --config=regional-${REGION} \
--description="Cymbal Menu Inventory" --nodes=1
Resultado de ejemplo
Creating instance...done.
- Verifica si la instancia de Spanner está configurada correctamente
gcloud spanner instances list
Ejemplo de resultado:
NAME: inventory-instance DISPLAY_NAME: Cymbal Menu Inventory CONFIG: regional-us-east1 NODE_COUNT: 1 PROCESSING_UNITS: 100 STATE: READY
Crea una base de datos y un esquema
Crea una base de datos nueva y usa el lenguaje de definición de datos (DDL) de SQL estándar de Google para crear el esquema de la base de datos.
- Crea un archivo DDL
echo "CREATE TABLE InventoryHistory (ItemRowID STRING (36) NOT NULL, ItemID INT64 NOT NULL, InventoryChange INT64, Timestamp TIMESTAMP) PRIMARY KEY(ItemRowID)" >> table.ddl
- Crea la base de datos de Spanner
gcloud spanner databases create $SPANNER_DB \
--instance=$SPANNER_INSTANCE \
--ddl-file=table.ddl
Ejemplo de resultado:
Creating database...done.
Verifica el estado y el esquema de la base de datos
- Cómo ver el estado de la base de datos
gcloud spanner databases describe $SPANNER_DB \
--instance=$SPANNER_INSTANCE
Ejemplo de resultado:
createTime: '2022-04-22T15:11:33.559300Z' databaseDialect: GOOGLE_STANDARD_SQL earliestVersionTime: '2022-04-22T15:11:33.559300Z' encryptionInfo: - encryptionType: GOOGLE_DEFAULT_ENCRYPTION name: projects/cymbal-eats-7-348013/instances/menu-inventory/databases/menu-inventory state: READY versionRetentionPeriod: 1h
- Visualiza el esquema de la base de datos
gcloud spanner databases ddl describe $SPANNER_DB \
--instance=$SPANNER_INSTANCE
Ejemplo de resultado:
CREATE TABLE InventoryHistory ( ItemRowID STRING(36) NOT NULL, ItemID INT64 NOT NULL, InventoryChange INT64, TimeStamp TIMESTAMP, ) PRIMARY KEY(ItemRowID);
5. Integración de Spanner
En esta sección, aprenderás a integrar Spanner en tu aplicación. Además, Spanner SQL proporciona bibliotecas cliente, controladores JDBC, controladores R2DBC, APIs de REST y APIs de RPC, que te permiten integrar Spanner en cualquier aplicación.
En la siguiente sección, usarás la biblioteca cliente de Go para instalar, autenticar y modificar datos en Spanner.
Instala la biblioteca cliente
La biblioteca cliente de Cloud Spanner facilita la integración con Cloud Spanner, ya que usa automáticamente las credenciales predeterminadas de la aplicación (ADC) para encontrar las credenciales de tu cuenta de servicio.
Configura la autenticación
Google Cloud CLI y las bibliotecas cliente de Google Cloud detectan automáticamente cuándo se ejecutan en Google Cloud y usan la cuenta de servicio del entorno de ejecución de la revisión actual de Cloud Run. Esta estrategia se denomina credenciales predeterminadas de la aplicación y permite la portabilidad de código en varios entornos.
Sin embargo, es mejor crear una identidad exclusiva asignándole una cuenta de servicio administrada por el usuario en lugar de la cuenta de servicio predeterminada.
- Otorga el rol de administrador de la base de datos de Spanner a la cuenta de servicio
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
--role="roles/spanner.databaseAdmin"
Ejemplo de resultado:
Updated IAM policy for project [cymbal-eats-6422-3462]. [...]
Usa las bibliotecas cliente
Las bibliotecas cliente de Spanner abstraen las complejidades de la integración con Spanner y están disponibles en muchos lenguajes de programación populares.
Crea un cliente de Spanner
El cliente de Spanner es un cliente para leer y escribir datos en una base de datos de Cloud Spanner. Un cliente se puede usar de forma simultánea, excepto por su método Close.
El siguiente fragmento crea un cliente de Spanner
main.go
var dataClient *spanner.Client ... dataClient, err = spanner.NewClient(ctx, databaseName)
Puedes considerar un cliente como una conexión de base de datos: todas tus interacciones con Cloud Spanner deben pasar por un cliente. Normalmente, creas un cliente cuando se inicia la aplicación y, luego, vuelves a usar ese cliente para leer, escribir y ejecutar transacciones. Cada cliente usa los recursos en Cloud Spanner.
Modificar datos
Existen varias formas de insertar, actualizar y borrar datos de una base de datos de Spanner. A continuación, se enumeran los métodos disponibles.
En este lab, usarás mutaciones para modificar datos en Spanner.
Mutaciones en Spanner
Una mutación es un contenedor de operaciones de mutación. Una mutación representa una secuencia de inserciones, actualizaciones y eliminaciones que Cloud Spanner aplica de forma atómica a diferentes filas y tablas en una base de datos de Cloud Spanner.
main.go
m := []*spanner.Mutation{}
m = append(m, spanner.Insert(
"inventoryHistory",
inventoryHistoryColumns,
[]interface{}{uuid.New().String(), element.ItemID, element.InventoryChange, time.Now()}))
El fragmento de código inserta una fila nueva en la tabla del historial del inventario.
Implementación y pruebas
Ahora que Spanner está configurado y revisaste los elementos clave del código, implementa la aplicación en Cloud Run.
Implementa la aplicación en Cloud Run
Cloud Run puede compilar, enviar e implementar tu código automáticamente con un solo comando. En el siguiente comando, llamarás al comando deploy en el servicio run y pasarás las variables que usa la aplicación en ejecución, como SPANNER_CONNECTION_STRING, que creaste antes.
- Haz clic en Abrir terminal.
- Implementa el servicio de inventario en Cloud Run
gcloud run deploy inventory-service \
--source . \
--region $REGION \
--update-env-vars SPANNER_CONNECTION_STRING=$SPANNER_CONNECTION_STRING \
--allow-unauthenticated \
--project=$PROJECT_ID \
--quiet
Ejemplo de resultado:
Service [inventory-service] revision [inventory-service-00001-sug] has been deployed and is serving 100 percent of traffic. Service URL: https://inventory-service-ilwytgcbca-uk.a.run.app
- Almacena la URL de servicio
INVENTORY_SERVICE_URL=$(gcloud run services describe inventory-service \
--platform managed \
--region $REGION \
--format=json | jq \
--raw-output ".status.url")
Prueba la aplicación de Cloud Run
Cómo insertar un elemento
- En Cloud Shell, ingresa el siguiente comando.
POST_URL=$INVENTORY_SERVICE_URL/updateInventoryItem
curl -i -X POST ${POST_URL} \
--header 'Content-Type: application/json' \
--data-raw '[
{
"itemID": 1,
"inventoryChange": 5
}
]'
Ejemplo de resultado:
HTTP/2 200 access-control-allow-origin: * content-type: application/json x-cloud-trace-context: 10c32f0863d26521497dc26e86419f13;o=1 date: Fri, 22 Apr 2022 21:41:38 GMT server: Google Frontend content-length: 2 OK
Consulta un elemento
- Consulta el servicio de inventario
GET_URL=$INVENTORY_SERVICE_URL/getAvailableInventory
curl -i ${GET_URL}
Ejemplo de respuesta
HTTP/2 200
access-control-allow-origin: *
content-type: text/plain; charset=utf-8
x-cloud-trace-context: b94f921e4c2ae90210472c88eb05ace8;o=1
date: Fri, 22 Apr 2022 21:45:50 GMT
server: Google Frontend
content-length: 166
[{"ItemID":1,"Inventory":5}]
6. Conceptos de Spanner
Cloud Spanner consulta sus bases de datos con instrucciones de SQL declarativas. Las instrucciones de SQL indican lo que quiere el usuario sin describir cómo se obtendrán los resultados.
- En la terminal, ingresa este comando para consultar el registro de la tabla que creaste anteriormente.
gcloud spanner databases execute-sql $SPANNER_DB \
--instance=$SPANNER_INSTANCE \
--sql='SELECT * FROM InventoryHistory WHERE ItemID=1'
Ejemplo de resultado:
ItemRowID: 1
ItemID: 1
InventoryChange: 3
Timestamp:
Planes de ejecución de consultas
Un plan de ejecución de consultas es una serie de pasos que Spanner usa para obtener resultados. Puede haber varias formas de adquirir los resultados de una instrucción de SQL en particular. Se puede acceder a los planes de ejecución de consultas en la consola y en las bibliotecas cliente. Para ver cómo Spanner controla las consultas de SQL, haz lo siguiente:
- En la consola, abre la página Instancias de Cloud Spanner.
- Ir a las instancias de Cloud Spanner
- Haz clic en el nombre de la instancia de Cloud Spanner. En la sección de bases de datos, selecciona la base de datos que deseas consultar.
- Haz clic en Consulta.
- Ingresa la siguiente consulta en el editor de consultas
SELECT * FROM InventoryHistory WHERE ItemID=1
- Haz clic en EJECUTAR.
- Haz clic en EXPLICACIÓN.
La consola de Cloud muestra un plan de ejecución visual para tu consulta.

Optimizador de consultas
El optimizador de consultas de Cloud Spanner compara planes de ejecución alternativos y selecciona el más eficiente. Con el tiempo, el optimizador de consultas evolucionará y ampliará las opciones en el plan de ejecución de consultas, además de mejorar la precisión de las estimaciones que informan esas opciones, lo que llevará a planes de ejecución de consultas más eficientes.
Cloud Spanner lanza actualizaciones del optimizador como nuevas versiones del optimizador de consultas. De forma predeterminada, cada base de datos comienza a usar la versión más reciente del optimizador no antes de 30 días después de que se lanza esa versión.
Para ver la versión que se usa cuando se ejecuta una consulta en gcloud spanner, configura la marca –query-mode en PROFILE.
- Ingresa el siguiente comando para ver la versión del optimizador:
gcloud spanner databases execute-sql $SPANNER_DB --instance=$SPANNER_INSTANCE \
--query-mode=PROFILE --sql='SELECT * FROM InventoryHistory'
Ejemplo de resultado:
TOTAL_ELAPSED_TIME: 6.18 msecs
CPU_TIME: 5.17 msecs
ROWS_RETURNED: 1
ROWS_SCANNED: 1
OPTIMIZER_VERSION: 3
RELATIONAL Distributed Union
(1 execution, 0.11 msecs total latency)
subquery_cluster_node: 1
|
+- RELATIONAL Distributed Union
| (1 execution, 0.09 msecs total latency)
| call_type: Local, subquery_cluster_node: 2
| |
| \- RELATIONAL Serialize Result
| (1 execution, 0.08 msecs total latency)
| |
| +- RELATIONAL Scan
| | (1 execution, 0.08 msecs total latency)
| | Full scan: true, scan_target: InventoryHistory, scan_type: TableScan
| | |
| | +- SCALAR Reference
| | | ItemRowID
| | |
| | +- SCALAR Reference
| | | ItemID
| | |
| | +- SCALAR Reference
| | | InventoryChange
| | |
| | \- SCALAR Reference
| | Timestamp
| |
| +- SCALAR Reference
| | $ItemRowID
| |
| +- SCALAR Reference
| | $ItemID
| |
| +- SCALAR Reference
| | $InventoryChange
| |
| \- SCALAR Reference
| $Timestamp
|
\- SCALAR Constant
true
ItemRowID: 1
ItemID: 1
InventoryChange: 3
Timestamp:
Actualiza la versión del optimizador
La versión más reciente en el momento de este lab es la versión 4. A continuación, actualizarás la tabla de Spanner para usar la versión 4 del optimizador de consultas.
- Actualiza el optimizador
gcloud spanner databases ddl update $SPANNER_DB \
--instance=$SPANNER_INSTANCE \
--ddl='ALTER DATABASE InventoryHistory
SET OPTIONS (optimizer_version = 4)'
Ejemplo de resultado:
Schema updating...done.
- Ingresa el siguiente comando para ver la actualización de la versión del optimizador:
gcloud spanner databases execute-sql $SPANNER_DB --instance=$SPANNER_INSTANCE \
--query-mode=PROFILE --sql='SELECT * FROM InventoryHistory'
Ejemplo de resultado:
TOTAL_ELAPSED_TIME: 8.57 msecs CPU_TIME: 8.54 msecs ROWS_RETURNED: 1 ROWS_SCANNED: 1 OPTIMIZER_VERSION: 4 [...]
Visualiza la versión del optimizador de consultas en el Explorador de métricas
Puedes usar el Explorador de métricas en Cloud Console para visualizar el recuento de consultas de tu instancia de base de datos. Puedes ver qué versión del optimizador se usa en cada base de datos.
- Navega a Monitoring en la consola de Cloud y selecciona Explorador de métricas en el menú de la izquierda.
- En el campo Tipo de recurso, selecciona Instancia de Cloud Spanner.
- En el campo Métrica, selecciona Recuento de búsquedas y Aplicar.
- En el campo Agrupar por, selecciona database, optimizer_version y status.

7. Crea y configura una base de datos de Firestore
Firestore es una base de datos de documentos NoSQL creada para proporcionar ajuste de escala automático, alto rendimiento y facilidad para el desarrollo de aplicaciones. Si bien la interfaz de Firestore comparte muchas de sus características con las bases de datos tradicionales, las NoSQL se diferencian por el modo en que describen las relaciones entre objetos de datos.
La siguiente tarea te guiará para crear una aplicación de Cloud Run de servicio de pedidos respaldada por Firestore. El servicio de pedidos llamará al servicio de inventario creado en la sección anterior para consultar la base de datos de Spanner antes de iniciar el pedido. Este servicio garantizará que haya suficiente inventario y que se pueda completar el pedido.

8. Conceptos de Firestore
Modelo de datos
Una base de datos de Firestore se compone de colecciones y documentos.

Documentos
Cada documento contiene un conjunto de pares clave-valor. Firestore está optimizado para almacenar grandes colecciones de documentos pequeños.

Colecciones
Debes almacenar todos los documentos en colecciones. Los documentos pueden contener subcolecciones y objetos anidados, incluidos campos primitivos, como cadenas, o bien objetos complejos, como listas.

Crea una base de datos de Firestore
- Crea la base de datos de Firestore
gcloud firestore databases create --location=$REGION
Ejemplo de resultado:
Success! Selected Google Cloud Firestore Native database for cymbal-eats-6422-3462
9. Cómo integrar Firestore en tu aplicación
En esta sección, actualizarás la cuenta de servicio, agregarás cuentas de servicio de acceso a Firestore, revisarás e implementarás las reglas de seguridad de Firestore y revisarás cómo se modifican los datos en Firestore.
Configura la autenticación
- Otorga el rol de usuario de Datastore a la cuenta de servicio
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
--role="roles/datastore.user"
Ejemplo de resultado:
Updated IAM policy for project [cymbal-eats-6422-3462].
Reglas de seguridad de Firestore
Las reglas de seguridad proporcionan control de acceso y validación de datos en un formato expresivo y sencillo.
- Navega al directorio order-service/starter-code
cd ~/cymbal-eats/order-service
- Abre el archivo firestore.rules en el editor de Cloud
cat firestore.rules
firestore.rules
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents { ⇐ All database
match /{document=**} { ⇐ All documents
allow read: if true; ⇐ Allow reads
}
match /{document=**} {
allow write: if false; ⇐ Deny writes
}
}
}
Advertencia: Se recomienda limitar el acceso al almacenamiento de Firestore. Para los fines de este lab, se permiten todas las lecturas. Esta no es una configuración de producción recomendada.
Habilita los servicios administrados de Firestore
- Haz clic en Abrir terminal.
- Crea el archivo .firebaserc con el ID del proyecto actual. La configuración de los destinos de implementación se almacena en el archivo .firebaserc del directorio de tu proyecto.
firebaserc.tmpl
sed "s/PROJECT_ID/$PROJECT_ID/g" firebaserc.tmpl > .firebaserc
- Descarga el objeto binario de Firebase
curl -sL https://firebase.tools | upgrade=true bash
Ejemplo de resultado:
-- Checking for existing firebase-tools on PATH... Your machine already has firebase-tools@10.7.0 installed. Nothing to do. -- All done!
- Implementa reglas de Firestore.
firebase deploy
Resultado de ejemplo
=== Deploying to 'cymbal-eats-6422-3462'... i deploying firestore i cloud.firestore: checking firestore.rules for compilation errors... ✔ cloud.firestore: rules file firestore.rules compiled successfully i firestore: uploading rules firestore.rules... ✔ firestore: released rules firestore.rules to cloud.firestore ✔ Deploy complete! Project Console: https://console.firebase.google.com/project/cymbal-eats-6422-3462/overview
Modificar datos
Las colecciones y los documentos se crean de manera implícita en Firestore; solo debes asignar datos a un documento dentro de una colección. Si la colección o el documento no existen, Firestore los crea.
Agrega datos a Firestore
Hay varias formas de escribir datos en Cloud Firestore:
- Configurar los datos de un documento dentro de una colección y especificar explícitamente un identificador de documento.
- Agregar un documento nuevo a una colección. En este caso, Cloud Firestore genera automáticamente el identificador de documento.
- Crear un documento vacío con un identificador generado automáticamente y asignarle datos después
En la siguiente sección, se te guiará para crear un documento con el método set.
Configura un documento
Usa el método set() para crear un documento. Con el método set(), debes especificar un ID para el documento que vas a crear.
Observa el siguiente fragmento de código.
index.js
const orderDoc = db.doc(`orders/123`);
await orderDoc.set({
orderNumber: 123,
name: Anne,
address: 555 Bright Street,
city: Mountain View,
state: CA,
zip: 94043,
orderItems: [id: 1],
status: 'New'
});
Este código creará un documento que especifica un ID de documento generado por el usuario 123. Para que Firestore genere un ID en tu nombre, usa el método add() o create().
Actualiza un documento
El método de actualización update()te permite actualizar algunos campos del documento sin reemplazarlo por completo.
En el siguiente fragmento, el código actualiza el pedido 123.
index.js
const orderDoc = db.doc(`orders/123`); await orderDoc.update(name: "Anna");
Cómo borrar un documento
En Firestore, puedes borrar colecciones, documentos o campos específicos de un documento. Para borrar un documento, usa el método delete().
El siguiente fragmento borra el pedido 123.
index.js
const orderDoc = db.doc(`orders/123`); await orderDoc.delete();
10. Implementación y pruebas
En esta sección, implementarás la aplicación en Cloud Run y probarás los métodos de creación, actualización y eliminación.
Implementa la aplicación en Cloud Run
- Almacena la URL en la variable INVENTORY_SERVICE_URL para integrarla con Inventory Service.
INVENTORY_SERVICE_URL=$(gcloud run services describe inventory-service \
--region=$REGION \
--format=json | jq \
--raw-output ".status.url")
- Implementa el servicio de pedidos
gcloud run deploy order-service \
--source . \
--platform managed \
--region $REGION \
--allow-unauthenticated \
--project=$PROJECT_ID \
--set-env-vars=INVENTORY_SERVICE_URL=$INVENTORY_SERVICE_URL \
--quiet
Ejemplo de resultado:
[...] Done. Service [order-service] revision [order-service-00001-qot] has been deployed and is serving 100 percent of traffic. Service URL: https://order-service-3jbm3exegq-uk.a.run.app
Prueba la aplicación de Cloud Run
Crea un documento
- Almacena la URL de la aplicación del servicio de pedidos en una variable para realizar pruebas
ORDER_SERVICE_URL=$(gcloud run services describe order-service \
--platform managed \
--region $REGION \
--format=json | jq \
--raw-output ".status.url")
- Compila una solicitud de pedido y publica un pedido nuevo en la base de datos de Firestore
curl --request POST $ORDER_SERVICE_URL/order \
--header 'Content-Type: application/json' \
--data-raw '{
"name": "Jane Doe",
"email": "Jane.Doe-cymbaleats@gmail.com",
"address": "123 Maple",
"city": "Buffalo",
"state": "NY",
"zip": "12346",
"orderItems": [
{
"id": 1
}
]
}'
Ejemplo de resultado:
{"orderNumber":46429}
Guarda el número de pedido para usarlo más adelante
export ORDER_NUMBER=<value_from_output>
Ver resultados
Visualiza los resultados en Firestore
- Navega a la consola de Firestore.
- Haz clic en Datos.

Actualiza un documento
El pedido enviado no incluía la cantidad.
- Actualiza el registro y agrega un par clave-valor de cantidad
curl --location -g --request PATCH $ORDER_SERVICE_URL/order/${ORDER_NUMBER} \
--header 'Content-Type: application/json' \
--data-raw '{
"orderItems": [
{
"id": 1,
"quantity": 1
}
]
}'
Ejemplo de resultado:
{"status":"success"}
Ver resultados
Visualiza los resultados en Firestore
- Navega a la consola de Firestore.
- Haz clic en Datos.

Cómo borrar un documento
- Borra el elemento 46429 de la colección de pedidos de Firestore
curl --location -g --request DELETE $ORDER_SERVICE_URL/order/${ORDER_NUMBER}
Ver resultados
- Navega a la consola de Firestore.
- Haz clic en Datos.

11. ¡Felicitaciones!
¡Felicitaciones! Completaste el lab.
Pasos siguientes:
Explora otros codelabs de Cymbal Eats:
- Cómo activar Cloud Workflows con Eventarc
- Cómo activar el procesamiento de eventos desde Cloud Storage
- Conéctate a CloudSQL privado desde Cloud Run
- Protege una aplicación sin servidores con Identity-Aware Proxy (IAP)
- Cómo activar trabajos de Cloud Run con Cloud Scheduler
- Implementación segura en Cloud Run
- Protección del tráfico de entrada de Cloud Run
- Conéctate a una instancia privada de AlloyDB desde GKE Autopilot
Limpia
Para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos usados en este instructivo, borra el proyecto que contiene los recursos o conserva el proyecto y borra los recursos individuales.
Borra el proyecto
La manera más fácil de eliminar la facturación es borrar el proyecto que creaste para el instructivo.