Automatizando tareas con Azure Logic Apps y Azure Functions

Hoy toca un poco hablar de automatización de tareas. Esto no es nada nuevo, antiguamente esto se hacía mediante el uso de scripts que ante determinados eventos eran lanzados para ejecutar tareas. A muchos de los que nos hemos dedicado a administrar servidores nos suena esto y lo pesado que puede resultar.

Ahora, gracias a la nube, es posible ir un poco más lejos. Y ya de paso, ya sea dicho, hacer las cosas todavía más fáciles. La nube de Microsoft dispone de varias herramientas para tal fin. Hablamos por ejemplo de Azure Logic Apps y Azure Functions.

¿Qué es Azure Logic Apps?

Si no tienes experiencia programando o desarrollando aplicaciones con Azure Logic Apps podemos crear tareas automatizadas mediante un proceso basado en flujos de trabajo. Básicamente es como conectar módulos que representan servicios y acciones que podemos definir como si de un castillo de bloques se tratara. Microsoft Azure administra completamente Azure Logic Apps, lo que permite despreocuparse de la compilación, hospedaje, escalado, administración, supervisión y mantenimiento de estos servicios.

Esto permite centrar nuestra atención en la parte lógica enlazando entidades mediante conectores generando flujos. Estos flujos son escalables, actualmente contamos con más de 200 conectores y las posibilidades son enormes, pero ¿qué tan fácil es construir y mantener estas integraciones? ¿Y cuánto ahorra realmente al usar esta herramienta en comparación con su propio código personalizado desde cero? En este artículo intentaré dar respuesta a estas preguntas pero ahora hablaremos un poco sobre Azure Functions.

¿Qué es Azure Functions?

Azure Functions es una solución pensada para desarrolladores y administradores que necesitan ejecutar su código directamente bajo demanda en la infraestructura de Azure. Este código se ejecuta solo cuando una determinada condición se cumpla y sin preocuparnos de la infraestructura subyacente, es decir, no tenemos que mantener nosotros esa infraestructura porque ya viene dada por Microsoft. Esto nos permite centrarnos en lo importante. Esto lo libera de innumerables decisiones de diseño que de otro modo tendría que tomar para escribir un servicio rentable.

Además Azure Functions no se ciñe a un único lenguaje de programación. Podemos trabajar programando en C#, Node.JS, Java, PHP, etc o trabajar con dependencias usando NPM, NuGet y Maven. Si eres un ingeniero DevOps estoy seguro que leer estas líneas te ha hecho muy feliz. Tienes razón. menos esfuerzo y mayor productividad.

Si te has perdido, para resumirlo, el concepto central de Azure Functions gira en torno a un fragmento de código o función. Esta función, cuando se combina con eventos y datos, brinda una imagen completa de lo que debería ser Azure Functions.

¿Por qué necesitamos automatizar?

Esta pregunta está directamente relacionada con el título de esta publicación. Podríamos responder que en un mundo sin automatizar las tareas más importantes y rutinarias de nuestro negocio pues claramente conlleva una pérdida de tiempo importante y consumo de recursos. Pero a mi me gusta otra razón que copio de un profesor de mis tiempos en la carrera.

Porque somos vagos. Somos vagos porque nosotros, como desarrolladores de software, tenemos un montón de cosas que hacer y considerar junto con la codificación. Por nombrar algunos, al implementar el código para resolver la lógica de su negocio, también debemos pensar en cómo implementar la aplicación, qué herramientas usar para depurar si surge un problema, cómo mantenerla actualizada con los cambios en las API/bibliotecas que utiliza, etc. Los desarrolladores experimentados aprendemos más tarde o más temprano esta valiosa lección. Nuestro campo es tan amplio que en la práctica no podemos perder el tiempo.

Pero que esto no nos lleve a engaño. En esencia, ser vago no se trata de no tener nada que hacer, porque hay algo que hacer. Se trata de tener tiempo para hacer lo que mejor sabes. El dominio tiene que ver con la productividad y maximizar nuestro potencial. Y esa es la razón. :)

¿Necesitas alguna otra razón? ¿Algún ejemplo práctico para convencerte?

Azure Logic Apps, ejemplo práctico

Como habíamos mencionado, Azure Logic Apps proporciona un entorno de trabajo sin servidor (serverless) para ejecutar flujos de trabajo automatizados para integrar aplicaciones, datos y dispositivos en cualquier lugar. Similar a lo que hace Azure Functions, pero prescindiendo de la necesidad de escribir código y usando un constructor visual en su lugar.

No hace mucho tiempo trabajé en un proyecto en donde el cliente necesitaba conectar Salesforce con Slack, de modo que al crear un Lead en Salesforce esto pueda publicarse en Slack para “notificar” al jefe el trabajo realizado usando nuestro canal del equipo de ventas y así evitar duplicar el trabajo diario.

Si intentamos crear una solución a medida usando código esto podría llevarnos algún tiempo entre diseñar, implementar y pulir, pero con Azure Logic App esto es un claro ejemplo de click and point.

Creación de la Azure Logic App

Desde el portal de Azure, debemos crear un nuevo recurso. En este caso una aplicación de Logic App. Aquí ponemos el nombre que queramos, elegimos la suscripción y clic en el botón Crear.

Una vez creada la aplicación, navegamos a su pantalla de inicio y elegimos crear nuestra aplicación desde cero usando la plantilla Blank Logic.

Automatizando tareas con Azure Logic Apps y Azure Functions

Esto nos lleva al diseñador. Buscamos por Salesforce y lo seleccionamos:

Azure Logic Apps y Azure Functions

En este conector podemos ahora definir las acciones disponibles para iniciar nuestra aplicación. Seleccionamos “When a record is created”.

Automatizando tareas con Azure Logic Apps y Azure Functions

Conecte su cuenta de Salesforce con la aplicación Logic haciendo clic en el botón Iniciar sesión.

conectar salesforce con login

El siguiente paso consiste en definir el trigger o disparador, para que se active cuando un nuevo lead se genere. Aquí podemos definir la frecuencia de evaluación, 3 minutos en nuestro ejemplo.

salesforce object type

Una vez terminemos este paso pulsaremos en Next y configuramos una nueva acción en Slack para publicar un mensaje en nuestro canal del equipo de ventas.

publicar mensaje slack

Y listo. La aplicación está lista. ¿Cuánto hemos tardado? Cinco minutos o quizá menos.

Azure Functions, entrando en materia

Ahora vamos con Azure Functions. Lo cierto es que las posibilidades son igual o incluso más infinitas que las que ya de por sí ofrece Logic Apps. Lo primero que tenemos que tener en cuenta a la hora de usar Azure Functions son los conceptos en lo que se fundamenta.

De su nombre podemos suponer que el concepto central son las funciones. Código que podemos escribir y guardar junto los archivos de configuración en una misma carpeta. Azure Functions Runtime leerá el archivo de configuración para determinar los eventos que se supervisarán y cómo pasar datos y devolverlos desde la ejecución de la función.

Los activadores o triggers son formas de iniciar la ejecución de nuestro código. Importante, una función siempre debe tener un solo disparador.

En Azure Functions podemos hacer uso de varios tipos de desencadenadores disponibles:

  • HTTP: Para ejecutar el código del Azure Function mediante una solicitud HTTP. Ejemplo
  • Timer: Para ejecutar el código del Azure Function mediante un temporizador. Ejemplo
  • CosmosDB: Para ejecutar el código del Azure Function cuando agregamos o actualizamos las colecciones en una base de datos. Ejemplo
  • Blob: Para ejecutar la función cuando agregamos nuevos blobs a los contenedores de Azure Storage. Ejemplo
  • Queue: Para ejecutar el código de una función conforme llegan a una cola de Azure Storage. Ejemplo
  • EventHub: Responde a eventos proporcionados a un Azure Event Hub. Ejemplo

https://medium.com/grapecity/an-introduction-to-azure-functions-845fbf0033af

Ejemplo práctico con Azure Function:

Ahora vamos a ver un ejemplo práctico para mostrar cómo crear una función del tipo “Hola Mundo” usando Azure Function. Esta es una aplicación muy sencilla pero creo que servirá como base a los no iniciados para entender las posibilidades que ofrece este servicio de Microsoft.

Lo primero que tendremos que hacer es entrar en el portal de Azure y tras seleccionar nuestra subscripción crearemos allí un nuevo recurso.

nuevo recurso azure

Esto dará lugar al formulario que sirve de asistente en donde buscaremos Function APP tal como se muestra en la imagen a continuación:

formulario function app

Esto nos permitirá definir los datos que necesitaremos para crear nuestra Azure Function. Aquí podemos definir el grupo de recursos, nombre de nuestra APP, sistema operativo, localización etc.

formulario azure

Una vez cumplimentado el formulario, pulsaremos en el botón Create y esto iniciará el proceso de despliegue de nuestra Azure Function. Debemos ser pacientes, suele tardar unos pocos minutos.

Finalizado el proceso ya podemos ir al recurso creado y abrir el panel de gestión de nuestra Azure Function. Dentro de la ventana de gestión de nuestra Azure Function, y para abrir boca, iremos al grupo denominado Functions y pulsaremos el botón + que aparecerá al poner el puntero del ratón sobre esa opción.

geeks azure function

Aquí, utilizaremos una plantilla existente, para lo cual seleccionaremos la opción Webhook + API, seleccionando como lenguaje de desarrollo (en mi caso) C#. Esto creará un trigger y un fichero con nombre run.csx. El contenido C# de nuestra Azure Function es el que se indica a continuación (y corresponde con la plantilla general de una Azure Function tipo Hello World):

using System.Net;

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log)
{
    log.Info("C# HTTP trigger function processed a request.");

    // parse query parameter
    string name = req.GetQueryNameValuePairs()
        .FirstOrDefault(q => string.Compare(q.Key, "name", true) == 0)
        .Value;

    // Get request body
    dynamic data = await req.Content.ReadAsAsync<object>();

    // Set name to query string or body data
    name = name ?? data?.name;

    return name == null
        ? req.CreateResponse(HttpStatusCode.BadRequest, "Please pass a name on the query string or in the request body")
        : req.CreateResponse(HttpStatusCode.OK, "Hello " + name);
}

Ahora sólo nos queda ejecutar nuestra Azure Function.

Esto lo podemos hacer pulsando el botón Run directamente, o acudiendo a la URL de nuestra Azure Function.

Para ejecutarla desde el botón Run, basta con pulsarlo y desplegar el Log en la parte inferior para comprobar el resultado que obtenemos.

Para obtener la URL de nuestra Azure Function, haremos clic sobre la opción Get function URL que aparece en la parte superior derecha:

get function url azure

En la ventana emergente, desplegamos de la lista de claves la que indica default y pulsaremos el botón Copy para copiar en el portapapeles el contenido de la URL que es lo que nos interesa para pasarle nuestro nombre como variable y hacer funcionar la función. Si abrimos el navegador y pegamos esta URL podremos ver el resultado.

Conclusión:

Y hasta aquí el artículo de hoy. En futuras entregas iremos profundizando un poco más en el mundo de la automatización utilizando tanto Azure Logic Apps como Azure Functions. Por ejemplo podremos ver como “controlar” que el certificado de nuestra tienda online se encuentre al día o que forzar a que nuestro entorno de máquinas virtuales se apague cuando no sea utilizado y nos olvidemos de hacerlo nosotros, etc.

Si te ha gustado el artículo no dudes en compartirlo y también deja tus comentarios si tienes alguna duda o quieres compartir tu opinión con nosotros.