arrow_back

Cómo desarrollar una API de REST con Go y Cloud Run

Unirse Acceder
Test and share your knowledge with our community!
done
Get access to over 700 hands-on labs, skill badges, and courses

Cómo desarrollar una API de REST con Go y Cloud Run

Lab 1 hora universal_currency_alt 5 créditos show_chart Intermedio
Test and share your knowledge with our community!
done
Get access to over 700 hands-on labs, skill badges, and courses

GSP761

Labs de autoaprendizaje de Google Cloud

Logotipo de Pet Theory

Descripción general

En este lab, leerás el caso y tomarás las medidas que los personajes adoptan para resolver el problema de la empresa.

Hace doce años, Lily fundó la cadena de clínicas veterinarias Pet Theory. Dado que la cadena ha crecido mucho, Lily pasa más tiempo hablando por teléfono con las empresas de seguros que atendiendo a las mascotas. ¡Si tan solo las empresas de seguros pudieran ver los totales de los tratamientos en línea!

En los labs anteriores de esta serie, Ruby, el asesor de computación, y Patrick, el ingeniero de DevOps, movieron la base de datos de clientes de Pet Theory a una base de datos sin servidores de Firestore en la nube y, luego, abrieron el acceso para que los clientes puedan programar citas en línea. Como el equipo de operaciones de Pet Theory está compuesto por una sola persona, la empresa necesita una solución sin servidores que no requiera mucho mantenimiento continuo.

En este lab, ayudarás a Ruby y a Patrick a otorgar a las empresas de seguros acceso a los datos de los clientes sin exponer la información de identificación personal (PII). Compilarás una puerta de enlace de API de transferencia de estado representacional (REST) segura con Cloud Run, que es un servicio sin servidores. Esto permitirá que las empresas de seguros vean el costo total de los tratamientos sin ver la PII de los clientes.

Requisitos previos

Este es un lab de nivel básico, lo que supone que el usuario tiene conocimientos previos sobre los entornos de Cloud Console y Cloud Shell. Además, como este lab forma parte de una serie, haber realizado otros anteriores podría ser útil, aunque no es obligatorio:

  • Cómo importar datos a una base de datos sin servidores
  • Cómo usar Firebase y Firestore para compilar una aplicación web sin servidores
  • Cómo compilar una aplicación sin servidores que crea archivos PDF

Además, debes sentirte cómodo editando archivos. Puedes usar tu editor de texto favorito (como nano, vi, etc.) o puedes iniciar el editor de código de Cloud Shell, que se encuentra en la cinta superior:

Botón Abrir editor

Configuración

Antes de hacer clic en el botón Comenzar lab

Lee estas instrucciones. Los labs son cronometrados y no se pueden pausar. El cronómetro, que comienza a funcionar cuando haces clic en Comenzar lab, indica por cuánto tiempo tendrás a tu disposición los recursos de Google Cloud.

Este lab práctico te permitirá realizar las actividades correspondientes en un entorno de nube real, no en uno de simulación o demostración. Para ello, se te proporcionan credenciales temporales nuevas que utilizarás para acceder a Google Cloud durante todo el lab.

Para completar este lab, necesitarás lo siguiente:

  • Acceso a un navegador de Internet estándar (se recomienda el navegador Chrome)
Nota: Usa una ventana de navegador privada o de Incógnito para ejecutar este lab. Así evitarás cualquier conflicto entre tu cuenta personal y la cuenta de estudiante, lo que podría generar cargos adicionales en tu cuenta personal.
  • Tiempo para completar el lab: Recuerda que, una vez que comienzas un lab, no puedes pausarlo.
Nota: Si ya tienes un proyecto o una cuenta personal de Google Cloud, no los uses en este lab para evitar cargos adicionales en tu cuenta.

Cómo iniciar su lab y acceder a la consola de Google Cloud

  1. Haga clic en el botón Comenzar lab. Si debe pagar por el lab, se abrirá una ventana emergente para que seleccione su forma de pago. A la izquierda, se encuentra el panel Detalles del lab que tiene estos elementos:

    • El botón Abrir la consola de Google
    • Tiempo restante
    • Las credenciales temporales que debe usar para el lab
    • Otra información para completar el lab, si es necesaria
  2. Haga clic en Abrir la consola de Google. El lab inicia recursos y abre otra pestaña en la que se muestra la página de acceso.

    Sugerencia: Ordene las pestañas en ventanas separadas, una junto a la otra.

    Nota: Si ve el diálogo Elegir una cuenta, haga clic en Usar otra cuenta.
  3. Si es necesario, copie el nombre de usuario del panel Detalles del lab y péguelo en el cuadro de diálogo Acceder. Haga clic en Siguiente.

  4. Copie la contraseña del panel Detalles del lab y péguela en el cuadro de diálogo de bienvenida. Haga clic en Siguiente.

    Importante: Debe usar las credenciales del panel de la izquierda. No use sus credenciales de Google Cloud Skills Boost. Nota: Usar su propia Cuenta de Google podría generar cargos adicionales.
  5. Haga clic para avanzar por las páginas siguientes:

    • Acepte los términos y condiciones.
    • No agregue opciones de recuperación o autenticación de dos factores (esta es una cuenta temporal).
    • No se registre para obtener pruebas gratuitas.

Después de un momento, se abrirá la consola de Cloud en esta pestaña.

Nota: Para ver el menú con una lista de los productos y servicios de Google Cloud, haga clic en el Menú de navegación que se encuentra en la parte superior izquierda de la pantalla. Ícono del menú de navegación

Activa Cloud Shell

Cloud Shell es una máquina virtual que cuenta con herramientas para desarrolladores. Ofrece un directorio principal persistente de 5 GB y se ejecuta en Google Cloud. Cloud Shell proporciona acceso de línea de comandos a tus recursos de Google Cloud.

  1. Haz clic en Activar Cloud Shell Ícono de Activar Cloud Shell en la parte superior de la consola de Google Cloud.

Cuando te conectes, habrás completado la autenticación, y el proyecto estará configurado con tu PROJECT_ID. El resultado contiene una línea que declara el PROJECT_ID para esta sesión:

Your Cloud Platform project in this session is set to YOUR_PROJECT_ID

gcloud es la herramienta de línea de comandos de Google Cloud. Viene preinstalada en Cloud Shell y es compatible con la función de autocompletado con tabulador.

  1. Puedes solicitar el nombre de la cuenta activa con este comando (opcional):
gcloud auth list
  1. Haz clic en Autorizar.

  2. Ahora, el resultado debería verse de la siguiente manera:

Resultado:

ACTIVE: * ACCOUNT: student-01-xxxxxxxxxxxx@qwiklabs.net To set the active account, run: $ gcloud config set account `ACCOUNT`
  1. Puedes solicitar el ID del proyecto con este comando (opcional):
gcloud config list project

Resultado:

[core] project = <project_ID>

Resultado de ejemplo:

[core] project = qwiklabs-gcp-44776a13dea667a6 Nota: Para obtener toda la documentación de gcloud, consulta la guía con la descripción general de gcloud CLI en Google Cloud.

Lily

Lily, fundadora de Pet Theory

Hola Ruby:

Cuando conversamos la semana pasada, te conté que estoy muy abrumada con el papeleo y las llamadas telefónicas de la empresa de seguros. ¿Lo recuerdas? Si existiera una forma de permitir que los representantes accedan a los registros de los clientes de manera segura y eficiente, todo sería más fácil.

El nivel actual de la carga de trabajo es insostenible. ¿Puedes ayudarme?

Lily

Ruby

Ruby, asesora de software

Hola Lily:

Almorcé con Patrick ayer y diseñamos un plan para facilitar el acceso seguro de terceros autorizados a los registros digitales de Pet Theory.

Ejecutaremos esto en cuatro pasos:

  1. Compilar una API de REST simple
  2. Importar datos de prueba de clientes
  3. Conectar la API de REST a la base de datos de clientes
  4. Agregar autenticación a la API de REST

Patrick y yo ya tenemos el conjunto de habilidades para los pasos 1 y 2, así que es un buen comienzo. Según nuestros planes, el prototipo estará en funcionamiento antes de que finalice la semana.

Ruby

Ayuda a Ruby a administrar las actividades necesarias para compilar la API de REST de Pet Theory.

Tarea 1: Habilita las APIs de Google

En este lab, se habilitaron 2 APIs para ti:

Nombre API
Cloud Build cloudbuild.googleapis.com
Cloud Run run.googleapis.com

Tarea 2: Desarrolla la API de REST

  1. Activa tu proyecto:
gcloud config set project $(gcloud projects list --format='value(PROJECT_ID)' --filter='qwiklabs-gcp')
  1. Clona el repositorio pet-theory y accede al código fuente:
git clone https://github.com/rosera/pet-theory.git && cd pet-theory/lab08
  1. Usa tu editor de texto favorito o usa el botón Editor de código en la cinta de Cloud Shell para ver los archivos go.mod y go.sum.

  2. Crea el archivo main.go y agrégale el siguiente contenido:

package main import ( "fmt" "log" "net/http" "os" ) func main() { port := os.Getenv("PORT") if port == "" { port = "8080" } http.HandleFunc("/v1/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "{status: 'running'}") }) log.Println("Pets REST API listening on port", port) if err := http.ListenAndServe(":"+port, nil); err != nil { log.Fatalf("Error launching Pets REST API server: %v", err) } } Nota: En el código anterior, crea un extremo para verificar que el servicio esté en funcionamiento como se espera. Puedes agregar "/v1/" a la URL del servicio y así verificar que la aplicación funcione según lo previsto. Cloud Run implementa contenedores, por lo que debes proporcionar una definición de contenedor. Un archivo llamado “Dockerfile” le indica a Cloud Run qué versión de Go debe usar, qué archivos debe incluir en la aplicación y cómo iniciar el código.
  1. Ahora crea un archivo llamado Dockerfile y agrégale lo siguiente:
FROM gcr.io/distroless/base-debian10 WORKDIR /usr/src/app COPY server . CMD [ "/usr/src/app/server" ]

El archivo server es el objeto binario de ejecución compilado a partir de main.go.

  1. Ejecuta el siguiente comando para compilar el objeto binario:
go build -o server
  1. Después de ejecutar el comando de compilación, asegúrate de tener el servidor y Dockerfile necesarios en el mismo directorio.
ls -la . ├── Dockerfile ├── go.mod ├── go.sum ├── main.go └── server

En la mayoría de las aplicaciones basadas en Go de Cloud Run, se puede usar un Dockerfile de plantillas como el de arriba, generalmente, sin modificarlo.

  1. Para implementar tu API de REST simple, ejecuta lo siguiente:
gcloud builds submit \ --tag gcr.io/$GOOGLE_CLOUD_PROJECT/rest-api:0.1

Este comando compila un contenedor con tu código y lo coloca en Container Registry, en tu proyecto. Para ver el contenedor, haz clic en Menú de navegación > Container Registry. Si no ves rest-api, haz clic en Actualizar.

Container Registry

Haz clic en Revisar mi progreso para verificar la realización de la tarea indicada arriba.

Compilar una imagen con Cloud Build
  1. Después de compilar el contenedor, impleméntalo:
gcloud run deploy rest-api \ --image gcr.io/$GOOGLE_CLOUD_PROJECT/rest-api:0.1 \ --platform managed \ --region {{{ project_0.default_region | "Filled in at lab startup." }}} \ --allow-unauthenticated \ --max-instances=2
  1. Cuando la implementación esté completa, verás un mensaje como este:
Service [rest-api] revision [rest-api-00001] has been deployed and is serving traffic at https://rest-api-[hash].a.run.app

Haz clic en Revisar mi progreso para verificar la realización de la tarea indicada arriba.

Implementar el servicio de la API de REST
  1. Haz clic en la URL del servicio al final de ese mensaje para abrirla en una nueva pestaña del navegador. Agrega /v1/ al final de la URL y, luego, presiona Intro.

Deberías ver el siguiente mensaje:

{&quot;status&quot; : &quot;running&quot;}

La API de REST ya está en funcionamiento. Con el servicio de prototipo disponible, en la siguiente sección, la API se usará para recuperar información de “clientes” de una base de datos de Firestore.

Tarea 3: Importa datos de prueba de clientes

Ruby

Ruby, asesora de software

Hola Patrick:

¿Todavía tienes los datos de clientes ficticios que inventamos hace algún tiempo? Los necesitaremos para hacer pruebas.

¿Recuerdas cómo configurar una base de datos de Firestore y cómo importar datos?

Ruby

Patrick

Patrick, administrador de TI

Hola Ruby:

Sí. Todavía tengo los datos de prueba. Los migraré a Firestore hoy para que puedas usarlos para hacer las pruebas.

Patrick

Ruby y Patrick crearon anteriormente una base de datos de prueba de 10 clientes, con algunos tratamientos propuestos para el gato de un cliente.

Ayuda a Patrick a configurar la base de datos de Firestore y a importar los datos de prueba de clientes. Primero, habilita Firestore en tu proyecto.

  1. Regresa a la consola de Cloud y haz clic en Menú de navegación > Firestore.

  2. Haz clic en el botón Crear base de datos.

  3. Haz clic en el botón Modo nativo.

  4. Selecciona la ubicación de la lista disponible y haz clic en Crear.

Espera a que se haya creado la base de datos para continuar.

Haz clic en Revisar mi progreso para verificar la realización de la tarea indicada arriba.

Crear base de datos de Firestore
  1. Migra los archivos de importación a un bucket de Cloud Storage que se creó para ti:
gsutil mb -c standard -l {{{ project_0.default_region | Region }}} gs://$GOOGLE_CLOUD_PROJECT-customer gsutil cp -r gs://spls/gsp645/2019-10-06T20:10:37_43617 gs://$GOOGLE_CLOUD_PROJECT-customer
  1. Ahora importa los siguientes datos en Firebase:
gcloud beta firestore import gs://$GOOGLE_CLOUD_PROJECT-customer/2019-10-06T20:10:37_43617/

Vuelve a cargar el navegador de la consola de Cloud para ver los resultados de Firestore.

  1. En Firestore, en "Raíz", haz clic en clientes. Deberías ver los datos importados de las mascotas, revísalos. Si no ves ningún dato, intenta actualizar la página.

Buen trabajo. La base de datos de Firestore se creó y propagó con datos de prueba correctamente.

Tarea 4: Conecta la API de REST a la base de datos de Firestore

Ruby

Ruby, asesora de software

Hola Lily:

Una actualización rápida: Patrick y yo completamos las primeras dos tareas de la lista.

Ahora, comenzaré a estructurar la API de REST para que pueda acceder a los datos de clientes en Firestore.

Ruby

Lily

Lily, fundadora de Pet Theory

Hola Ruby:

Buen trabajo. Espero que la próxima etapa se ponga en marcha pronto.

Lily

En esta sección, ayudarás a Ruby a crear otro extremo en la API de REST, que se verá de la siguiente manera:

https://rest-api-[hash].a.run.app/v1/customer/22530

Por ejemplo, esa URL debería mostrar la cantidad total de tratamientos propuestos, aceptados y rechazados para el cliente con el ID 22530, si existe en la base de datos de Firestore:

{ "status": "success", "data": { "proposed": 1602, "approved": 585, "rejected": 489 } } Nota: Si el cliente no existe en la base de datos, debería aparecer el código de estado 404 (No encontrado) y un mensaje de error.

Esta nueva funcionalidad requiere un paquete para acceder a la base de datos de Firestore y otro para controlar el uso compartido de recursos entre dominios (CORS).

  1. Obtén el valor de la variable de entorno $GOOGLE_CLOUD_PROJECT
echo $GOOGLE_CLOUD_PROJECT
  1. Abre el archivo existente main.go en el directorio pet-theory/lab08.
Nota: Actualiza los contenidos de main.go con el valor que se muestra para $GOOGLE_CLOUD_PROJECT.
  1. Reemplaza el contenido del archivo con el código a continuación y asegúrate de que PROJECT_ID esté configurado como :
package main import ( "context" "encoding/json" "fmt" "log" "net/http" "os" "cloud.google.com/go/firestore" "github.com/gorilla/handlers" "github.com/gorilla/mux" "google.golang.org/api/iterator" ) var client *firestore.Client func main() { var err error ctx := context.Background() client, err = firestore.NewClient(ctx, "{{{ project_0.project_id | \"Filled in at lab startup\"}}}") if err != nil { log.Fatalf("Error initializing Cloud Firestore client: %v", err) } port := os.Getenv("PORT") if port == "" { port = "8080" } r := mux.NewRouter() r.HandleFunc("/v1/", rootHandler) r.HandleFunc("/v1/customer/{id}", customerHandler) log.Println("Pets REST API listening on port", port) cors := handlers.CORS( handlers.AllowedHeaders([]string{"X-Requested-With", "Authorization", "Origin"}), handlers.AllowedOrigins([]string{"https://storage.googleapis.com"}), handlers.AllowedMethods([]string{"GET", "HEAD", "POST", "OPTIONS", "PATCH", "CONNECT"}), ) if err := http.ListenAndServe(":"+port, cors(r)); err != nil { log.Fatalf("Error launching Pets REST API server: %v", err) } }
  1. Agrega asistencia al controlador en la parte inferior del archivo:
func rootHandler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "{status: 'running'}") } func customerHandler(w http.ResponseWriter, r *http.Request) { id := mux.Vars(r)["id"] ctx := context.Background() customer, err := getCustomer(ctx, id) if err != nil { w.WriteHeader(http.StatusInternalServerError) fmt.Fprintf(w, `{"status": "fail", "data": '%s'}`, err) return } if customer == nil { w.WriteHeader(http.StatusNotFound) msg := fmt.Sprintf("`Customer \"%s\" not found`", id) fmt.Fprintf(w, fmt.Sprintf(`{"status": "fail", "data": {"title": %s}}`, msg)) return } amount, err := getAmounts(ctx, customer) if err != nil { w.WriteHeader(http.StatusInternalServerError) fmt.Fprintf(w, `{"status": "fail", "data": "Unable to fetch amounts: %s"}`, err) return } data, err := json.Marshal(amount) if err != nil { w.WriteHeader(http.StatusInternalServerError) fmt.Fprintf(w, `{"status": "fail", "data": "Unable to fetch amounts: %s"}`, err) return } fmt.Fprintf(w, fmt.Sprintf(`{"status": "success", "data": %s}`, data)) }
  1. Agrega asistencia al cliente al final del archivo:
type Customer struct { Email string `firestore:"email"` ID string `firestore:"id"` Name string `firestore:"name"` Phone string `firestore:"phone"` } func getCustomer(ctx context.Context, id string) (*Customer, error) { query := client.Collection("customers").Where("id", "==", id) iter := query.Documents(ctx) var c Customer for { doc, err := iter.Next() if err == iterator.Done { break } if err != nil { return nil, err } err = doc.DataTo(&c) if err != nil { return nil, err } } return &c, nil } func getAmounts(ctx context.Context, c *Customer) (map[string]int64, error) { if c == nil { return map[string]int64{}, fmt.Errorf("Customer should be non-nil: %v", c) } result := map[string]int64{ "proposed": 0, "approved": 0, "rejected": 0, } query := client.Collection(fmt.Sprintf("customers/%s/treatments", c.Email)) if query == nil { return map[string]int64{}, fmt.Errorf("Query is nil: %v", c) } iter := query.Documents(ctx) for { doc, err := iter.Next() if err == iterator.Done { break } if err != nil { return nil, err } treatment := doc.Data() result[treatment["status"].(string)] += treatment["cost"].(int64) } return result, nil }
  1. Guarda el archivo.

Tarea 6: ¡Examen sorpresa!

¿Qué función responde a las URLs con el patrón "/v1/customer/"? getAmounts customerHandler ¿Qué sentencia muestra un mensaje de éxito al cliente? fmt.Fprintf(w, `{"status": "fail", "data": "Unable to fetch amounts: %s"} fmt.Fprintf(w, fmt.Sprintf(`{"status": "success", "data": %s} ¿Qué funciones leen de la base de datos de Firestore? customerHandler y getCustomer getCustomer y getAmounts

Tarea 7: Implementa una revisión nueva

  1. Vuelve a compilar el código fuente:
go build -o server
  1. Compila una imagen nueva para la API de REST:
gcloud builds submit \ --tag gcr.io/$GOOGLE_CLOUD_PROJECT/rest-api:0.2

Haz clic en Revisar mi progreso para verificar el objetivo. Compilar la revisión de imagen 0.2

  1. Implementa la imagen actualizada:
gcloud run deploy rest-api \ --image gcr.io/$GOOGLE_CLOUD_PROJECT/rest-api:0.2 \ --platform managed \ --region {{{ project_0.default_region | "Filled in at lab startup." }}} \ --allow-unauthenticated \ --max-instances=2 </ql-code-block 4. Cuando se complete la implementación, verás un mensaje similar al de antes. La URL de tu API de REST no cambió cuando implementaste la nueva versión: Service [rest-api] revision [rest-api-00002] has been deployed and is serving traffic at https://rest-api-[hash].a.run.app
  1. Regresa a la pestaña del navegador que ya apunta a esa URL (con /v1 al final). Actualízala y asegúrate de recibir el mismo mensaje que antes. Esto significa que el estado de la API aún es activo.

{status&quot; : &quot;running&quot;}

  1. Agrega /customer/22530 a la URL de la aplicación en la barra de direcciones de tu navegador. Deberías obtener esta respuesta JSON, con una lista de la suma total de los tratamientos propuestos, aprobados y rechazados del cliente:

{&quot;status&quot; : &quot;success&quot;, &quot;data&quot; :{&quot;proposed&quot; :1602, &quot;approved&quot; :585, &quot;reected&quot; :489}}

  1. Estos son algunos IDs de cliente adicionales que puedes incluir en la URL en lugar de 22530:
  • 34216
  • 70156 (todos los importes deberían ser cero)
  • 12345 (el cliente/la mascota no existe; se debería mostrar un error; p. ej., La búsqueda no tiene resultados)

Compilaste una API de REST sin servidores, escalable y con mantenimiento bajo que lee de una base de datos.

¡Felicitaciones!

Ruby y Patrick compilaron con éxito un prototipo de API de REST para Pet Theory.

Capacitación y certificación de Google Cloud

Recibe la formación que necesitas para aprovechar al máximo las tecnologías de Google Cloud. Nuestras clases incluyen habilidades técnicas y recomendaciones para ayudarte a avanzar rápidamente y a seguir aprendiendo. Para que puedas realizar nuestros cursos cuando más te convenga, ofrecemos distintos tipos de capacitación de nivel básico a avanzado: a pedido, presenciales y virtuales. Las certificaciones te ayudan a validar y demostrar tus habilidades y tu conocimiento técnico respecto a las tecnologías de Google Cloud.

Última actualización del manual: 8 de diciembre de 2023

Prueba más reciente del lab: 8 de diciembre de 2023

Copyright 2024 Google LLC. All rights reserved. Google y el logotipo de Google son marcas de Google LLC. Los demás nombres de productos y empresas pueden ser marcas de las respectivas empresas a las que estén asociados.