Conociendo Fn (parte 3): crear una función en Python
En esta tercera entrada dedicado a Fn Project (parte 1, parte 2), vamos a ver lo inmediato que es crear una función Fn con Python siguiendo unos sencillos pasos.
Arrancando Fn
En primer lugar lanzaremos Fn mediante la siguiente línea de código:
fn start
Creando la función
Una vez que tenemos Fn funcionando, crearemos la función con el runtime de Python, y nos moveremos al directorio creado. Esto lo conseguiremos con el siguiente código:
fn init –runtime python mypythonfunction
cd mypythonfunction
Aquí podemos ver que Fn nos ha creado el código de una función «func.py» que se encarga de componer un JSON de salida con la forma {“message”:”Hello Luismi!”}, a partir del nombre pasado en el JSON de entrada, que tiene la forma de {“name”: “Luismi”}.
También encontramos un archivo «func.yaml» con la configuración de la función, y un archivo de texto «requirements.txt» de Python, en el que aparece la dependencia del FDK (Fn Development Kit) para Python.
Podéis encontrar más información sobre el uso del FDK para Python en este enlace.
Crear la aplicación Fn
Una vez creada la función, debemos crear la aplicación que agrupa todas las funciones que vayamos a crear, algo que haremos con la siguiente línea de código:
fn create app mypythonapp
Desplegar la función en la aplicación
Cuando desplegamos la función, en realidad la estamos publicando para hacerla accesible a otros usuarios y sistemas, por lo que podemos usar la flag –verbose para ver el detalle:
fn –verbose deploy –app mypythonapp –local
La primera vez que se construye una función de un lenguaje Fn tarda un tiempo, ya que descarga las imágenes Docker necesarias. Sucesivas veces será más rápido.
Para poder ver la imagen generada, usamos el siguiente código:
docker images | grep python
Invocar la función con CLI
La forma más sencilla de invocar la función es desde el CLI de Fn, mediante:
fn invoke mypythonapp mypythonfunction
Otra posibilidad es invocarla mediante parámetros:
echo -n ‘{“name”:”Luismi”}’ | fn invoke mypythonapp mypythonfunction –content-type application/json
Invocar la función con Endpoint
Como ya hemos visto, podemos invocar también a Fn por su endpoint. Para ello, primero obtenermos la URL del endpoint mediante un «inspect»:
fn inspect function mypythonapp mypythonfunction
Seguidamente, invocamos la función de la siguiente forma:
curl -X “POST” -H “Content-Type: application/json” -d ‘{“name”:”Luismi”}’ http://localhost:8080/invoke/01F0HB5BKMNG8G00GZJ0000002
Completar un poco la función
Hasta ahora nos hemos centrado en entender cómo desarrollar funciones Fn en Groovy, pero evidentemente estas funciones 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 archivo de texto «requirements.txt» de la función, añadiremos las dependencias necesarias. Para lo que vamos a hacer, usaremos «pandas» y «requests»:
El código de nuestra función lo vamos a modificar, resultando en algo como esto:
Construiremos la función con un «build» (recordemos que, si hacemos un despliegue, se incrementa la versión de la función):
Para invocar todo eso, usaremos el siguiente código:
echo -n ‘{“url”:https://media.geeksforgeeks.org/wp-content/uploads/nba.csv}’ | fn invoke mypythonapp mypythonfunction –content-type application/json
Esto nos debería devolver algo similar a esto:
¿Os preguntáis donde se pueden ver las trazas que hemos indicado en el código de nuestra función?
Pues podemos verlas en el registro de la consola en la que hicimos el fn start. En caso de que las queramos ver con más detalle en los registros, podemos arrancarlo con nivel de log a DEBUG con la siguiente línea de código:
sudo fn start –log-level DEBUG
Próximos pasos
Visto esto, podemos caer en que con poquito más de esfuerzo podríamos 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… lo cual veremos en una próximo entrada.
Pingback: Creando una función de Spring Cloud Function sobre Fn Project – Onesait Platform Blog