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?
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?
- Descargamos e instalamos el Google Cloud SDK
- Autentificamos con el SDK usando
gcloud init
, el cual va a preguntar que proyecto queremos usar y un par de preguntas Si/No. - 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