Desarrollo local con Cloud Functions para Node.js con Visual Studio Code

1. Descripción general

Google Cloud Functions es una plataforma de procesamiento sin servidores controlada por eventos. Cloud Functions te permite escribir tu código sin preocuparte por aprovisionar recursos ni escalar para controlar los requisitos cambiantes.

Las funciones de Cloud Functions escritas en JavaScript se ejecutan en un entorno de Node.js en Google Cloud Platform. Puedes ejecutar tu Cloud Function en cualquier entorno de ejecución estándar de Node.js para habilitar la portabilidad y las pruebas locales.

Explicación

En este codelab, crearás una Cloud Function para Node.js que informe si una temperatura especificada es aceptable o demasiado alta. Crearás, probarás y depurarás tu Cloud Function con Visual Studio Code en tu máquina local. Por último, implementarás tu función en Google Cloud Platform.

Qué aprenderás

  • Es Functions Framework para Node.js.
  • Crea y prueba una función de HTTP de Cloud Functions de forma local.
  • Depura una función HTTP desde tu máquina local.
  • Implementa una función HTTP desde tu máquina local.

2. Configuración y requisitos

Requisitos previos

Costos

Si bien este codelab solo requiere 1 invocación de una Cloud Function implementada, debes consultar la información sobre los precios de la API de Cloud Functions para comprender cómo funciona la facturación.

Si bien muchas APIs de Google se pueden usar sin cargo, el uso de Google Cloud Platform (es decir, sus productos y APIs) no es gratuito. Necesitarás una cuenta de facturación activa para usar Cloud Functions. Ten en cuenta que ciertos productos de Google Cloud Platform (GCP) incluyen un nivel"Siempre gratuito" que debes superar para que se te facture. Para los fines del codelab, cada invocación de Cloud Functions se contabiliza para ese nivel gratuito. Siempre y cuando te mantengas dentro de sus límites de forma agregada (dentro de cada mes), no deberías incurrir en ningún cargo.

3. Instala Functions Framework para Node.js

El Functions Framework para Node.js es un framework de FaaS (función como servicio) de código abierto para escribir funciones portátiles de Node.js que te ofrece el equipo de Google Cloud Functions.

Functions Framework te permite escribir funciones ligeras que se ejecutan en muchos entornos diferentes, incluidos los siguientes:

  • Google Cloud Functions
  • Tu máquina de desarrollo local
  • Cloud Run y Cloud Run en GKE
  • Entornos basados en Knative

Crea una nueva app de Node.js.

npm init

Cuando aceptes los valores predeterminados, asegúrate de usar index.js como punto de entrada de tu app.

Ahora instala Functions Framework para Node.js.

npm install @google-cloud/functions-framework

Abre tu package.json. Verifica que el framework de Functions aparezca como una dependencia, como se muestra en el siguiente ejemplo.

"dependencies": {
   "@google-cloud/functions-framework": "^1.7.1"
 }

Functions Framework se instaló correctamente. Ya puedes crear tu Cloud Function.

4. Crea y prueba una función de HTTP de Cloud Functions de forma local

Crea una Cloud Function local

En esta sección, crearás y probarás una función de HTTP que responda a solicitudes HTTP.

Crea un archivo nuevo llamado index.js en el mismo directorio que tu archivo package.json.

Agrega lo siguiente:

exports.validateTemperature = async (req, res) => {
 try {
   if (req.body.temp < 100) {
     res.status(200).send("Temperature OK");
   } else {
     res.status(200).send("Too hot");
   }
 } catch (error) {
   //return an error
   console.log("got error: ", error);
   res.status(500).send(error);
 }
};

Ya puedes probar la función.

Cómo probar la función en Visual Studio Code

A partir de este punto, este codelab usa la terminal integrada en Visual Studio Code.

En Visual Studio Code, abre una ventana de la terminal.

Ejecuta el siguiente comando:

node node_modules/@google-cloud/functions-framework --target=validateTemperature

Este comando inicia un servidor local que está listo para llamar a la función validateTemperature cuando el servidor recibe una solicitud HTTP.

Deberías ver el siguiente resultado en la ventana de la terminal:

Serving function...
Function: validateTemperature
URL: http://localhost:8080/

Haz clic en el ícono de signo más New Terminal en el panel de la ventana de Terminal para crear una segunda ventana de terminal en VS Code. Alternarás entre estas dos ventanas de la terminal: la primera para publicar la función y la segunda para llamarla con curl.

bceb65f366d837ae.png

Puedes cambiar entre ventanas de terminal con el menú desplegable. Si una ventana de terminal está ejecutando una función, la lista desplegable se refiere a ella como node. De lo contrario, se hace referencia a zsh (o a la shell que estés usando).

En la segunda ventana de la terminal, ejecuta el siguiente comando para enviar una carga útil de temperatura de 50 al servidor local que entrega la función validateTemperature.

curl -X POST http://localhost:8080 -H "Content-Type:application/json"  -d '{"temp":"50"}'

Deberías recibir la siguiente respuesta de la función de Cloud:

Temperature OK

En la segunda ventana de terminal, vuelve a probar la función enviando una carga útil de temperatura "demasiado alta", como se muestra a continuación:

curl -X POST http://localhost:8080 -H "Content-Type:application/json"  -d '{"temp":"120"}'

Deberías recibir la siguiente respuesta de la función en la nube:

Too hot

Por último, prueba la función llamándola con una carga útil faltante.

curl -X POST http://localhost:8080

Deberías recibir la siguiente respuesta de la función en la nube:

Too hot

Lo ideal sería que la función no devolviera "demasiado caliente" si no se proporciona ninguna temperatura. Descubriste un error en el código.

Asegúrate de detener la ejecución de la función presionando Ctrl + C en la primera ventana de la terminal que entrega tu función.

5. Depura una función HTTP desde tu máquina local

Abre la paleta de comandos en Visual Studio Code. Si usas una Mac, presiona Cmd + Shift + P. Si usas Windows, usa Ctrl + Shift + P..

Escribe auto attach en la paleta de comandos y elige el primer elemento de la lista.

601e542b4ec9f6f9.png

Para este codelab, elige Only With Flag, como se muestra en la siguiente imagen:

b9e6b762d150e62b.png

Ahora, vuelve a cargar la ventana de la terminal que usaste en VS Code para entregar tu función. Para ello, coloca el cursor sobre el ícono de advertencia que aparece en el extremo derecho.

Haz clic en Relaunch Terminal.

37b61e3fb546fc76.png

Desde la ventana de terminal recargada, vuelve a ejecutar Functions Framework para entregar tu función con el siguiente comando:

node --inspect node_modules/.bin/functions-framework --target=validateTemperature

donde la marca --inspect le indica a Node.js que espere un cliente de depuración. Para obtener más información, consulta la documentación de Node sobre la depuración.

Ten en cuenta que usas node_modules/.bin/functions-framework en lugar de node_modules/@google-cloud/functions-framework. Debes usar el ejecutable vinculado simbólicamente de forma automática en /node_modules/.bin para usar el modo de inspección.

Esta vez, deberías ver una barra de estado naranja en VS Code que indica que el depurador está adjunto.

Haz clic dentro del margen a la izquierda del número de línea para establecer un punto de interrupción en la línea 3.

2fbb4d5916e1dbfa.png

El ícono de punto de interrupción debería iluminarse en rojo brillante, lo que indica que el depurador puede acceder a esta línea de código.

846e6c5993cc87f9.png

En la segunda ventana de la terminal, presiona el punto de interrupción ejecutando el siguiente comando de curl.

curl -X POST http://localhost:8080 

Verás un resaltado amarillo sobre la línea 3. Este resaltado indica que esta línea es la instrucción actual que evalúa el depurador.

206c7ed1eb189e90.png

Coloca el cursor sobre la variable temporal para verificar que su contenido sea undefined, ya que la solicitud no proporcionó una carga útil de temperatura.

97979025f4bf2842.png

Haz clic en el ícono de paso por encima para ejecutar la siguiente instrucción.

Verás que la instrucción actual salta a la parte else de la instrucción if.

cf0e8ce7e0388f98.png

Para esta demostración, puedes suponer que la especificación requiere que todas las solicitudes envíen una lectura de temperatura. En el caso improbable de que no se proporcione una lectura de temperatura, la función debe arrojar una excepción.

Haz clic en el botón Desconectar para desconectar el depurador.

1070d059775ad769.png

En la primera ventana de la terminal, presiona Ctrl + C para detener la ejecución de la función.

Actualiza tu función para agregar una sentencia if que arroje una excepción si la temperatura no está definida, como se muestra a continuación:

exports.validateTemperature = async (req, res) => {

 try {

   // add this if statement below line #2
   if (!req.body.temp) {
     throw "Temperature is undefined";
   }

 ...

En la primera ventana de la terminal, vuelve a ejecutar tu función de Cloud con el siguiente comando sin la marca –inspect para evitar adjuntar el depurador.

node node_modules/@google-cloud/functions-framework --target=validateTemperature

Para verificar que se arroje una excepción, ejecuta el siguiente comando en la segunda ventana de la terminal:

curl -X POST http://localhost:8080 

Deberías ver el siguiente resultado de tu solicitud:

Temperature is undefined

En la primera ventana de la terminal, también verás el error que registró tu función.

Serving function...
Function: validateTemperature
URL: http://localhost:8080/
got error:  Temperature is undefined

Ahora puedes detener la ejecución de la función presionando Ctrl + C en la primera ventana de la terminal.

6. Implementa una función de HTTP desde tu máquina local en Google Cloud

Ahora que creaste, probaste y depuraste una Cloud Function en tu máquina local, puedes implementarla en Google Cloud.

Para verificar que estás usando el proyecto que creaste en el paso 2 de forma local, ejecuta el siguiente comando:

gcloud config get-value project

Si el proyecto que especificaste en el paso 2 no es la configuración activa, ejecuta el siguiente comando:

gcloud config set project <project-name-created-step-2>

En cualquier ventana de la terminal, ejecuta el siguiente comando:

gcloud functions deploy validateTemperature --trigger-http --runtime nodejs12 --allow-unauthenticated

donde los parámetros se explican de la siguiente manera:

  • deploy validateTemperature: Es el subcomando de gcloud para implementar una Cloud Function con el nombre validateTemperature y un punto de entrada llamado validateTemperature.
  • --trigger-http: Es el tipo de evento activador.
  • --runtime nodejs12: Es el entorno de ejecución objetivo para esta función.
  • --allow-unauthenticated: Permite el acceso público para llamar a la función.

Se te pedirá que habilites las APIs de Cloud Functions. Escribe y para habilitar las APIs.

API [cloudfunctions.googleapis.com] not enabled on project 
[1057316433766]. Would you like to enable and retry (this will take a 
few minutes)? (y/N)? y 

Una vez que se complete la implementación, verás lo siguiente en el resultado:

Deploying function (may take a while - up to 2 minutes)...done. 
availableMemoryMb: 256
buildId: <your-build-id>
entryPoint: validateTemperature
httpsTrigger:
  url: https://<your-region-and-project>.cloudfunctions.net/validateTemperature
...

En la ventana de la terminal, usa curl para llamar a este extremo público.

curl -X POST https://<your-region-and-project>.cloudfunctions.net/validateTemperature -H "Content-Type:application/json"  -d '{"temp":"50"}'

y confirma que tu función de Cloud Functions se implementó correctamente verificando la respuesta adecuada.

Temperature OK

7. Limpia

Para evitar cargos involuntarios, por ejemplo, si se invoca esta Cloud Function de forma involuntaria más veces que la asignación mensual de invocaciones de Cloud Functions en el nivel gratuito, puedes borrar la Cloud Function o el proyecto que creaste en el paso 2.

Para borrar la Cloud Function, ve a la consola de Cloud Functions en https://console.cloud.google.com/functions/. Asegúrate de que el proyecto que creaste en el paso 2 sea el proyecto seleccionado actualmente.

Selecciona la función validateTemperature que implementaste en el paso 6. Luego, presiona Borrar.

4dada486485a935a.png

Si decides borrar todo el proyecto, puedes ir a https://console.cloud.google.com/cloud-resource-manager, seleccionar el proyecto que creaste en el paso 2 y elegir Borrar. Si borras el proyecto, deberás cambiar de proyecto en el SDK de Cloud. Para ver la lista de todos los proyectos disponibles, ejecuta gcloud projects list.

8. ¡Felicitaciones!

Felicitaciones por completar el codelab. Puedes obtener más información sobre cómo Cloud Functions admite el entorno de ejecución de Node.js y cómo funciona la depuración local con Cloud Functions.

Temas abordados

  • Es Functions Framework para Node.js.
  • Crea y prueba una función de HTTP de Cloud Functions de forma local.
  • Depura una función HTTP desde tu máquina local.
  • Implementa una función HTTP desde tu máquina local.