Cómo automatizar un script de Python en Google Cloud

Share on linkedin
Share on twitter
Share on email

Poder automatizar tus scripts de Python es algo fundamental para poder sacar el máximo partido a nuestros scripts. Al fin y al cabo, muchos procesos se deben repetir recurrentemente, y no tiene sentido que estemos pendientes de ejecutar código. Esto podría aplicarse desde procesos ETL hasta la puesta en producción en batch de modelos.

Una de las formas más típicas de automatizar un script es automatizándolo en local… pero eso tiene un problema: tu ordenador debe estar encendido para que funcione.

Por eso, hoy vamos a aprender cómo automatizar un script de Python en Google Cloud, para que la automatización funcione siempre, aunque nos vayamos de vacaciones. Suena interesante, ¿verdad? ¡Pues vamos a ello!

Cómo automatizar un script de Python en Google Cloud

Creando nuestro script en Python a automatizar

Lo primero, para automatizar un script… debemos tener un script. En este caso vamos a hacer algo bastante común: extraer datos de una API y subirlos a una base de datos. Es algo muy típico que suele hacerse en procesos ETL.

Para ello, he creado una base de datos gratuita en Heroku. Esta base de datos es Postgre y, de cara a la automatización, la tabla ya está creada, solo tenemo que añadir datos nuevos.

En cualquier caso, la idea es la siguiente: vamos a extraer la posición (latitud, longitud, etc.) de todos los aviones en circulación mediante la API de OpenSky y subirlos a nuestra base detos. Esto es algo que tendríamos que hacer, por ejemplo, si queremos visualizar la evolución de la posición de los aviones.

El script que vamos a automatizar es el siguiente:

import requests
import pandas as pd
from sqlalchemy import create_engine


url = "https://opensky-network.org/api/states/all"
response = requests.get(url)
data = response.json()
df = pd.DataFrame(data['states'])

columns = [
    'icao24','callsign','origin_country','time_position','last_contact',
    'longitude','latitude','baro_altitude','on_ground','velocity','true_track',
    'vertical_rate','sensors','geo_altitude','squawk','spi','position_source'
]
df.columns = columns

# Nos quedamos solo con 20 filas para no sobrepasar el limite gratuito de la bbdd
df = df.iloc[0:20,:]

host = 'XXX-XX-XXX-XXX-XXX.eu-west-1.compute.amazonaws.com'
db = "xxxxxxxxxxxxxxx"
user = "xxxxxxxxxxxxxxx"
pasw = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

engine = create_engine('postgres://xxxxxxxxxxxxxxx:xxxxxxxxxxxxxxx@xxx-xx-xxx-xxx-xxx.eu-west-1.compute.amazonaws.com:5432/xxxxxxxxxxxxxxx')
df.to_sql('flights', engine,if_exists='append')

Con esto ya podemos ver cómo automatizar nuestro script de Python en Google Cloud. ¡Vamos a ello!

Configurando nuestra función en Cloud Functions

Cloud Functions es un servicio de Google Cloud que permite ejecutar funciones de Python en la nube y sin servidor (lo gestionan ellos).

Además, podemos elegir dos cosas muy interesantes:

  1. En qué servidores de Google Cloud se guardará la función. El poder elegir la ubicación del servidor obtendrás un menor tiempo de respuesta.
  2. El activador de la función. Tenemos diferentes activadores disponibles, desde un punto HTTP hasta un topic de Pub/Sub.

En nuestro caso elegiremos un topic de Pub/Sub como activador ya que hará que la automatización sea más fácil y segura. Me explico: si elegimos las llamadas HTTP, deberemos elegir si la llamada requerirá de credenciales o no. Lo ideal es que la llamada requiera credenciales, ya que, sino, cualquiera podría invocarla y no queremos eso.La cuestión es que, si elegimos que la llamada requiera de credenciales, tendremos que bajarnos las credenciales de una cuenta de servicio, pasarlas en el script… No es difícil, de hecho lo hemos hecho en muchos posts (ejemplo1, ejemplo2), pero es un poco aburrido.

En su lugar, si nos suscribimos a un topic de Pub/Sub, la autentificación se hace de forma interna, por lo las credenciales no son necesarias. Eso sí, a la hora de automatizar con Cloud Scheduler, tendremos que mandar mensajes a ese topic en vez de hacer peticiones POST. De todos modos, esto es algo que veremosmás adelante.

En cualquier caso, la configuración quedaría de la siguiente manera:

Cómo configurar trigger de Cloud Functions con Pub/Sub para automatizar script de Python en Google Cloud

Además, deberíamos intentar evitar exponer los datos sensibles del script, como el nombre del host, el usuario o la contraseña. Para ello, Cloud Functions ofrece la posibilidad de crear variables de entorno de tal forma que estos valores no queden expuestos en el código

Además, si alguno de los valores cambia, no tendremos que volver a desplegar todo, solo habría que cambiar estas variables.

Cómo añadir variables de entorno a una función de Cloud Functions

Con esto, ya estaría Cloud Functions “ajustado”. Ahora, ¡veámos cómo subir nuestra función de Python a Cloud Functions!

Subiendo nuestro script de Python a Cloud Functions

Ahora nos encontraremos con un panel como el siguiente:

Panel de funcion Cloud Functions

Lo primero de todo hay que elegir el lenguaje de programación que vayamos a usar. En nuestro caso, Python 3.7.

Una vez hecho esto, aparecerá main.py. En este archivo debemos definir la función que queremos que se ejecute. En este sentido, es importante destacar lo siguiente:

  • Pub/Sub pasará a la función dos parámetros. Por tanto, nuestra función deberá requerir dos parámetros, aunque luego no se usen.
  • Para que Cloud Functions funcione correctamente, el entrypoint y el nombre de la función deben coincidir.

Además, para debuguear y ver qué ha fallado, recomendaría hacer returns de erros y status. En mi caso solo devuelvo un Ok para ver que está todo bien.

Por último tenemos que definir los requisitos de nuestro script en el archivo requirements.txt. Aquí deberemos indicar qué paquetes y en qué versiones necesita nuestro script para funcionar.

En mi caso, los requisitos quedan de la siguiente manera:

requests==2.22.0
pandas==0.24.2
sqlalchemy==1.3.5
psycopg2==2.8.6

Una vez hayamos configurado la función y los requirements, simplemente desplegamos la función. Si el despliegue es correcto, veremos un check verde con nuestra función.

¡Ojo! Que la función se despliegue correctamente no significa que esta funcione bien. Para comprobar que la función funciona hay que entrar dentro de la función, ir al apartado ‘Testing’ y hacer clic en ‘Test the function’.

Si el output es el esperado… ¡enhorabuena! Acabas de dar un paso importante para aprender a automatizar tu script de Python en Google Cloud. ¡Veámos ahora cómo automatizarlo!

Cómo automatizar una función de Cloud Function con Cloud Scheduler

Para automatizar la función, primero debemos crear un Job en Cloud Scheduler.

En la siguiente pantalla deberemos definir cada cuánto se llamará a esta función. Esto se define mediante formato unix de cron, del cuál ya hablé en este post.

Básicamente, hay que indicar a qué minuto hora día del mes mes y día de la semana queremos que se ejecute nuestra función. Por ejemplo, si queremos que se ejecute cada minuto, deberíamos indicar * * * * *, mientras que si queremos que se ejecute a cada hora, deberemos indicar 0 * * * *, de tal forma que se ejecute en cada en punto.

Al principio puede que sea un poco “dificil” entender cómo funciona, así que os recomendaría usar herramientas que te permitan si el formato es correcto o no. Yo, por ejemplo, uso Crontabguru.

En mi caso, por ejemplo, lo automatizaremos para que se ejecute cada hora. Además, como comentaba antes, mandaremos un mensaje a Pub/Sub. Para ello, deberemos elegir el topic al que hayamos suscrito nuestra función, que en mi caso era flights.

Además, tendremos que indicar el payload, unos atributos adicionales que, en nuestro caso no usamos y que, por tanto, podremos poner lo que queramos.

Configurar Cloud Scheduler para automatizar función de Cloud Functions

Guardamos y… ¡ya hemos aprendido a automatizar nuestro script de Python en Google Cloud!

Conclusiones de automatizar nuestro script de Python en Google Cloud

Como ves, automatizar nuestro script de Python en Google Cloud en algo súper sencillo (mucho más que automatizar un script de R en Google Cloud), pero muy muy útil.

Además, en términos de costes no es algo caro: Pub/Sub ofrece 10Gb de mensajes gratuitos al mes, Cloud Functions 2 millones de invocaciones por mes y los tres primeros tasks de Cloud Scheduler son gratuitos. En definitiva, para procesos sencillos seguramente no haga falta ni pagar.

Y es que siendo gratis (o muy barato), con lo que has aprendido hoy puedes llevar tus scripts al siguiente nivel, ya sea si necesitas automatizar procesos ETL o incluso si quieres poner tu algoritmo en producción!

En cualquier caso, espero que este post te haya sido útil para tu día a día y que gracias a él puedas ayudar a tu empresa a conseguir mejores resultados.

Como siempre, cualquier sugerencia de post no dudes en responder a la encuesta o escribirme por Linkedin. ¡Nos vemos en el siguiente!

¡No te pierdas ningún post!

Si te gusta lo que lees... suscríbete para estar al día de los contenidos que subo.
¡Serás el primero en enterarte!