¿Cómo crear una Función en Python con Fn Project?

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.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s