Conociendo Fn (parte 3): crear una función en Python

Header Fn Project

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 modelode 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.

1 Comment

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *