Azure Functions en Dynamics 365
En el mundo de Power Platform y Dynamics 365, el conocimiento de Azure se ha convertido en un recurso casi fundamental para lograr una integración perfecta y desbloquear todo el potencial del ecosistema que Microsoft ofrece. Como muchos sabéis, los Plugins de Dynamics tienen un límite de tiempo de ejecución de dos minutos, lo cual es adecuado en la mayoría de los casos, pero puede resultar insuficiente en escenarios más complejos y exigentes. En este artículo, se explorará en detalle el proceso de creación de una Azure Function desde cero, abriendo un mundo de posibilidades para extender las capacidades de Dynamics y Power Platform. Además, se mostrará cómo asociar esta Azure Function a un Webhook de Dataverse de manera que se ejecute de forma automática cuando ocurra un evento de interés.
Creación de Azure Function desde portal de Azure
Para la creación de nuestra Azure Function, será necesario tener instalado Visual Studio, ya que se utilizará el conocido SDK de Microsoft para interacturar con Dynamics (debemos asegurarnos de tener instalada la carga de trabajo de desarrollo de Azure) y una suscripción de Azure. En mi caso, voy a utilizar la suscripción que incluye la licencia de Visual Studio Enterprise. Una vez se tenga dicha suscripción, nos dirigiremos al portal de Azure y crearemos o elegiremos el grupo de recursos dónde crearemos nuestra Azure Function. Una vez situados en el grupo de recursos, buscaremos en el Marketplace «Azure function» y seleccionaremos la opción que se muestra en la siguiente imagen.
Seguidamente, será necesario configurar una serie de parámetros obligatorios para la creación de nuestra Azure Function tal y como los que se muestran en la imagen y que se explicarán a continuación.
- Grupo de recursos: Contenedor en el que se alojan varios recursos de Azure.
- Nombre de la aplicación de funciones: Nombre de nuestra Azure Function, este nombre debe ser único.
- Pila del entorno en tiempo de ejecución: Lenguaje en el que se implementará la Azure Function. Recomiendo utilizar .NET Core por ser una versión mejorada de .NET Framework.
- Versión: Versión de la pila del entorno. En mi caso he elegido la versión 6 de .NET Core ya que garantiza soporte a largo plazo.
- Región: Ubicación en la que se alojará nuestra Azure Function. Elegir la ubicación más cercana posible al servidor para garantizar tiempos de espera más cortos.
- Sistema operativo: En mi caso he elegido Windows ya que se integra perfectamente con .NET al tratarse de un lenguaje desarrollado por Microsoft.
Además, será necesario configurar al menos una cuenta de almacenamiento asociada a nuestra Azure Function. También es recomendable crear una aplicación de Insights para poder tener registros de las llamadas a nuestra Azure Function y supervisar si ocurre algún error o cualquier otra información que se considere relevante. Una vez finalizado este proceso, se procederá a crear nuestra Azure Function.
Implementación en Visual Studio
Ahora sí, toca la parte de implementación y publicación de nuestro código. Vamos a crear un nuevo proyecto en Visual Studio y seleccionaremos «Azure Functions» como tipo de proyecto.
Elegiremos la ubicación del proyecto y lo configuraremos con los parámetros tal y como se muestran a continuación:
- Worker de funciones: Este parámetro se refiere al entorno de ejecución donde se ejecutará nuestra Azure Function.
- Función: Define el desencadenante o evento que activará nuestra Azure Function.
- Authorization level: Este parámetro establece cómo se autenticarán las solicitudes a nuestra función. Puede ser configurado como «Function» (donde se requiere una clave de función para acceder) o «Anonymous» (donde no se requiere autenticación).
Al pulsar sobre el botón «Crear», Visual Studio generará el proyecto y una función por defecto llamada «Function1» con un código de ejemplo en el lenguaje escogido previamente.
A continuación, procederemos a instalar el Nuget Microsoft.PowerPlatform.Dataverse.Client en el proyecto, el cual nos permitirá realizar la conexión e interactuar de una forma sencilla con nuestro entorno de Dataverse.
Una vez instalado dicho Nuget, procederemos a la implementación del código. En esta ocasión, se desarrollará una funcionalidad de ejemplo bastante simple. Aunque existen otras formas mejores de abordar esta tarea, esta opción es ideal para la demostración. La idea consiste en que, al crear una nueva cuenta en Dataverse, nuestra Azure Function será invocada y obtendrá los datos de dicha cuenta a partir del contexto de ejecución igual que ocurriría con un Plugin. La función, a su vez, se encargará de crear un nuevo contacto con el nombre «Contacto de {nombre de la cuenta}».
A continuación, se muestran imágenes con el código que realiza dicha funcionalidad:
Una vez implementado todo el código, procederemos a la publicación de nuestra función en Azure. Para ello, seleccionaremos la opción «Publicar» en nuestro proyecto y elegiremos de la suscripción de Azure nuestra Azure Function creada en pasos anteriores
Se cargarán una serie de configuraciones y cuando todo esté correcto, elegiremos la opción «Publicar» como aparece en la siguiente imagen.
Registrar webhook en Dataverse
Con nuestra Azure Function ya publicada, volveremos a nuestra Azure Function en el portal de Azure. Entraremos en la función implementada (en mi caso Function1) y en la pestaña «Código y prueba» obtendremos la dirección url de la función.
Al copiar esta url, obtendremos un enlace que consta del «endpoint» de la Azure Function, el nombre de la función que deseamos invocar y una sección denominada «code». Esta última actuará como un método de autenticación necesario, ya que, de lo contrario, cualquier sistema podría acceder a esta función al ser pública.
Ejemplo:
https://azurefunctionaxazureblog.azurewebsites.net/api/Function1?code=yK3b0LupPZYxrISdTDyaBITs3Zkk6RZGaP0hMBWJ0k-YAzFuhu4iB==
Por último, ya solo queda asociar nuestra Azure Function al evento que queramos de Dataverse. En este caso, la creación de cuentas. Para ello nos iremos a la herramienta Plugin Registration Tool y registraremos un nuevo Web Hook.
Añadiremos el nombre que deseemos, el endpoint de nuestra Azure Function y los parámetros de configuración. En este casose utilizará WebhookKey y el code generado previamente en Azure.
Una vez creado solo faltaría añadir el Step deseado como si de un Plugin se tratase.
Finalmente, solo quedaría probar nuestra Azure function y verificar que funciona correctamente. Para ello, nos dirigiremos a nuestro entorno de Dataverse y crearemos una cuenta.
Es posible que la creación del contacto tarde un poco al tratarse de un procedimiento asíncrono, aunque al tratarse de una implementación sencilla y poco costosa no será mucho. Por último, volveremos a nuestra aplicación para comprobar cómo efectivamente, se ha creado el contacto correctamente.
Como conclusión, es relevante destacar que en esta instancia se ha adoptado un enfoque centrado en un evento de Dataverse. Sin embargo, este mismo enfoque puede ser aplicado a una variedad de situaciones distintas, evidenciando así el potencial ilimitado que ofrecen las Azure Functions.
Espero que esta información sea de utilidad para muchos, sirviendo como una introducción al fascinante mundo de Azure enfocado en Dynamics/Power Platform y desbloqueando un sinfín de posibilidades.