En este tercer post dedicado a Fn Project (ver post)vamos a ver lo inmediato que es crear una función Fn con Python, veamos los sencillos pasos:
1.Arranque de Fn
Para empezar haremos el fn start
2.Crear función Fn
Luego:
fn init –runtime python mypythonfunction
cd mypythonfunction
para crear la función con el runtime de Python e irme al directorio creado.
Podemos ver que Fn crea un func.py con una función ejemplo que un JSON tipo {“name”: “Luismi”} recibido en un JSON nos forma un JSON tipo {«message»:»Hello Luismi!»}:
Además del func.yaml de configuración de la función y del requirements.txt de Python en el que aparece la dependencia del FDK (Fn Development Kit) para Python.
Podéis encontrar más info sobre el uso del FDK para Python aquí: https://github.com/fnproject/fdk-python
3.Crear App fn
Una vez creada la función debo crear la App que agrupa todas las funciones que cree, para eso
fn create app mypythonapp
4.Desplegar la función en la App
Cuando desplegamos la función en realidad la estamos publicando para hacerla accesible a otros usuarios y sistemas, podemos usar el –verbose para ver el detalle.
La primera vez que se construye una función de un lenguaje Fn tarda más tiempo ya que descarga las imágenes Docker necesarias.
fn –verbose deploy –app mypythonapp –local
Puedo ver la imagen con
docker images | grep python
5.Invocar la función con CLI
La forma más sencilla de invocar la función es desde el CLI de Fn:
fn invoke mypythonapp mypythonfunction
o mejor con parámetros:
echo -n ‘{«name»:»Luismi»}’ | fn invoke mypythonapp mypythonfunction –content-type application/json
6.Invocar la función con Endpoint
Como ya vimos podemos invocar a Fn por su endpoint, para esto hacemos un inspect
fn inspect function mypythonapp mypythonfunction
Para invocar luego
curl -X «POST» -H «Content-Type: application/json» -d ‘{«name»:»Luismi»}’ http://localhost:8080/invoke/01F0HB5BKMNG8G00GZJ0000002
7.Y para acabar podemos completar un poco la función
Hasta ahora nos hemos centrado en entender cómo desarrollar funciones Fn en Groovy, evidentemente estas funciones en Groovy pueden ser mucho más complejas.
Para hacernos una idea sencilla cambiaremos el ejemplo para solicitar por la entrada la URL a un fichero y devolver el describe del DataFrame panda.
Para eso en el requirements.txt de la función añadiré las dependencias necesarias, en lo que voy a hacer usaré pandas y requests:
Y cambiaré el código de mi función por algo como esto:
Construiré la función con un build (recordad que si hago un deploy se incrementa la versión de la función):
Y para invocarlo lanzaré algo como:
echo -n ‘{«url»:https://media.geeksforgeeks.org/wp-content/uploads/nba.csv}’ | fn invoke mypythonapp mypythonfunction –content-type application/json
que me devolverá algo como esto:
Seguramente os habréis preguntado donde se ven las trazas que he indicado por ejemplo aquí:
Puedo verlas en el log de la consola en la que hice el fn start, si quiero ver más detalle en los logs puedo arrancarlo con nivel de log a DEBUG con sudo fn start –log-level DEBUG
8.Próximos pasos
Visto esto, podemos caer en que con poquito más de esfuerzo podría crear una App que encapsulara un modelo, de modo que habría una función para entrenar el modelo pasándole por ejemplo como parámetro un fichero con los datos del entrenamiento y otra función para ejecutar el modelo entrenado….esto lo veremos en un próximo post.