Azure Functions forma parte del servicio de computación sin servidor de Microsoft. Te permite ejecutar pequeños fragmentos de código en respuesta a eventos sin gestionar servidores por tu cuenta.
Por ejemplo, una función puede ejecutarse cuando llega una solicitud HTTP, cuando se sube un archivo al almacenamiento o cuando llega una hora programada.
"Serverless" no significa que no haya servidores, sino que Azure gestiona la infraestructura por ti. Azure se encarga del aprovisionamiento, la escalabilidad y el mantenimiento entre bambalinas.
En esta guía cubriré las piezas clave: los triggers, los bindings, las opciones de hosting y un ejemplo práctico para que empieces.
¿Qué son las Azure Functions?
Una Azure Function es un pequeño bloque de código que se ejecuta cuando lo activa un evento que tú eliges. Tú escribes la lógica y Azure se ocupa del resto.
Este modelo se basa en tres ideas:
- La ejecución basada en eventos hace que el código solo corra cuando pasa algo, no todo el tiempo.
- La escalabilidad automática permite a Azure añadir o quitar recursos de cómputo según la demanda.
- El precio por consumo te permite, en algunos planes de hosting, pagar solo por el tiempo en que tu código realmente se ejecuta.
Lo ideal es que cada función haga una sola tarea, como redimensionar una imagen o procesar un mensaje. Una Function App es el contenedor que agrupa una o más funciones. Gestiona la configuración y el despliegue compartidos de todas las funciones que contiene.
Cómo funcionan las Azure Functions
El ciclo de vida de una función sigue un patrón sencillo:
- Ocurre un evento, como una subida de archivo o una llamada HTTP.
- Un trigger detecta el evento e inicia la función al instante.
- La función ejecuta su código.
- Los bindings conectan la función con otros servicios que leen la entrada o envían la salida necesaria.
- Azure gestiona los recursos de cómputo detrás de este proceso, en función del plan de hosting que elijas.
Este flujo es prácticamente igual independientemente del lenguaje o el hosting. Solo cambian el trigger, el código y los bindings.
Triggers de Azure Functions
Cada función tiene exactamente un trigger. El trigger define cómo arranca la función. Estos son los tipos más comunes que deberías conocer:
- HTTP trigger: Ejecuta una función al recibir una solicitud HTTP. Es habitual para crear APIs.
- Timer trigger: Ejecuta una función según una programación, por ejemplo, cada hora o una vez al día.
- Blob Storage trigger: Ejecuta una función cuando se añade o cambia un archivo en Azure Blob Storage.
- Queue trigger: Ejecuta una función cuando llega un mensaje nuevo a una cola.
- Event Hub trigger: Ejecuta una función en respuesta a un flujo de eventos. Muy útil para grandes volúmenes de datos.
- Cosmos DB trigger: Ejecuta una función cuando se crean o actualizan documentos en un contenedor de Cosmos DB, aprovechando su Change Feed.
- Service Bus trigger: Ejecuta una función en respuesta a mensajes de una cola o topic de Azure Service Bus, habitual en mensajería empresarial y para desacoplar sistemas.
- Durable Functions: Una extensión de Azure Functions que permite escribir funciones con estado en un entorno serverless para orquestar flujos de trabajo complejos y de varios pasos.
Bindings de Azure Functions
Los triggers y los bindings se confunden a menudo, pero aunque parezcan similares, hacen trabajos distintos. Un trigger inicia una función; un binding la conecta a los datos, ya sea para leerlos o para enviarlos.
Bindings de entrada
Aquí proporcionas datos a tu función sin escribir código de integración a medida. Por ejemplo, una función puede leer un registro de una base de datos automáticamente con solo declarar el binding.
Bindings de salida
Te permiten enviar el resultado de tu función a otro lugar. Por ejemplo, puedes escribir un mensaje procesado en una cola mediante un binding de salida.
Un ejemplo para verlo claro: un trigger de Blob Storage inicia una función cuando se sube una imagen. Un binding de salida guarda la imagen redimensionada en otro contenedor de almacenamiento. Los bindings gestionan las conexiones al almacenamiento y no hace falta escribir código manual del cliente de almacenamiento.
Cómo crear tu primera Azure Function
Aquí tienes un ejemplo de una función sencilla con trigger HTTP que devuelve un saludo. El flujo sería:
- Crear una Function App, el contenedor de tu función en Azure.
- Elegir un runtime y el lenguaje en el que quieres programar.
- Añadir una función nueva dentro de tu Function App.
- Seleccionar el trigger HTTP para que la función responda a solicitudes web.
- Añadir una lógica simple, como leer un nombre de la solicitud y devolver "Hola, [nombre]".
- Ejecutarla y probarla con las herramientas integradas o enviando una solicitud desde tu navegador.
- Desplegarla en Azure para que quede activa y accesible.
He hecho este ejemplo a propósito muy pequeño para mostrarte el patrón y que tu creatividad haga el resto.
Lenguajes compatibles con Azure Functions
Azure Functions es compatible con varios lenguajes, como:
- C#
- JavaScript/TypeScript
- Python
- Java
- PowerShell
El soporte y los modelos de desarrollo pueden variar según el lenguaje y la versión. Te recomiendo revisar la documentación de Azure actual antes de empezar un proyecto nuevo, ya que estos detalles cambian con frecuencia.
Opciones de hosting de Azure Functions
No todas las Azure Functions se ejecutan igual. Azure ofrece varios planes de hosting, cada uno con sus pros y contras. La elección correcta depende de tu caso. Los principales compromisos son:
- Escalado: algunos planes escalan de forma automática e instantánea, mientras que otros requieren algo más de control manual.
- Arranque: algunos planes mantienen las funciones "calientes", listas para ejecutarse al instante; otros las inician bajo demanda.
- Red: algunos planes admiten funciones avanzadas de red, como conectarse a una red virtual privada; otros no.
- Coste: los modelos de precios varían mucho, desde pago por ejecución hasta costes mensuales fijos.
Escalado y cold starts en Azure Functions
En producción hay dos conceptos más que importan:
Escalado automático
Azure supervisa la carga de tu función y, cuando la demanda sube, añade más instancias de cómputo; cuando baja, las retira. No tienes que gestionarlo manualmente.
Cold starts
Si una función no se ha ejecutado recientemente, puede necesitar un momento para arrancar antes de atender una nueva solicitud. Ese retraso es el cold start. Algunos planes de hosting lo reducen o evitan manteniendo la instancia caliente, como hemos comentado.
Casos de uso comunes de Azure Functions
El modelo basado en eventos encaja con muchos problemas del día a día. En particular:
APIs y webhooks
Para gestionar solicitudes HTTP entrantes sin tener que ejecutar un servidor web 24/7.
Procesado de archivos e imágenes
Activa una función cuando llega un archivo al almacenamiento y luego redimensiónalo, conviértelo o analízalo.
Tareas programadas
Para ejecutar limpiezas, informes o recordatorios con un temporizador sin necesitar un servidor dedicado siempre activo.
Canales de procesamiento de datos
Para procesar mensajes o eventos a medida que llegan, paso a paso.
IoT y procesamiento de eventos
Para manejar grandes volúmenes de datos de sensores o dispositivos según van llegando.
Tareas en segundo plano
Para descargar trabajo lento u ocasional, como enviar emails, y que no bloquee tu aplicación principal.
Supervisión y resolución de problemas en Azure Functions
Una vez en producción, necesitas visibilidad de su rendimiento.
Puedes, por ejemplo, ver los logs que registran lo ocurrido en cada ejecución, muy útiles para depurar. También puedes consultar Application Insights en las herramientas de Azure, que centraliza el seguimiento de rendimiento, solicitudes y errores.
Conviene seguir los fallos de invocación para saber cuándo y por qué una función no terminó. Monitorizar el rendimiento te ayuda a detectar funciones lentas antes de que sean un problema y, por supuesto, puedes configurar reintentos para que las ejecuciones fallidas se intenten de nuevo automáticamente.
Conclusión
Azure Functions te permite ejecutar código en respuesta a eventos sin gestionar los servidores subyacentes. Los triggers deciden cuándo arranca una función. Los bindings, por su parte, facilitan conectar esa función con otros servicios sin código de integración adicional.
A medida que pases de una función de prueba a algo en producción, las decisiones de hosting y escalado cobran más peso. El plan adecuado afecta al coste, pero también a la velocidad y a la fiabilidad.
Azure Functions forma parte del servicio de computación sin servidor de Microsoft. Te permite ejecutar pequeños fragmentos de código en respuesta a eventos sin gestionar servidores por tu cuenta.
Por ejemplo, una función puede ejecutarse cuando llega una solicitud HTTP, cuando se sube un archivo al almacenamiento o cuando llega una hora programada.
"Serverless" no significa que no haya servidores, sino que Azure gestiona la infraestructura por ti. Azure se encarga del aprovisionamiento, la escalabilidad y el mantenimiento entre bambalinas.
En esta guía cubriré las piezas clave: los triggers, los bindings, las opciones de hosting y un ejemplo práctico para que empieces.
¿Qué son las Azure Functions?
Una Azure Function es un pequeño bloque de código que se ejecuta cuando lo activa un evento que tú eliges. Tú escribes la lógica y Azure se ocupa del resto.
Este modelo se basa en tres ideas:
Lo ideal es que cada función haga una sola tarea, como redimensionar una imagen o procesar un mensaje. Una Function App es el contenedor que agrupa una o más funciones. Gestiona la configuración y el despliegue compartidos de todas las funciones que contiene.
Cómo funcionan las Azure Functions
El ciclo de vida de una función sigue un patrón sencillo:
Este flujo es prácticamente igual independientemente del lenguaje o el hosting. Solo cambian el trigger, el código y los bindings.
Triggers de Azure Functions
Cada función tiene exactamente un trigger. El trigger define cómo arranca la función. Estos son los tipos más comunes que deberías conocer:
Bindings de Azure Functions
Los triggers y los bindings se confunden a menudo, pero aunque parezcan similares, hacen trabajos distintos. Un trigger inicia una función; un binding la conecta a los datos, ya sea para leerlos o para enviarlos.
Bindings de entrada
Aquí proporcionas datos a tu función sin escribir código de integración a medida. Por ejemplo, una función puede leer un registro de una base de datos automáticamente con solo declarar el binding.
Bindings de salida
Te permiten enviar el resultado de tu función a otro lugar. Por ejemplo, puedes escribir un mensaje procesado en una cola mediante un binding de salida.
Un ejemplo para verlo claro: un trigger de Blob Storage inicia una función cuando se sube una imagen. Un binding de salida guarda la imagen redimensionada en otro contenedor de almacenamiento. Los bindings gestionan las conexiones al almacenamiento y no hace falta escribir código manual del cliente de almacenamiento.
Cómo crear tu primera Azure Function
Aquí tienes un ejemplo de una función sencilla con trigger HTTP que devuelve un saludo. El flujo sería:
He hecho este ejemplo a propósito muy pequeño para mostrarte el patrón y que tu creatividad haga el resto.
Lenguajes compatibles con Azure Functions
Azure Functions es compatible con varios lenguajes, como:
El soporte y los modelos de desarrollo pueden variar según el lenguaje y la versión. Te recomiendo revisar la documentación de Azure actual antes de empezar un proyecto nuevo, ya que estos detalles cambian con frecuencia.
Opciones de hosting de Azure Functions
No todas las Azure Functions se ejecutan igual. Azure ofrece varios planes de hosting, cada uno con sus pros y contras. La elección correcta depende de tu caso. Los principales compromisos son:
Escalado y cold starts en Azure Functions
En producción hay dos conceptos más que importan:
Escalado automático
Azure supervisa la carga de tu función y, cuando la demanda sube, añade más instancias de cómputo; cuando baja, las retira. No tienes que gestionarlo manualmente.
Cold starts
Si una función no se ha ejecutado recientemente, puede necesitar un momento para arrancar antes de atender una nueva solicitud. Ese retraso es el cold start. Algunos planes de hosting lo reducen o evitan manteniendo la instancia caliente, como hemos comentado.
Casos de uso comunes de Azure Functions
El modelo basado en eventos encaja con muchos problemas del día a día. En particular:
APIs y webhooks
Para gestionar solicitudes HTTP entrantes sin tener que ejecutar un servidor web 24/7.
Procesado de archivos e imágenes
Activa una función cuando llega un archivo al almacenamiento y luego redimensiónalo, conviértelo o analízalo.
Tareas programadas
Para ejecutar limpiezas, informes o recordatorios con un temporizador sin necesitar un servidor dedicado siempre activo.
Canales de procesamiento de datos
Para procesar mensajes o eventos a medida que llegan, paso a paso.
IoT y procesamiento de eventos
Para manejar grandes volúmenes de datos de sensores o dispositivos según van llegando.
Tareas en segundo plano
Para descargar trabajo lento u ocasional, como enviar emails, y que no bloquee tu aplicación principal.
Supervisión y resolución de problemas en Azure Functions
Una vez en producción, necesitas visibilidad de su rendimiento.
Puedes, por ejemplo, ver los logs que registran lo ocurrido en cada ejecución, muy útiles para depurar. También puedes consultar Application Insights en las herramientas de Azure, que centraliza el seguimiento de rendimiento, solicitudes y errores.
Conviene seguir los fallos de invocación para saber cuándo y por qué una función no terminó. Monitorizar el rendimiento te ayuda a detectar funciones lentas antes de que sean un problema y, por supuesto, puedes configurar reintentos para que las ejecuciones fallidas se intenten de nuevo automáticamente.
Conclusión
Azure Functions te permite ejecutar código en respuesta a eventos sin gestionar los servidores subyacentes. Los triggers deciden cuándo arranca una función. Los bindings, por su parte, facilitan conectar esa función con otros servicios sin código de integración adicional.
A medida que pases de una función de prueba a algo en producción, las decisiones de hosting y escalado cobran más peso. El plan adecuado afecta al coste, pero también a la velocidad y a la fiabilidad.