Cloud Computing

Introducción a Azure Functions

En este artículo aprenderás qué es Azure Functions, sus características, ventajas y desventajas, así como qué es la extensión Azure Durable Functions.

Publicado el 22 de Octubre de 2021
Compartir

Qué es Azure Functions

Azure Functions es un servicio de computación sin servidor (serverless) alojado en la nube pública de Microsoft Azure. Están diseñadas para acelerar y simplificar el desarrollo de aplicaciones. Forma parte de la oferta de Microsoft en Azure en modo PaaS (Plataforma como Servicio)

Azure Functions, es básicamente una solución del tipo FaaS o “función como servicio”, que nos permite ejecutar fácilmente pequeñas piezas de código, o “funciones”, en la nube. Puedes escribir sólo el código que necesitas para el realizar la funcionalidad que desees, sin tener que preocuparte de una aplicación completa o de la infraestructura para ejecutarla. Estas funciones de Azure pueden hacer que el desarrollo sea aún más productivo, y puedes utilizar distintos lenguajes de desarrollo, como C#, Java, JavaScript, PowerShell o Python, por ejemplo.

El coste que Azure nos repercutirá será el del tiempo de ejecución del código de nuestra función, además si tenemos muchas peticiones a nuestra función, Azure escalará de forma elástica a más instancias o menos en función de la cantidad de peticiones que nuestra función tenga que atender. Como podrás intuir, si a nuestra función no la llama nadie no se efectuan cargos sobre la misma, dependiendo del plan de servicios que elijamos para ella.

image-20210705160731727

Características de Azure Functions

Azure Functions admite disparadores (triggers), que son formas de iniciar la ejecución de código, y enlaces (bindings), que son formas de simplificar la codificación de los datos de entrada y salida. Tenemos diversas plantillas para crear nuestras funciones en Azure como pueden ser las siguientes:

  • HTTPTrigger - Desencadena la ejecución de código mediante una petición HTTP.

  • TimerTrigger - Ejecuta la ejecución de código basándose en un horario predefinido.

  • CosmosDBTrigger - Procesa documentos de Azure Cosmos DB cuando se añaden o actualizan en colecciones de una base de datos CosmosDB.

  • QueueTrigger - Responde a los mensajes cuando llegan a una cola de Azure Storage.

  • EventGridTrigger - Responde a eventos entregados a una suscripción en Azure Event Grid.

  • EventHubTrigger - Responde a eventos entregados a un Azure Event Hub.

  • ServiceBusQueueTrigger - Responde a eventos escuchando mensajes que se coloquen en las colas de mensajes de Azure Service Bus.

  • ServiceBusTopicTrigger - Responde a eventos escuchando mensajes suscribiéndose a temas (topics) de Azure Service Bus.

image-20210705161020676

Las Azure Functions son fáciles de integrar con otros servicios, como los de seguridad tipo OAuth, Google, Facebook, Twitter y por supuesto Microsoft, para limitar el acceso a nuestras Azure Functions a los usuarios permitidos.

Se puede desarrollar desde Visual Studio o desde el propio portal de Azure como podemos ver en la siguiente imagen:

image-20210705160805727

Veamos el siguiente ejemplo de una Azure Function con trigger Http:

using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;

namespace Demos
{
    public static class HttpTriggerDemo
    {
        [FunctionName("HttpTriggerDemo")]
        public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
        {
            log.LogInformation("C# HTTP trigger function processed a request.");

            string name = req.Query["name"];

            string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
            dynamic data = JsonConvert.DeserializeObject(requestBody);
            name = name ?? data?.name;

            return name != null
                ? (ActionResult)new OkObjectResult($"Hello, {name}")
                : new BadRequestObjectResult("Please pass a name on the query string or in the request body");
        }
    }
}

En este ejemplo podemos ver una función la cual permite ser llamada por HTTP Get o Post.

La función escribe en el log que ha procesado una petición.

Intenta leer de la misma el parámetro “name”.

Intenta leer el body de la misma y extraer el parámetro “name”.

Comprueba si ha conseguido de alguna de las formas anteriores rellenar la variable “name” con el contenido de “name”, en caso afirmativo devolverá un objeto OkObjectResult diciendo Hello name. En caso negativo devolverá un BadRequest indicando la forma correcta en la que espera que se le haga la petición, que no es otro que hacer un Get o Post y pasar o bien el parámetro “name” por queryString o pasarlo en el body.

Ventajas de Azure Functions

  • En primer lugar, las funciones de Azure se ejecutan sin servidor, por lo que el desarrollador no tiene que preocuparse de la gestión del servidor.

  • Las funciones pueden desarrollarse desde el portal de Azure o con Visual Studio o el IDE que deseemos, además son muy fáciles de desplegar.

  • Soporta una variedad de lenguajes de programación como C#, Java, Python, JavaScript, etc.

  • Las funciones pueden ser activadas muy fácilmente en base a eventos como hemos descrito en el punto anterior.

  • Se incluye la seguridad proporcionada por Azure como Azure Active Directory.

  • Integración continua y despliegue de código a través de GitHub, Azure DevOps Services y otras herramientas de desarrollo compatibles.

  • Monitorización a través de Application Insights, para poder monitorizar nuestras Azure Functions de forma sencilla.

  • Compatible con NuGet y NPM para incorporar el código de terceros o propio que necesitemos.

Desventajas de Azure Functions

Azure Functions facilita las cargas de trabajo sin servidor, en lugar de un flujo de trabajo sin servidor. Las funciones de Azure se aprovechan mejor como un componente de bajo nivel, en lugar de gestionar el flujo general de una solución orquestada. Por ejemplo, las mejores prácticas para Azure Functions recomiendan evitar funciones grandes y de larga duración.

No sabemos el costo que va a tener nuestra función, puesto que depende de la cantidad de tiempo que esté en ejecución, por lo que tenemos que ser cuidadosos con cómo programamos, dado que, si no somos eficientes, incurriremos en un mayor costo. También cabe destacar que debemos controlar el acceso a estas funciones para que no estén expuestas de forma pública y libre, ya que podríamos recibir muchas peticiones no controladas que nos harían incurrir en un aumento de costes.

  • El modelo de precios es complejo. Aunque el plan Premium y los planes Dedicados están dirigidos a clientes empresariales que no son tan estrictos con los costes, podrían resultar caros.

  • Activar la configuración de instancia siempre activa anulará la ventaja de costes asociada a las Funciones como Servicio. Existe un precio asociado al añadir una cuenta de almacenamiento con las funciones de computación.

  • Hay algunas limitaciones en el escalado con el plan de consumo e incluso el plan premium también tiene un límite superior en el número de funciones de la aplicación. Hay que tener en cuenta estas limitaciones a la hora de elegir el plan adecuado.

Tenemos que tener en cuenta que nuestra capacidad de escalado no es infinita a no ser que usemos un plan Premium, que las incluyamos dentro de nuestro AppService o que hagamos uso de las Azure Durable Functions. Existe un timeout por el cual una función puede estar en ejecución, es de 5 minutos para el plan de consumo y de hasta 30 minutos para el resto de planes, por lo que debemos de tener esto en cuenta a la hora de elegir este tipo de servicio.

Qué son las Azure Durable Functions

Azure Durable Functions es una extensión de Azure Functions. Nos permite escribir funciones con estado en un entorno sin servidor, y nos permite definir flujos de trabajo en el código. La extensión nos permite definir flujos de trabajo con estado en un nuevo tipo de función llamada función orquestadora. Como características de las mismas podemos destacar las siguientes:

  • Definen los flujos de trabajo en código.

  • Pueden llamar a otras funciones de forma sincrónica y asincrónica. La salida de las funciones llamadas puede guardarse en variables locales.

  • Comprueban automáticamente su progreso cada vez que la función espera. El estado local nunca se pierde si el proceso se recicla.

Por poner un par de ejemplos, podríamos generar un flujo de trabajo en el que fuéramos encadenando distintas funciones en base a eventos relacionados con escrituras en BD. Lo que se conoce como Function Chaining que es el patrón de ejecución de una secuencia de funciones en un orden determinado. A menudo la salida de una función necesita ser aplicada a la entrada de otra función. Aquí un ejemplo.

image-20210705163823690

O podemos ejecutar un trabajo con múltiples funciones en paralelo para acelerar el procesado del mismo y esperar a que terminen todas para continuar nuestro flujo de trabajo por donde deseemos.

image-20210705163933258

Hospedaje y Escalado

Tenemos distintos tipos de hospedajes y posibilidades de escalado a la hora de configurar nuestras Azure Functions que debemos de tener en cuenta para nuestras necesidades:

  • Plan de consumo. Que nos permite escalar de forma automática y pagar sólo por el tiempo de procesamiento de nuestra Azure Function. Tiene cierto tiempo de demora (Cold Start) para las funciones que no han sido llamadas en los últimos minutos, por lo que dependiendo del escenario que estés manejando no se adapte a tus necesidades. Tiene limitación en tiempo de ejecución de hasta 5 minutos.

  • Plan Premium. Escala de forma automática y se ejecuta sin retraso (no hay Cold Start), las instancias que ejecuta tienen mejor rendimiento y el tiempo de ejecución de las mismas puede ser de hasta 30 minutos.

  • Plan dedicado. Se ejecuta en un App Service siguiendo la política de precios de estos. Es interesante en casos de escenarios de ejecuciones prolongadas en las que no vamos a hacer uso de Azure Durable Functions, o para tener un escalado y control del coste sin sorpresas.


Compartir este post

También te puede interesar...

Tecnología

Qué es Azure: Introducción a la nube de Microsoft

28 Octubre 2019 Jesus Lucas
AZ-900: Servicios, soluciones y herramientas en Azure

Curso AZ-900 Parte 1: Servicios, soluciones y herramientas en Azure

3 horas y 49 minutos · Empresas

En este primer curso preparatorio para la certificación AZ-900: Microsoft Azure Fundamentals, aprenderás los diferentes modelos de nube que existen, los servicios principales que nos …

  • Azure
Curso de administración de Azure

Curso de administración de Azure

1 hora y 32 minutos · Empresas

Este curso es esencial para aquellos que buscan profundizar en el mundo del almacenamiento y la administración de recursos en Microsoft Azure. Si tienes nociones …

  • Azure
Artículos
Ver todos