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 el aprovisionamiento de recursos ni el ajuste de escala para satisfacer 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
- Functions Framework para Node.js
- Cómo crear y probar una función de HTTP de Cloud Functions de forma local
- Cómo depurar una función de HTTP desde tu máquina local
- Cómo implementar 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 versiones posteriores (para instalar Node.js, usa nvm; para verificar tu versión, ejecuta node –version)
- Completar 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 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 generar facturación. Para los fines del codelab, cada invocación de Cloud Functions cuenta para ese nivel gratuito. Siempre que te mantengas dentro de sus límites en conjunto (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 (Function as a Service) de código abierto para escribir funciones portátiles de Node.js que te proporciona 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
Mientras aceptas los valores predeterminados, asegúrate de usar index.js como punto de entrada para tu app.
Ahora instala Functions Framework para Node.js.
npm install @google-cloud/functions-framework
Abre tu package.json. Verifica que veas Functions Framework como una dependencia, como se muestra en el siguiente ejemplo.
"dependencies": {
"@google-cloud/functions-framework": "^1.7.1"
}
Functions Framework se instaló correctamente. 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 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 está todo listo para probar la función.
Prueba 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/
Para crear una segunda ventana de la terminal en VS Code, haz clic en el ícono más New Terminal en el panel de la ventana de la terminal. Alternarás entre estas dos ventanas de la terminal: la primera para entregar la función y la segunda para llamarla con curl.

Puedes alternar entre las ventanas de la terminal con el menú desplegable. Si una ventana de la terminal entrega una función, la lista desplegable se refiere a ella como node. De lo contrario, se hace referencia a zsh (o el 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 Functions:
Temperature OK
En la segunda ventana de la 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 Functions:
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 Functions:
Too hot
Lo ideal es que la función no muestre "demasiado alta" si no se proporciona ninguna temperatura. Descubriste un error en el código.
Para detener la ejecución de la función, presiona Ctrl + C en la primera ventana de la terminal que entrega la función.
5. Depura 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 elemento superior de la lista.

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

Ahora, vuelve a cargar la ventana de la terminal que usaste en VS Code para entregar tu función colocando el cursor sobre el ícono de advertencia que aparece en el extremo derecho.
Haz clic en Relaunch Terminal.

Desde la ventana de la 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 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 usas node_modules/.bin/functions-framework en lugar de node_modules/@google-cloud/functions-framework. Debes usar el ejecutable con vínculo simbólico automático 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á 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 debe iluminarse en rojo brillante, lo que indica que el depurador puede acceder a esta línea de código.

En la segunda ventana de la terminal, presiona el punto de interrupción ejecutando el siguiente comando 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.

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 instrucción.
Verás que la instrucción actual salta a la parte else de la instrucción 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 generar 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 entrega de la función.
Actualiza la función para agregar una instrucción if que genere 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 Functions con el siguiente comando sin la marca –inspect para evitar conectar el depurador.
node node_modules/@google-cloud/functions-framework --target=validateTemperature
Para verificar que se genere 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 que se muestra en tu solicitud:
Temperature is undefined
En la primera ventana de la terminal, también verás el error registrado por 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, ya está todo listo para 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 nombrevalidateTemperaturecon 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 implementó correctamente verificando la respuesta adecuada.
Temperature OK
7. Limpia
Para evitar cargos involuntarios, por ejemplo, si esta Cloud Function se invoca de forma involuntaria más veces que tu 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.

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. Puedes ver la lista de todos los proyectos disponibles ejecutando 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
- Functions Framework para Node.js
- Cómo crear y probar una función de HTTP de Cloud Functions de forma local
- Cómo depurar una función de HTTP desde tu máquina local
- Cómo implementar una función de HTTP desde tu máquina local