En más de un artículo te he mostrado ejemplos de cómo resolver funcionalidades concretas con Azure Functions, como por ejemplo: enviar y recibir SMS con Twilio o procesar MP3s con Speech Service, pero lo cierto es que nunca te he contado qué es Azure Functions y cómo empezar a trabajar con ello, mea culpa. Hoy te quiero contar para qué es este servicio y cómo empezar a usarlo.
Si bien hace unos años los servicios PaaS (Platform as a Service) era lo que estaba de moda, en estos dos últimos se está poniendo mucho el foco en todo lo que tiene que ver con el serverless. ¿Pero qué es el serverless?
¿Qué es el serverless?
Sin ponernos muy poéticos, el serverless no es más que tecnologías o servicios que me permiten despreocuparse, más aún que en PaaS, de los recursos que se necesitan para ejecutar mi código. Obviamente, siempre va a haber un servidor por detrás, pero con serverless simplemente delegamos la tarea de elección de los recursos que deben tener estos al proveedor.
¿Qué es Azure Functions?
Azure Functions es el servicio de Microsoft para esta apuesta por el serverless, aunque bien es cierto que existen otros que le complementan como Event Grid, del que ya te hablé, y Logic Apps con el que se lleva muy bien. Entenderlo es bien sencillo: Azure Functions trata de funciones, que pueden estar en diferentes lenguajes, como C#, F#, Node.js, Java, además de otros en fase experimental (PHP, Python, TypeScript, Batch, Bash o PowerShell), que se ejecutan a causa de diferentes eventos que puedan ocurrir, como son: temporizadores, llamadas HTTP o, incluso, por eventos que ocurren en otros servicios de Azure (un archivo se sube a un blob en Azure Storage, un mensaje que entra en una cola en Azure Queue, etcétera). Por supuesto estas funciones pueden retornar valores o incluso desembocar en diferentes salidas: una tabla, otra cola de mensajería, la respuesta a esa llamada HTTP, etcétera.
Siempre creo que lo mejor es verlo con un ejemplo 🙂 Así que entra en el portal de Azure y haz clic en Create a resource y selecciona el acceso rápido Serverless Function App.

Durante la creación ya se puede apreciar la magia del serverless 🙂 ya que lo único que necesitas es:
- App name: formará parte de la URL que se va a generar. Aunque no lo especifique por ningún lado, es importante que sepas que este servicio puede almacenar más de una función, por lo que puedes poner un nombre más generico y no de una funcionalidad específica.
- Subscription: si tienes más de una suscripción de Azure, selecciona en el desplegable cuál es la que quieres utilizar para tus nuevas funciones serverless.
- Resource group: se trata del grupo de recursos donde vas a alojar el servicio.
- OS: a día de hoy es posible elegir entre Windows y Linux, aunque este último todavía está en Preview.
- Hosting Plan: aunque estamos hablando de serverless y de pagar por lo que se consume, en algunos escenarios se necesita ser más predictivo y tener un presupuesto acotado, por lo que se ofrecen dos tipos de plan: App Service el cual te permite predefinir la capacidad a utilizar o Consumption Plan en el cual se paga por ejecución y se ajusta dinámicamente en función de la carga que está teniendo tu aplicación.
- Location: en qué data center de Microsoft Azure quieres ubicar el servicio. Lo lógico es que esté lo más cerca posible de los usuarios que lo van a consumir.
- Runtime stack: aquí es donde elegimos el lenguaje que queremos utilizar para escribir nuestras funciones. Para mi ejemplo utilizaré JavaScript.
- Storage: se necesita de una cuenta de almacenamiento para guardar los logs del servicio.
- Application Insights: es el servicio de monitorización recomendado dentro de la plataforma de Microsoft Azure. Si lo creas desde aquí lo enlazará automáticamente con tu nuevo servicio de Azure Function.
Una vez que tengas todos los campos completados haz clic en el botón Create para provisionar el servicio.

El proceso de creación tardará unos segundos. Una vez finalice verás tu servicio de la siguiente manera:

Como puedes ver, Azure Functions se compone básicamente de tres apartados: Functions, Proxies y Slots. En este post nos centraremos solo en el primero. Como ya te comenté durante la creación, es posible tener más de una función dentro del servicio. De hecho, ahora mismo no tienes ninguna 🙂 Para crear una nueva accede al apartado Functions y haz clic en + New Function en la parte superior (también puedes utilizar el + al lado de Functions).

Lo primero que va a preguntarte es qué trigger o evento tiene que ocurrir para que tu función se ejecute. Como ya te hablé en el inicio, este puede ser un temporizador, una llamada HTTP o incluso un evento generado por otros servicios dentro de la plataforma. En este caso elige HTTP Trigger para verlo con un ejemplo simple.

Cambia el nombre del trigger por HTTPHelloWorldTrigger. Es importante saber que en este tipo de trigger existe la posibilidad de elegir el nivel de autorización que se necesita para poder llamar a esta función:
- Function: necesito de una clave para poder realizar la llamada a mi función.
- Admin: se necesita de la master-key para poder hacer la llamada.
- Anonymous: no requiere de ninguna clave.
Las claves puedes encontrarlas en el apartado keys del servicio. Para este ejemplo utilizaremos la opción por defecto que es Function.

En el caso de haber elegido JavaScript como lenguaje, el código de inicio será el siguiente:

Lo único que hace es recibir un parámetro name a través del query string de la petición y lo concatena con «Hello «. Para probarlo puedes usar el propio navegador o herramientas como Postman. La URL para invocar la función la puedes ver a través del enlace </> Get function URL donde ya aparecerá la key incluida.

Copia la URL en tu navegador o Postman y añade como parte del query string el parámetro name con un nombre.

Cuando realices la llamada, en el propio portal de Azure podrás ver en tiempo real el log del servicio y las diferentes trazas que se han ido incluyendo en el código.

Obviamente, la forma natural de trabajar con Azure Functions no es a través del portal de Azure, pero siempre es el comienzo 🙂 Visual Studio y Visual Studio Code se integran a la perfección con este servicio y es posible incluso ejecutarlo en local en la fase de desarrollo. Para Visual Studio Code existe una extensión llamada Azure Functions y particularmente es la que yo uso para trabajar con este servicio tanto en Windows como en Mac. Si quieres continuar con tu primera función desde este IDE puedes seleccionar el nombre de tu servicio, en mi caso returngisfuncs, y hacer clic en Download app content.

Elige la opción Content and Visual Studio project y marca el check Include app settings in the download.

Descomprime el archivo, ábrelo con Visual Studio Code, instala la extensión de Azure Functions y pulsa F5 para ejecutarlo en local. Es posible que te pregunte si quieres optimizar el proyecto para VS Code, ya que detecta que ha sido creado fuera del IDE.
Ya sabes para qué sirve Azure Functions y cómo empezar a jugar con él. Antes de despedirme, te recomiendo que eches un vistazo al sitio Azure Serverless Community Library donde encontrarás ejemplos de escenarios que pueden ser de utilidad y la página Serverless in Azure donde se recogen ejemplos de arquitecturas que pueden aportarte ideas para las tuyas 🙂
¡Saludos!