Explorando Serverless - Cloud Functions

Google Cloud Functions es una solución informática ligera, asíncrona y basada en eventos que permite crear funciones pequeñas de un solo propósito que responden a eventos en la nube, sin tener que administrar servidores ni entornos de tiempo de ejecución. Los eventos de Google Cloud Storage y Google Cloud Pub/Sub pueden activar Cloud Functions tanto de forma asíncrona como síncrona (para esta última, se necesita una invocación HTTP).

Cloud Functions está en estado beta, le falta mucho por crecer pero siempre es interesante explorar nuevas tecnologías

Cloud Functions ejecuta tu código sobre una versión LTS de NodeJS, empezando con v6 LTS.

¿Cómo usar functions-emulator?

¿Cómo usar Cloud Functions?


Antes de empezar

Vamos al panel de control, habilitamos facturación o usamos la prueba gratis que nos da $300 para usar en 12 meses (al momento de esta entrada).

Google Cloud Platform (GCP) nos da un de Free Tier de Cloud Functions que mensualmente nos brinda:

  • 2 millones de invocaciones
  • 400,000 GB-seconds y 200,000 GHz-seconds de tiempo calculado
  • 5GB de trafico de salida

Características de Cloud Functions

  • Mensajes a topics de Cloud Pub/Sub
  • Peticiones HTTPS
  • CRUD en un bucket de Cloud Storage
  • Deploy desde un repo de Git o Bitbucket con Cloud Source Repositories
  • Invocación de Firebase
  • Monitorieo, debugging y logging

Casos Prácticos

  • Backend con Firebase
  • API y microservicios
  • Procesamiento de datos/ETL
  • Webhooks
  • IoT

functions-emulator

Antes de desplegar, necesitamos testear nuestras funciones y asegurarnos que se ejecuten de misma manera siempre. Para evitar estar esperando tiempo de desplegar podemos usar functions-emulator(alpha), un emulador de Cloud Functions local.

functions-emulator, nos permite desplegar, ejecutar y debug nuestras funciones en nuestra maquina local antes que desplegar a testeo y producción.

Instalación

Ya sea con npm o yarn:

npm install -g @google-cloud/functions-emulator  
yarn global add @google-cloud/functions-emulator  

Ahora tenemos functions instalado globalmente. Verificamos en nuestra terminal:
Nota: Si usas zsh debes usar functions-emulator o agregar un alias (en tu .zshrc) más corto.

functions --help  
functions-emulator --help  

¿Cómo usar
functions-emulator?

Escribimos una función:

mkdir ejemploGET  
cd ejemploGET  
touch index.js  
echo 'exports.ejemploGET = (req, res) => res.send("Pong!");' > index.js  

Iniciamos el emulador:

functions-emulator start  

Desplegas tu función
Si estas en el mismo dir:

functions-emulator deploy ejemploGET --trigger-http  

Desde un dir en específico:

functions-emulator deploy ejemploGET --trigger-http --local-path=~/miFuncion  

Invocamos la función
Podemos usar Postman para guardar guardar las solicitudes (request) o desde la terminal:

functions-emulator call ejemploGET  

Si tenemos que mandar información usamos el commando call --data que mandará un HTTP POST request en donde el POST body va a contener el valor de --data:

functions-emulator call holaMundo --data='{"message": "Hola, Mundo"}'  

En donde la función puede ser:

// holaMundo/index.js
exports.holaMundo = (req, res) => {  
  if (req.body.message === undefined) {
    res.status(400).send('No hay mensaje');
  } else {
    res.send(req.body.message).status(200).end();
  }
}

Vemos el log

functions-emulator logs read  

Terminar por fuerza
Si en algún dado caso el emulador deja de funcionar y debemos detenerlo a fuerza

functions-emulator kill  

¿Cómo usar Cloud Functions?

  1. Descargamos e instalamos el Google Cloud SDK
  2. Autentificamos con el SDK usando gcloud init, el cual va a preguntar que proyecto queremos usar y un par de preguntas Si/No.
  3. Instalamos Node.js si todavía no lo tenemos.

Preparamos la aplicación
Creamos un cubo en Cloud Storage para almacenar las Cloud Functions

gsutil mb gs://[NOMBRE_DE_CUBO]  

Creamos un dir local

mkdir ~/gcf  
cd ~/gcf  

Escribimos una función

mkdir ejemploGET  
cd ejemploGET  
touch index.js  
echo 'exports.ejemploGet = (req, res) => res.send("Pong!");' > index.js  

Desplegamos
Navegamos al dir de nuestra función:

cd ejemploGET  
gcloud beta functions deploy ejemploGET --stage-bucket [NOMBRE_DEL_CUBO] --trigger-http  

Invocamos la función

curl "https://[REGION]-[ID_DEL_PROYECTO].cloudfunctions.net/ejemploGET"  

Si todavía vas a seguir explorando será mejor usar el mismo proyecto pero para evitar gastos innecesarios por los recursos usados en este tutorial debemos eliminar el proyecto.

Eliminar una función
Bien puedes navegar a la GCP Console o sino:

gcloud beta functions delete [NOMBRE_DE_FUNCION]  



Fuentes
https://cloud.google.com/functions/
https://console.cloud.google.com/functions/
https://cloud.google.com/functions/docs/emulator
https://cloud.google.com/functions/docs/tutorials/http