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 servicios para que usen la base de datos relacional de Cloud Spanner y Cloud Firestore, una base de datos de documentos NoSQL. Usar productos sin servidores para el nivel de datos y el entorno de ejecución de la aplicación te permite abstraer toda la administración de la infraestructura, ya que te enfocas 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
- Habilitar los servicios administrados de Spanner
- Cómo integrar en el código
- Implementa el código conectándose a Spanner
- Integra Firestore
- Habilita los servicios administrados de Firestore
- Cómo integrar 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 de forma correcta
gcloud spanner instances list
Resultado de ejemplo
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
Resultado de ejemplo
Creating database...done.
Verifica el estado y el esquema de la base de datos
- Visualiza el estado de la base de datos
gcloud spanner databases describe $SPANNER_DB \
--instance=$SPANNER_INSTANCE
Resultado de ejemplo
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
Resultado de ejemplo
CREATE TABLE InventoryHistory ( ItemRowID STRING(36) NOT NULL, ItemID INT64 NOT NULL, InventoryChange INT64, TimeStamp TIMESTAMP, ) PRIMARY KEY(ItemRowID);
5. Integra Spanner
En esta sección, aprenderás a integrar Spanner a tu aplicación. Además, SQL Spanner proporciona bibliotecas cliente, controladores JDBC, controladores R2DBC, APIs de REST y API de RPC, que te permiten integrar Spanner a 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
Las bibliotecas cliente de Google Cloud CLI y Google Cloud detectan automáticamente si 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 llama credenciales predeterminadas de la aplicación y permite la portabilidad del código entre varios entornos.
Sin embargo, es mejor crear una identidad dedicada asignándole una cuenta de servicio administrada por el usuario en lugar de la cuenta de servicio predeterminada.
- Otorga el rol Administrador de bases 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"
Resultado de ejemplo
Updated IAM policy for project [cymbal-eats-6422-3462]. [...]
Uso de 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.
Crear un cliente de Spanner
El cliente de Spanner es un cliente para leer y escribir datos en una base de datos de Cloud Spanner. Es seguro usar un cliente de forma simultánea, excepto por su método Close.
El siguiente fragmento crea un cliente Spanner
main.go
var dataClient *spanner.Client ... dataClient, err = spanner.NewClient(ctx, databaseName)
Un cliente es como una conexión de base de datos: todas tus interacciones con Cloud Spanner deben atravesar un cliente. Normalmente, se crea un cliente cuando se inicia la aplicación y, luego, se vuelve a usar ese cliente para leer, escribir y ejecutar transacciones. Cada cliente usa los recursos en Cloud Spanner.
Modifica datos
Existen varias formas de insertar, actualizar y borrar datos de una base de datos de Spanner. A continuación, se indican los métodos disponibles.
En este lab, usarás mutaciones para modificar datos en Spanner.
Mutaciones en Spanner
Una Mutation 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 de inventario.
Implementación y pruebas
Ahora que Spanner está configurado y revisaste los elementos clave del código que implementan 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
Resultado de ejemplo
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 del 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 cloudshell, 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
}
]'
Resultado de ejemplo
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
Consultar 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 el usuario quiere sin describir cómo se obtendrán los resultados.
- En la terminal, ingresa este comando para consultar la tabla del registro creado con anterioridad.
gcloud spanner databases execute-sql $SPANNER_DB \
--instance=$SPANNER_INSTANCE \
--sql='SELECT * FROM InventoryHistory WHERE ItemID=1'
Resultado de ejemplo
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 obtener 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 las bibliotecas cliente. Para ver cómo Spanner controla las consultas en SQL, sigue estos pasos:
- 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 Consultar.
- 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á, ampliando las opciones del plan de ejecución de consultas y mejorando la precisión de las estimaciones que informan esas opciones, lo que lleva a planes de ejecución de consultas más eficientes.
Cloud Spanner lanza actualizaciones del optimizador como versiones nuevas del optimizador de consultas. De forma predeterminada, cada base de datos comienza a utilizar la última versión del optimizador, a más tardar, 30 días después del lanzamiento de 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'
Resultado de ejemplo
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 este momento es la 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)'
Resultado de ejemplo
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'
Resultado de ejemplo
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 la consola de Cloud 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 consultas y, luego, Aplicar.
- En el campo Agrupar por (Group By), 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. Aunque la interfaz de Firestore tiene muchas de las mismas funciones que las bases de datos tradicionales, una base de datos NoSQL difiere de ellas porque describe las relaciones entre los 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 exista 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 básicos 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
Resultado de ejemplo
Success! Selected Google Cloud Firestore Native database for cymbal-eats-6422-3462
9. Integra 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 del 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"
Resultado de ejemplo
Updated IAM policy for project [cymbal-eats-6422-3462].
Reglas de seguridad de Firestore
Las reglas de seguridad proporcionan un formato expresivo pero sencillo para el control de acceso y la validación de datos.
- 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. A los fines de este lab, se permiten todas las operaciones de lectura. Esta no es una configuración de producción recomendada.
Habilita los servicios administrados de Firestore
- Haz clic en Abrir terminal.
- Crea un 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
- Descargar objeto binario de Firebase
curl -sL https://firebase.tools | upgrade=true bash
Resultado de ejemplo
-- Checking for existing firebase-tools on PATH... Your machine already has firebase-tools@10.7.0 installed. Nothing to do. -- All done!
- Implementar 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
Modifica 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:
- Configura los datos de un documento dentro de una colección y especifica 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.
La siguiente sección te guiará en la creación de 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 se 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()
.
Actualizar 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");
Borra 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 orden 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 al servicio de inventario
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
Resultado de ejemplo
[...] 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 probarla
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
}
]
}'
Resultado de ejemplo
{"orderNumber":46429}
Guarda el número de pedido para usarlo más tarde
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
}
]
}'
Resultado de ejemplo
{"status":"success"}
Ver resultados
Visualiza los resultados en Firestore
- Navega a la consola de Firestore.
- Haz clic en Datos.
Cómo borrar un documento
- Borrar 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! Terminaste el lab.
¿Qué sigue?
Explora otros codelabs de Cymbal Eats:
- Activa Cloud Workflows con Eventarc
- Activa el procesamiento de eventos desde Cloud Storage
- Conéctate a Cloud SQL privado desde Cloud Run
- Protección de aplicaciones sin servidores con Identity-Aware Proxy (IAP)
- Activa trabajos de Cloud Run con Cloud Scheduler
- Implementa de forma segura en Cloud Run
- Protege el tráfico de entrada de Cloud Run
- Conéctate a cuentas privadas 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.