Google Cloud Functions Al Desnudo, Casos, Costos, Ventajas/Desventajas

Adamo Jordan Figueroa
8 min readOct 18, 2019

--

Nota del autor, Mayo/2020 : Hola, estoy comenzando un canal de youtube, (clic aquí) explicaré a detalle más productos de GCP, suscríbete será muy interesante

Bien las Cloud Functions comienzan ser populares, sin embargo habrá quien jamas ha escuchado de ellas y hay que las conoce pero no saben como sacarle provecho, por eso te lo voy a explicar, esta gran tecnología que esta esperando a ser explotada.

¿Qué es una Cloud Function?

Simplemente la ejecución en la nube de un fragmento de código que reacciona a un evento.

Los lenguajes posibles de programación hasta ahora son JavaScript, Python y Go.

Los eventos a las que reaccionan los podemos dividir en 2,
Internos: los que solo funcionan dentro de Google Cloud y Firebase.
Externos: básicamente peticiones http desde cualquier sistema.

Ahora bien vamos a ver unos ejemplos:

  • Al subir, editar o eliminar un archivo en Cloud Storage
    Por ejemplo, puedes saber cuando se sube un archivo a tu almacén, si fuera una imagen podrías procesarla para obtener una versión en miniatura.
    También procesar un archivo excel al momento de cargarse, obtener los datos y actualizar los campos en una base de datos.
  • Inicio de sesión en Firebase Auth
    En el momento exacto en que tu usuario se autentifica, puedes calcular sus movimientos y enviar una notificación o correo ofreciéndole alguna promoción.
  • Mensajes Internos de Tu arquitectura con Pub/Sub
    Cada vez que sucede algo como una falla puedes enviar correos de forma automática explicando que se tienen problemas y se resolverán; o cuando se llega a una cantidad de productos vendidos, generar un reporte con las ganancias .

Estos eventos suceden dentro de la nube de Google y requieren que tengas un cierto nivel de experiencia en Google Cloud y tal vez proyecto robusto y con gran potencial para crecer para que valga la pena su implementación.

Sin embargo también tenemos otro tipo de eventos, los que reaccionan a peticiones web http, esta es quizás la razón por la que estas leyendo este articulo.

  • Petición Web Http.

Nos permite desplegar nuestro código y tenerlo listo para cualquier usuario.

Esto nos provee un servicio web desplegado en una cloud function.

¿Cuándo y porque usar una Cloud?

  • No quieres pagar ni un centavo hasta que tu demanda sea muy grande
  • Para prototipar algo y tenerlo en linea lo más rápido posible
  • Complementar con Firebase, Firestore, autentificación y otros productos compatibles
  • Complementar con Google Cloud, reaccionar a un evento Pub/Sub de tu arquitectura
  • Para procesar un archivo
  • Quieres algo fácil , no quieres configurar nada
  • Arquitectura microservicio

Cuando No usar una Cloud Function

  • Cuándo hay un procesamiento masivo o procesos bash
  • Cuándo supera el limite de tiempo de ejecución que son 9 min
  • Necesitas una maquina mas grande que 2.4 Ghz y no son suficientes 2GB de memoria RAM
  • Tu sistema se diseñó con una arquitectura monolítica
  • Cuanto implementar tus proyecto completo te puede llevar a desplegar una Cloud Function por cada servicio

Como funciona internamente

Todo está construido sobre eventos Pub/Sub preconfigurados, tu Cloud Function al final será una única función que recibirá los parámetros del evento que sucedió

Vamos a ver un ejemplo con JavaScript, la siguiente función recibe como parámetro el evento que se genera al cargar un archivo de Cloud Storage.

function helloGoogleCloudStorage(event, context){
console.log(`Se creó el archivo : ${event.name} a las
${event.timeCreated} en el bucket ${event.bucket}`);
};
exports.helloGoogleCloudStorage = helloGoogleCloudStorage

Bien es una función normal que recibe 2 parámetros, por supuesto event es un objeto que contiene la información del archivo de Cloud Storage, como su nombre, donde se guardó, a que hora, link de descarga etc. la variable context contiene información sobre el ambiente de ejecución Google Cloud, su uso es para situaciones muy especificas.

Al activarse producirá como salida un log o registro con el siguiente texto.
Se creó el archivo imagen.png a las 2019–10–15T03:07:09 en el bucket my-proyecto-gcp.appspot.com

Si observamos exports es una variable especial de Node que sirve para exportar funciones de un modulo.

¡Aja! Entonces algún otro módulo o programa tiene que importar esta función para poder ejecutarla, y aquí está el secreto, quien ejecuta en realidad la función será un framework preconfigurado que importa la función y la llama enviándole los parámetros en el caso de Node este framework es express, para Python será Flask, y Go utiliza una biblioteca propia del lenguaje.

Entonces una petición web se vería así

exports.helloWorld = (req, res) => {
let message = req.query.message || req.body.message || ‘Hello World!’;
res.status(200).send(message);
};

Los parámetros req, y res, son en realidad los conocidos parámetros request y response que recibe express, que a su vez es el estandar de solicitudes http.

¿Entonces es un único servicio web por cada Cloud function?

Sí, pero… también hay trucos, una función podría a su vez clasificar el tipo de request y enviarla a otras funciones dependiendo el método http y sus paths.

Así que en realidad siendo muy astuto si tu proyecto tiene multiples servicios y los sabes manejar a bajo nivel, (muchos If dependiento los datos de la solicitud) puedes subirlo a una única Cloud Function , Este proceso con Node es relativamente más fácil, ya que express lo facilita mucho, incluso podrías subir un proyecto de Nest Js (Framework web con TypeScript), con Python y Go se complica.

Costos reales de una Cloud Function

Todo Inicia con la pregunta, ¿Cuánto cuesta? Respuesta: es completamente gratis, hasta rebasar el limite Mensual, Google nos ofrece la Maravillosa cantidad de:

¡2 Millones de invocaciones!

o el límite de las letras chiquitas, haber utilizado 400,000 GB de memoria RAM, o haber tenido un procesamiento de 200,000 GHZ o haber transferido mas de 5 GB por la de red.

Después se cobrará cada 0.1 segundos de ejecución adicional, dependiendo de la maquina configurada, se utilizará la siguiente tarifa.

Recuerda el costo aplica después de agotar tus recursos mensuales, el cobro será por tiempo de asignación de recursos, no importando si se utilizaron al 100% o no, es decir google te presta 2 GB de memoria pero tu Cloud Function solo utiliza 100 MB cada vez que se ejecuta, entonces aunque tengas 1.9 GB inservibles será la tarifa de 2 GB la que aplique, la información la tienes aqui https://cloud.google.com/functions/pricing

Probablemente este es el punto donde comenzarías a incomodarte porque no sabes a qué se refiere cada condición, ni cuánto pagarás en realidad, pues yo te lo explico en el siguiente análisis.

Análisis Ficticio de costos

Hasta el día de hoy las Cloud Functions NO permiten personalizar los recursos, ejemplo, no puedes solicitar 2GB de RAM con un procesador de 800 MHz, mas bien tienes que elegir un paquete, esto hace que siempre se llegue al limite de procesamiento de 200,000 GHz antes que 400,000 GB de memoria, esto significa que, si tomo la maquina mas grande con 2 GB memoria y 2.4 GHz , suponiendo que he utilizado los recursos por 100,000 segundos, habré utilizado 200,000 GB memoria y 240,000 GHz procesamiento, tomando en cuenta los limites mencionados, vemos que ya me pasé por 40,000 GHz y ahora los tendríamos que pagar, lo mismo aplica para cada maquina preconfigurada, con con el tiempo tal vez Google nos permita personalizar la maquina, por ahora vamos a seguir con la premisa siguiente: “Siempre rebasaremos primero el límite de GHz de CPU”.

Para entender si Google nos miente, vamos a hacer las operaciones para 2 casos, que utilizan diferentes tiempos de procesamiento, que si bien para un usuario normal son tiempos algo exagerados, para algunos otros serán tiempos complemente posibles

Caso 1: Petición Rest

La Cloud Function hace una petición a la base a la base de datos y regresa los resultados en un Json, este proceso tarda 1 segundo.

Caso 2: Procesamiento de Excel

La Cloud Function procesa un archivo Excel en un Dataframe, hace una limpieza de datos con Pandas de Python y luego sube los resultados a multiples bases de datos, este proceso tarda 15 segundos.

El objetivo es encontrar cuál es el número de llamadas que podemos realizar para gastar los 200,000 GHz antes de que empiece a cobrar

Ejemplo con la maquina mas pequeña RAM: 128 MB GPU: 200MHz

Ya que el procesador corre a una velocidad 200 MHz o 0.2 GHz por segundo, usando una simple regla de 3 podemos ver que con la maquina más pequeña podríamos hacer 1 millón de llamadas gratis, antes de agotar 200,000 GHz

Llamadas Caso 1= (200,000 GHz ) / (.2 GHz * 1s) = 1,000,000 llamadas

Llamadas Caso 2= (200,000 GHz ) / (.2 GHz * 15s) = 66,666 llamadas

Ejemplo con una maquina de RAM: 2048 MB CPU: 2.4 GHz

Los mismos casos, mismos tiempos pero ahora vamos con la maquina más potente que nos ofrecen para las Cloud Functions, y recuerda que es un ejemplo demostrativo, ya que si en realidad procesáramos exactamente lo mismo, ciertamente el tiempo es menor mientras más potente es el procesador.

Llamadas Caso 1= (200,000 GHz ) / (.200 GHz * 1s) = 83,333

Llamadas Caso 2 = (200,000 GHz ) / (2.4 GHz * 15s) = 5,555

Conclusiones

En el caso 1, con la maquina mas lenta llegamos a la mitad, 1 millón, y con la más rápida tendríamos 83,333, con nuestros casos ficticios intentando exagerar tiempos.

¿Entonces es falso que me dan 2 millones de llamadas? La respuesta es NO, es muy posible llegar a 2 millones esto porque en general el tiempo para consultar datos de una base, no pasa de 0.4 seg

¿Aún así me estan regalando mucho o poco ?
Todo depende de que quieras hacer el numeró de peticiones más bajo son 5,555 llamadas por mes, pero considera que procesar archivos usualmente son tareas que se hacen una vez por día.

¿Entonces me van a cobrar bastante, si me paso? No, aún rebasando el limite, los costos son muy bajos, regresando al caso 1, la maquina mas potente cobraría 0.0000029 por 1 segundo de ejecución, una llamada en nuestro ejemplo, para pagar el primer dólar tendrías que recibir 34,500 peticiones.

Ok ya entiendo las ventajas ¿Cómo inicio, puedo desplegar mi aplicación completa? Es muy fácil, en el próximo articulo detallaré la solución a estas preguntas.

¿Entonces ya puedo estar seguro de cuánto voy gastar? No, siempre depende de la naturaleza de tu aplicación, a veces consumirá mas recursos, ademas para fines demostrativos se obvió el limite de red. Si tu código transfiere o responde con Jsons gigantescos son kilobytes de trasferencia que pueden ir afectando el costo.

--

--

Adamo Jordan Figueroa
Adamo Jordan Figueroa

Written by Adamo Jordan Figueroa

Full stack developer / Cloud Architect

No responses yet