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 o 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
- Framework de funciones para Node.js.
- Crea y prueba una función de HTTP de Cloud Functions de forma local.
- Depurar una función HTTP desde tu máquina local
- Implementa una función de HTTP desde tu máquina local.
2. Configuración y requisitos
Requisitos previos
- SDK de Cloud
- Visual Studio Code
- Node.js 8.6.0 o una versión posterior (para instalar Node.js, usa nvm; para verificar la versión, ejecuta node –version)
- Haber completado la guía Mi primera función: Node.js
Costos
Aunque 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 tarifas, 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 algunos productos de Google Cloud Platform (GCP) tienen un nivel"Siempre gratis" que debes superar para generar facturación. A los efectos del codelab, cada invocación de Cloud Functions se registra en ese nivel gratuito. Siempre que no superes los límites en total (dentro de cada mes), no deberías incurrir en ningún cargo.
3. Instala Functions Framework para Node.js
El framework de Functions 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 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 archivo package.json. Verifica que veas el framework de funciones como una dependencia, como se muestra en el siguiente ejemplo.
"dependencies": { "@google-cloud/functions-framework": "^1.7.1" }
Se instaló correctamente Functions Framework. Ya está todo listo para 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 HTTP que responda a las solicitudes HTTP.
Crea un archivo nuevo llamado index.js
en el mismo directorio que el archivo package.json.
Agrega las siguientes:
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 está todo listo para 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 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/
Para crear una segunda ventana de terminal en VS Code, haz clic en el ícono de signo más New Terminal
en el panel de la ventana de Terminal. Cambiarás entre estas dos ventanas de la terminal: la primera para entregar la función y la segunda para llamar a la función con curl.
Puedes alternar entre las ventanas de la terminal con el menú desplegable. Si una ventana de la terminal está a la par de una función, la lista desplegable se refiere a ella como node
. De lo contrario, se hace referencia a zsh
(o la shell que usas).
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 de Cloud:
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 de Cloud:
Too hot
Idealmente, la función no debería mostrar el mensaje "demasiado caliente" si no se proporciona una temperatura. Encontraste 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 la entrega.
5. Cómo depurar una función de HTTP desde tu máquina local
Abre la paleta de comandos en Visual Studio Code. Si usas una Mac, usa 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.
Para este codelab, elige Only With Flag
como se muestra en la siguiente imagen:
Ahora, coloca el cursor sobre el ícono de advertencia que aparece en el extremo derecho para volver a cargar la ventana de la terminal que usaste en VS Code para entregar tu función.
Haz clic en Relaunch Terminal
.
Desde la ventana de la terminal recargada, vuelve a ejecutar el framework de funciones 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 escuche 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 estás usando node_modules/.bin/functions-framework en lugar de node_modules/@google-cloud/functions-framework. Para usar el modo de inspección, debes usar el ejecutable con symlink que se crea automáticamente en /node_modules/.bin.
Esta vez, deberías ver una barra de estado naranja en VS Code que indica que el depurador está conectado.
Para establecer un punto de interrupción en la línea 3, haz clic dentro del margen a la izquierda del número de línea.
El ícono de punto de interrupción debería iluminarse de color rojo brillante, lo que indica que el depurador puede acceder a esta línea de código.
En la segunda ventana de la terminal, ejecuta el siguiente comando curl para llegar al punto de interrupción.
curl -X POST http://localhost:8080
Verás que aparece un resaltado amarillo sobre la línea 3. Esta acción de destacar indica que esta línea es la sentencia actual que el depurador está evaluando.
Coloca el cursor sobre la variable temp para verificar que su contenido sea undefined
, ya que la solicitud no proporcionó una carga útil de temperatura.
Haz clic en el ícono de paso para ejecutar la siguiente sentencia.
Verás que la sentencia actual salta a la parte else de la sentencia if.
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.
En la primera ventana de la terminal, presiona Ctrl + C
para detener la ejecución de la función.
Actualiza la 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 la función de Cloud con el siguiente comando sin la marca –inspect para evitar conectar el depurador.
node node_modules/@google-cloud/functions-framework --target=validateTemperature
Ejecuta el siguiente comando en la segunda ventana de terminal para verificar que se arroje una excepción:
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 HTTP desde tu máquina local a Google Cloud
Ahora que creaste, probaste y depuraste una Cloud Function en tu máquina local, ya puedes implementarla en Google Cloud.
Ejecuta el siguiente comando para verificar que estés usando el proyecto que creaste en el paso 2 de forma local:
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 nombrevalidateTemperature
con un punto de entrada llamadovalidateTemperature
.--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 haya implementado correctamente verificando la respuesta adecuada.
Temperature OK
7. Realiza una limpieza
Para evitar cargos imprevistos, p.ej., si esta Cloud Function se invoca por error más veces que tu asignación mensual de invocaciones de Cloud Function en el nivel gratuito, puedes borrar la Cloud Function o el proyecto que creaste en el paso 2.
Para borrar la función de Cloud Functions, 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.
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 los proyectos en tu SDK de Cloud. Para ver la lista de todos los proyectos disponibles, ejecuta gcloud projects list.
8. ¡Felicitaciones!
Felicitaciones por completar el codelab. Obtén 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
- Framework de funciones para Node.js.
- Crea y prueba una función de HTTP de Cloud Functions de forma local.
- Depurar una función HTTP desde tu máquina local
- Implementa una función de HTTP desde tu máquina local.