Objetivos

Al finalizar el tutorial el estudiante estará en capacidad de:

Requisitos para desarrollar el tutorial

En particular se utilizarán los siguientes recursos:

  1. Contar con una cuenta activa en Google Cloud y con recursos para la creación de servicios. Además, contar con un proyecto creado en el que deberá crear la función. En caso de no tenerlo, a continuación se encuentra el manual para crearlos y/o administrarlos: Crea y administra proyectos | Documentación de Resource Manager | Google Cloud
  2. Instalación y configuración para desarrollo en Python. En caso de no tenerlo instalado o correctamente configurado, a continuación se muestra el manual de instalación y configuración: Configura un entorno de desarrollo de Python | Google Cloud
  3. Contar con un editor o IDE para manipular de manera correcta el código. Se recomienda trabajar con Visual Studio Code, pero puede usar el editor de su preferencia. A continuación se muestran los pasos de instalación de Visual Studio Code: Visual Studio Code - Code Editing. Redefined
  4. gcloud SDK para acceder a los servicios del proveedor Google Cloud Platform a partir de la consola. En caso de no tenerla instalada puede consultar el siguiente manual de instalación: Instalación de SDK de Cloud | Google Cloud
  5. Concluir de manera exitosa el tutorial de despliegue de funciones como servicio.

El código de la aplicación lo encuentra en el siguiente repositorio de GitHub: gcp_faas_storage

La aplicación es una pequeña API en Python y Flask con tres endpoints.

Crear héroes:

Endpoint

/

Descripción

Crea un archivo con la información del héroe especificada

Método

POST

Retorno

application/json, con la información de un pedido.

Cuerpo de la petición

Objeto JSON con la información del nuevo héroe a crear

Listar héroes:

Endpoint

/

Descripción

Retorna la lista completa de heroes con los detalles de estos

Método

GET

Retorno

application/json, con la información de un pedido.

Parámetros del Endpoint

Ninguno

Detalla héroe:

Endpoint

/

Descripción

Retorna la información del héroe asociado al identificador especificado

Método

GET

Retorno

application/json. Con un diccionario que representa la información de una entrega.

Parámetros del Endpoint

id: Identificador del héroe que se desea consultar.

Debe verificar que el proyecto objetivo se encuentra seleccionado tanto el de la consola de google cloud como en la consola local de su computador.

En google cloud asegúrese de tener seleccionado el proyecto al entrar a console.cloud.google.com

Antes de iniciar es necesario eliminar las funciones que hemos desplegado previamente. Para ello puede hacer uso del siguiente comando, donde FUNCTION_NAME es el nombre de la función que desea eliminar.

user@192 ~ % gcloud functions delete <FUNCTION_NAME>

Para el desarrollo del taller necesitaremos crear un servicio que nos permita crear y manipular diversos archivos. Para ello, crearemos y configuraremos el servicio de Cloud Storage. Cloud Storage es un servicio que nos permitirá guardar todo tipo de archivos, los cuales organizaremos en contenedores llamados Buckets. (Si desea más información, puede ver el siguiente enlace: Definición de Cloud Storage)

Para poder utilizar el servicio crearemos un bucket donde guardaremos la información de los héroes. Para ello debe tener presente que el nombre debe ser único no solo a nivel del proyecto, sino a nivel de todas las cuentas de google. Por ello le sugerimos la siguiente estructura de nombramiento:

misw-native-storage-<usuario de uniandes>

Debe tener presente que su usuario uniandes no debe tener punto y debe estar completamente en minúscula.

Para la creación del bucket ejecutaremos el siguiente comando:

user@192 ~ % gsutil mb -p <id_proyecto> -c standard -l us-central1 -b on gs://<nombre_bucket>

A continuación se muestra la explicación de los parámetros de configuración utilizados:

Parámetro

Utilidad

-p

Es el identificador del proyecto en donde crearemos el bucket. (Ver sección Validación del proyecto)

-c

Determina la clase de almacenamiento con que se configurará el bucket. Si desea conocer las distintas alternativas puede ver el siguiente enlace Clases de almacenamiento. En nuestro caso configuraremos la standard

-l

Región en la que se creará el bucket. Para esto, Google ofrece tres esquemas distintos de ubicación que van desde utilizar una región a despliegue en multiregión. En nuestro caso lo crearemos en una sola región, pero si gusta puede explorar las distintas configuraciones de las regiones en el siguiente enlace Regiones

-b

Esto nos permite definir si el acceso a nivel del bucket será uniforme o no. Los valores que se permiten son on y off. En nuestro caso lo dejaremos encendido para simplificar la manipulación, pero si desea conocer las diferencias puede referirse al siguiente enlace: Nivel de acceso al bucket

Una vez ejecutado el comando deberemos ver el siguiente resultado en la consola

user@192 ~ % gsutil mb -p uandes-native -c standard -l us-central1 -b on gs://misw-native-storage-student0001
Creating gs://misw-native-storage-student0001/.

Validación de la creación

Para validar que el bucket se creó de manera correcta, podemos dirigirnos a la consola de google y revisar. Para ello debemos dirigirnos al menú de navegación en la sección "ALMACENAMIENTO", y seleccionamos el servicio "Cloud Storage"

Esto nos llevará al panel principal de administración de los buckets. En esta deberíamos ver el nuevo bucket que creamos.

Antes de desplegar las funciones revisemos previamente un poco el código de una de ellas.

Abra el código de la función crear

Lo invitamos a revisar igualmente los archivos de listar y detalle para que pueda observar cómo se consulta la información del storage.

A continuación pasaremos a publicar tres funciones que se conectarán al bucket creado previamente. Para ello debe tener presente el nombre con el que se creó, pues será importante para establecer la conexión.

Dentro del repositorio, abra la terminal y diríjase a la carpeta de la función crear.

user@192 ~ % cd crear

Una vez allí, ejecute el siguiente comando para desplegar la función. Para establecer la conexión se creará una variable de entorno con el nombre del bucket, no olvide modificarla.

user@192 ~ % gcloud functions deploy funcion-heroes-storage-crear --entry-point crear_heroe --runtime python39 --trigger-http --allow-unauthenticated --memory 128MB --region us-central1 --timeout 60 --min-instances 0 --max-instances 1 --set-env-vars BUCKETNAME=<nombre_bucket>

La mayoría de los parámetros de configuración se mostraron en el tutorial "Despliegue de funciones como servicio". Sin embargo, ahora tenemos un parámetro adicional que nos permite crear variables de entorno. Este es el que se debe modificar para establecer la conexión. A continuación se explica el nuevo parámetro.

Parámetro

Utilidad

--set-env-vars

Esto permite crear variables de entorno al momento de la ejecución. Las variables que se crearán se definen como tuplas de llave valor que se enviaran separadas por coma. En nuestro caso solo crearemos una para establecer la comunicación con el bucket.

Si la publicación se realiza de manera exitosa entonces se nos mostrará el siguiente mensaje:

Y podremos ver la función publicada.

Luego de realizar la publicación de la función crear, debemos realizar la publicación de las funciones listar y detalle. Para ello seguiremos un proceso similar al anterior.

Dentro del repositorio, abra la terminal y diríjase a la carpeta de la función listar.

user@192 ~ % cd listar

Una vez allí, ejecute el siguiente comando para desplegar la función (no olvide modificar el nombre del bucket.

user@192 ~ % gcloud functions deploy funcion-heroes-storage-listar --entry-point listar_heroes --runtime python39 --trigger-http --allow-unauthenticated --memory 128MB --region us-central1 --timeout 60 --min-instances 0 --max-instances 1 --set-env-vars BUCKETNAME=<nombre_bucket>

Dentro del repositorio, abra la terminal y diríjase a la carpeta de la función detalle.

user@192 ~ % cd detalle

Una vez allí, ejecute el siguiente comando para desplegar la función:

user@192 ~ % gcloud functions deploy funcion-heroes-storage-detalle --entry-point detalle_heroe --runtime python39 --trigger-http --allow-unauthenticated --memory 128MB --region us-central1 --timeout 60 --min-instances 0 --max-instances 1 --set-env-vars BUCKETNAME=<nombre_bucket>

En la consola deberíamos ver un mensaje similar al anterior. Además, si vamos a cloud function, veremos que ahora tenemos publicadas tres funciones.

Para verificar la correcta configuración de la función y la configuración, puede realizar el consumo de la función a través de un cliente de consumo REST. A continuación mostraremos cómo puede realizar las distintas pruebas utilizando Postman.

Para poder realizar la prueba de las funciones, deberá importar la colección de Postman que se encuentra en la carpeta collections que se encuentra dentro del repositorio. Una vez la tenga importada, deberá configurar las variables para que pueda realizar las pruebas.

Para ello iremos a las opciones de la colección que acabamos de importar, seleccionaremos la opción "editar"

Luego en la pestaña "Variables", encontrará dos variables que debe configurar para la realización de la prueba.

Variable

Descripción

id_proyect

Se establece el valor del identificador del proyecto en el que se encuentra trabajando y en donde realizó la publicación de las funciones. Recuerde que lo puede obtener en el panel principal del proyecto o ejecutando el comando de validación del proyecto (ver sección Validación del proyecto).

region

Se debe establecer el valor de la región en donde se encuentra publicada la función. Eso lo puede obtener de función en la pestaña de "Detalles" o directamente del valor configurado en el parámetro --region de las opciones de despliegue. (Si no realizó ningún cambio al comando de publicación, la región será us-central1)

Una vez establecido los valores, presione la opción "Save".

Luego de esto, ya puede realizar peticiones a ambas funciones y debería obtener respuestas positivas.

Función crear:

Cada héroe que se creé va a generar un archivo nuevo en el bucket.

Ingrese al servicio de Cloud Storage y posteriormente a su Bucket. Encontrará que el archivo fue almacenado:

Función listar:

Los identificadores retornados deben coincidir con todos los archivos creados

Función detalle

el resultado debe ser el contenido del archivo especificado.

¡Éxitos en el desarrollo del tutorial y nos vemos en una próxima oportunidad!

[1] Google Cloud Functions monitoring and troubleshooting | Dynatrace. (2021, 7 de septiembre). Dynatrace. https://www.dynatrace.com/monitoring/technologies/google-cloud-monitoring/google-cloud-functions/?utm_source=google&amp;utm_medium=cpc&amp;utm_term=gcp%20cloud%20functions&amp;utm_campaign=latam-north-cloud-monitoring&amp;utm_content=none&amp;gclid=EAIaIQobChMImufEsKSD9QIV88uGCh0dnQCzEAAYASAAEgI1BPD_BwE&amp;gclsrc=aw.ds

[2] Cloud Functions | Google Cloud. (s. f.). Google Cloud. https://cloud.google.com/functions

[3] Google Cloud Functions y Firebase | Firebase Documentation. (s. f.). Firebase. https://firebase.google.com/docs/functions/functions-and-firebase?hl=es#:~:text=Google%20Cloud%20Functions%20es%20la,y%20el%20equipo%20de%20Firebase.

[4] Plataforma de CI/CD sin servidores de Cloud Build | Cloud Build | Google Cloud. (s. f.). Google Cloud. https://cloud.google.com/build?hl=es_419&amp;_ga=2.136207985.-1334249875.1640946770

[5] Implementa desde Cloud Console | Documentación de Cloud Functions | Google Cloud. (s. f.). Google Cloud. https://cloud.google.com/functions/docs/deploying/console?hl=es-419