Insertar mensajes a una Azure Queue Storage desde una Azure Function
En mi idea de hacer un repaso general de algunas características generales de las Azure Functions, hoy me gustaría comentar cómo introducir mensajes en una cola de Azure, o mejor dicho en una Azure Queue Storage.
Veremos que hacer esto desde una Azure Function es realmente sencillo. Sólo tenemos que tener en cuenta algunas cosas y listo.
Lo primero que tendremos que hacer y de lo que debemos partir es lógicamente de la base de una Azure Function App que ya tendremos creada.
A partir de aquí, crearemos una nueva función:
En la pantalla que aparece una vez hacemos clic en crear una nueva función, seleccionamos la opción create your own custom function.
Dentro de las plantillas a utilizar, elegiremos la que se denomina como HTTP Trigger, y como lenguaje elegiremos C#.
Como valores relativos a la función, pondremos los que consideremos oportunos.
En mi caso he puesto los siguientes valores:
Una vez cumplimentados los datos, pulsaremos el botón Create para crear la Azure Function.
Una vez hecho esto, pensemos en el objetivo principal que queremos cumplir.
Esto es, recibir información en la Web API a través de HTTP (en concreto un correo electrónico), e introducirlo en una cola.
El deseo teórico de nuestra aplicación sería que esa cola fuera consumida por otro proceso que se encargaría de recibir esa dirección de correo electrónico, validarla y confirmar que no está activa ya, y activarla para recibir una newsletter por ejemplo.
Pero nosotros nos quedaremos aquí con el mero hecho de introducir esa dirección de correo electrónico en la cola.
Tampoco abordaremos aspectos relativos a la validación del correo electrónico, etc.
Bien.
La forma de integrar nuestra Web API con una cola de Azure Queue Storage es situándonos en la Azure Function que hemos creado (y que aún debemos preparar en una fase posterior) y hacer clic sobre la opción Integrate.
Se presentará una pantalla dentro de la cual deberemos centrarnos en la sección Outputs.
Allí, haremos clic sobre la opción New Output.
De las opciones que nos aparecerán, seleccionaremos Azure Queue Storage.
Y pulsaremos el botón Select.
A continuación, se nos mostrará una pantalla dentro de la cual deberemos agregar diferentes datos de información que servirá para crear nuestra cola y definir el parámetro de entrada de la cola que agregaremos en nuestra Azure Function.
En mi caso he puesto estos datos (recuerda que el nombre de la cola debe ser con letras minúsculas):
Message parameter name: emailQueueItem
Queue name: newsletteremailqueue
Una vez introducidos los datos que queremos utilizar para configurar nuestra Azure Queue Storage, pulsaremos el botón Save.
Ahora tenemos nuestra cola configurada y preparada para ser utilizada por nuestra Azure Function, por lo que iremos a nuestra Azure Function correspondiente y modificaremos el código para poder utilizarla.
Para ello, escriba el siguiente código en nuestra Azure Function:
#r "Microsoft.WindowsAzure.Storage" using System.Net; using Microsoft.WindowsAzure.Storage.Table; public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log, ICollector<string> emailQueueItem) { log.Info("C# HTTP trigger function processed a request"); string email = req.GetQueryNameValuePairs() .FirstOrDefault(q => string.Compare(q.Key, "email", true) == 0) .Value; dynamic data = await req.Content.ReadAsAsync<object>(); email = email ?? data?.email; if (email != null) { emailQueueItem.Add(email); log.Info($"{email} valid and enqueued"); return req.CreateResponse(HttpStatusCode.OK, $"{email} registered. Please, wait for the confirmation email."); } log.Info("Email invalid"); return req.CreateResponse(HttpStatusCode.BadRequest, "The email received is not valid"); }
Como podemos observar, en los parámetros de entrada de nuestra Azure Function he indicado un nuevo parámetro al que aparece por defecto:
ICollector<string> emailQueueItem
El nombre del campo no es arbitrario.
Coincide con el que dimos en la configuración de nuestra Azure Queue Storage.
Nuestra Azure Function resuelve internamente el lugar en el que deberá crear el mensaje, que no es otro que el nombre de la cola que también creamos.
Como vemos, no hace falta indicárselo.
Lo único que debemos hacer, es indicar que queremos insertar en la cola el mensaje que contendrá (en nuestro caso) la dirección email que recibamos en la petición HTTP y que está definida como un POST.
Esto lo lograremos con la instrucción:
emailQueueItem.Add(email);
Lo único que nos queda es ejecutar como POST nuestra Azure Function, donde pasaremos un cuerpo o body a la petición como por ejemplo:
{ "email": "foo@foo.com" }
Revisando la cola con la herramienta Microsoft Azure Storage Explorer, veremos que tenemos insertado nuestro mensaje para ser procesado por un proceso independiente al de nuestra Azure Function.
Como podemos ver, integrar nuestra Azure Funtion con otros servicios de Azure es bastante sencillo y rápido.
¡Happy Coding!