Conéctate a bases de datos completamente administradas desde Cloud Run

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

  1. 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.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • 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.
  1. 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

  1. 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
  1. 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
  1. Clona el repositorio
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git
  1. 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

  1. 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.   
  1. 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.

  1. 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
  1. 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

  1. 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
  1. 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.

  1. 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.

  1. Haz clic en Abrir terminal.
  2. 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
  1. 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

  1. 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

  1. 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.

  1. 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:

  1. En la consola, abre la página Instancias de Cloud Spanner.
  2. Ir a Instancias de Cloud Spanner
  3. 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.
  4. Haz clic en Consultar.
  5. Ingresa la siguiente consulta en el editor de consultas
SELECT * FROM InventoryHistory WHERE ItemID=1
  1. Haz clic en EJECUTAR.
  2. Haz clic en EXPLICACIÓN.

La consola de Cloud muestra un plan de ejecución visual para tu consulta.

149f8bae468f8b34.png

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

  1. 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.

  1. 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. 
  1. 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.

  1. Navega a Monitoring en la consola de Cloud y selecciona Explorador de métricas en el menú de la izquierda.
  2. En el campo Tipo de recurso, selecciona Instancia de Cloud Spanner.
  3. En el campo Métrica, selecciona Recuento de consultas y, luego, Aplicar.
  4. En el campo Agrupar por (Group By), selecciona database, optimizer_version y status.

581b859c25790b21.png

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.

6843abaf4263e112.png

8. Conceptos de Firestore

Modelo de datos

Una base de datos de Firestore se compone de colecciones y documentos.

b60acd63d4793a6c.png

Documentos

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

5571cb2f261d2dbe.png

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.

5811378cb721e5ec.png

Crea una base de datos de Firestore

  1. 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

  1. 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.

  1. Navega al directorio order-service/starter-code
cd ~/cymbal-eats/order-service
  1. 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

  1. Haz clic en Abrir terminal.
  2. 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
  1. 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!
  1. 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

  1. 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")
  1. 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

  1. Almacenar 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")
  1. 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

  1. Navega a la consola de Firestore.
  2. Haz clic en Datos.

807Cceca36585864.png

Actualiza un documento

El pedido enviado no incluía la cantidad.

  1. 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

  1. Navega a la consola de Firestore.
  2. Haz clic en Datos.

cfcf78d200e15b84.png

Cómo borrar un documento

  1. 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

  1. Navega a la consola de Firestore.
  2. Haz clic en Datos.

73e14d69211d1539.png

11. ¡Felicitaciones!

¡Felicitaciones! Terminaste el lab.

¿Qué sigue?

Explora otros codelabs de Cymbal Eats:

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.