Azure functions y Dynamics 365 Finance and Operations

Este es otro post sobre resolver problemas en Dynamics 365 usando herramientas externas. De todas formas, empiezo a dejar de pensar en todo lo relacionado con Azure como algo no externo. En este caso mostraré distintos escenarios usando Azure functions con Dynamics 365.

Escribí esto hace tres semanas y tenía la intención de que fuera un post de dos partes, pero después de ver este fantástico post sobre Azure functions de Fabio Filardi no sé si podría añadir nada más y probablemente lo deje aquí. ¡Leedlo!

En este post veremos qué son las Azure functions, cómo crear una localmente y publicarla en Azure.

Azure functions

Las Azure functions son un servicio serverless que nos permiten ejecutar código sin tener que desplegarlo en ningún servidor (porque son serverless). Es una herramienta magnífica que nos permite escribir código en .NET, JavaScript o Java, y desplegarlo y ejecutarlo en segundos.

Las funciones pueden ser ejecutadas por distintos eventos como llamadas HTTP, colas, Azure Event Hub y Grid o Service Bus, entre otros. Estos eventos serán los que lancen nuestra función. Vamos a ver un ejemplo en el que crearemos, desplegaremos y ejecutaremos una función con una llamada POST por HTTP.

Nota: las Azure functions se pueden crear desde el portal de Azure, pero usar Visual Studio es más potente (y más fácil también) y nos permitirá tener el código en Azure DevOps.

Creamos un nuevo proyecto en Visual Studio y seleccionamos Azure Functions:

Azure Functions in Visual Studio 2019
Azure Functions en Visual Studio 2019

Le damos un nombre y seleccionamos el trigger «Http trigger»:

Azure Functions triggers
Triggers de Azure Functions

La solución se abrirá con algo de código de ejemplo. Lo podemos ejecutar localmente dándole a F5:

Azure Functions running locally
Azure Functions ejecutándose localmente

Como podéis ver, al ejecutar el código obtenemos una URL local a la que llamamos para lanzar la función. Podemos probarlo usando Postman.

¡Un truquillo rápido!

Pero qué pasa si necesitamos testear esta función desde un servicio externo que no puede acceder a nuestra URL local? Dejad que os enseñe un truqui que me enseñó Juanan: usar ngrok.

ngrok creará un túnel y nos dará una URL pública para acceder a nuestra función de forma local. Descargadlo, descomprimidlo y poned ngrok.exe donde queráis ejecutarlo. Después abrimos el terminal y ejecutamos esto:

Dónde 7071 debería ser el mismo puerto en el que se ejecuta la función. Tendremos esto:

Azure functions y Dynamics 365 Finance and Operations 1
Azure Functions y ngrok, la pareja perfecta!

Ahora podemos llamar a nuestra función local desde donde sea usando la URL pública que nos da ngrok. Veréis además todas las llamadas en el termional. ngrok es genial! Me encanta!

Llamando a la función

Primero, vamos a ver el código:

Esta funciójn acepta llamadas GET y POST, y si le pasáis un valor en el parámetro ‘name’ tendremos una respuesta distinta que si no le pasamos nada.

Llamaré la URL local pasándole un parámetro y a ver qué obtenemos:

Azure functions y Dynamics 365 Finance and Operations 2
Respuesta de las Azure functions

En cuanto al código, podemos hacer exáctamente lo mismo que haríamos en cualquier otro proyecto de .NET por ejemplo. Podemos añadir cualquier librería de nuget, crear clases adicionales y usarlas en al función, etc. Las Azure functions nos pueden ayudar a solucionar muchos problemas y el coste es ridículo! Con el tier gratuito podemos hacer 1 millon de ejecuciones, GRATIS! El único coste que tendríamos sería la cuenta de almacenamiento, pero hablamos de céntimos al mes.

Desplegar la función

Azure functions y Dynamics 365 Finance and Operations 3
Estoooy haciendooo click derecho, publicar!!

Para desplegar la fucnión primero necesitamos crearla desde el portal de Azure. Una vez esté creada vamos a Visual Studio y hacemos click derecho en el proyecto y le damos a Publish.

Creo que será la única vez en la que podremos hacer click derecho, publicar sin que nadie nos quiera matar.

Ahora seleccionamos «Consumption plan» y seleccionamos uno existente.

Azure functions y Dynamics 365 Finance and Operations 4

Creamos el perfil y nos pedirá que seleccionemos una suscripciñon de Azure y un grupo de recursos existentes. Seleccionamos la suscripción en la que hemos creado la función y su grupo de recursos:

Azure functions publish
Publicando la Azure function

Finalmente hacemos click en Publish y se desplegará nuestra función en Azure.

Publish the function!
Publicamos la function!

Vamos al portal de Azure, seleccionamos la función que hemos creado antes y a «Functions»:

Azure functions y Dynamics 365 Finance and Operations 5

Ahí veréis vuestra función, la podéis seleccionar y darle a «Get Function Url» para tener el endpoint que la lanza:

Azure functions y Dynamics 365 Finance and Operations 6

Copiamos la URL y hacemos la llamada desde Postman, o una ventana de un navegador ya que también acepta petciones GET, y le pasamos el nombre en el parámetro:

Azure functions y Dynamics 365 Finance and Operations 7

¡Funciona! Hemos creado una función de Azure en una solución local, testeado localmente y finalmente desplegado en Azure y testeado de nuevo, esta vez en el cloud. Molan las Azure functions o no? A las Azure functions se les puede meter seguridad con AAD, Azure Key Vault, se pueden monitorear usando Application Insights y muchas más opciones.

Una nota final: cuando desplegamos una función como hemos hecho no podemos editar el código desde Azure. Necesitamos hacerlo desde Visual Studio y desplegar de nuevo.

Seguridad en Azure Pipelines con Azure Key Vault

Aquí puedes leer mi guía completa sobre Dynamics 365 for Finance and Operations y Azure DevOps.

Después de la actualización dl último post sobre llamar a la API de LCS desde Azure DevOps me di cuenta que crear una pipeline con una contraseña a la vista no era muy seguro. ¿Cómo podemos añadir un extra de seguridad a pipelines? Una vez más podemos acudir a una herramienta de Azure para ayudarnos, Azure Key Vault.

Azure Key Vault

Key Vault es un servicio que nos permite guardar certificados o secretos de forma segura y usarlos en nuestras apps o servicios. Y como muchos otros servicios de Azure tiene un coste pero es muy bajo y, para un uso normal, la factura será de 1 céntimo o ninguno al mes. ¡No seáis rancios con la seguridad!

Sigue leyendo «Seguridad en Azure Pipelines con Azure Key Vault»

Llama a la API de Movimiento de DB de LCS en tu pipeline de Azure DevOps

Aquí puedes leer mi guía completa sobre Dynamics 365 for Finance and Operations y Azure DevOps.

Hace no mucho hablé en otro post sobre la API de movimiento de base de datos de LCS, y en este quiero mostrar como llamar a la API usando PowerShell desde nuestras pipelines de Azure DevOps.

¿Para qué?

Básicamente por automatización. Ahora mismo la API sólo permite el refresco de un entorno de Microsoft Dynamics 365 for Finance and Operations a otro, así que la idea es tener datos frescos de producción en nuestros entornos de UAT a diario. No sé qué nuevas operaciones soportará la API en el futuro pero otra idea sería añadir al pipeline la exportación de la DB (creando un bacpac) de un entorno de UAT para tener datos listos para restarurar en una máquina de desarrollo. Sigue leyendo «Llama a la API de Movimiento de DB de LCS en tu pipeline de Azure DevOps»

Configurar las nuevas tareas de Azure DevOps para generar el paquete y versiones de modelos

Aquí puedes leer mi guía completa sobre Dynamics 365 for Finance and Operations y Azure DevOps.

Durante la pasada noche (que por lo menos era noche para mí :P) se han publicado las nuevas tareas de Azure DevOps para desplegar los paquetes, actualizar versiones de modelos y añadir licencias a los DPs:

Se ha publicado tambien un anuncio en los blogs de Community con más detalles acerca de la configuración. Vamos a ver las nuevas tareas y cómo configurarlas.

Sigue leyendo «Configurar las nuevas tareas de Azure DevOps para generar el paquete y versiones de modelos»

Usando Azure Application Insights con MSDyn365FO

Primero de todo… AVISO: antes de usar esto en un entorno de producción pensadlo bien. Y luego volvedlo a pensar. Y si finalmente decides usarlo, hacedlo con cuidado y cariño.

Por qué este aviso? Bueno, a pesar de que los documentos aseguran que la afectación en el rendimiento del sistema en general es mínima hay que andar con cuidado. Es un ERP. Uno en el que no tenemos acceso al entorno de producción (a no ser que estéis On-Prem) para analizar si hay impacto. Además probablemente Microsoft ya está usandolo para recoger datos de los entornos y mostrarlos en LCS, y desconozco si puede haber interferencias. Un montón de no-lo-ses.

Lo usaría en producción? . Puede ser muy útil en algunos casos.

Y dicho esto, de qué voy a escribir que necesita un aviso? Como dice el título, sobre usar Azure Application Insights en Microsoft Dynamics 365 for Finance and Operations. Este post es consecuencia de uno de los «Has visto esto? Sí, deberíamos probarlo!» entre Juanan (aquí en Twitter, seguidle!) y yo. Y el esto esta vez era este post de Lane Swenka en AX Developer Connection. Así que nada original por aquí 🙂

Azure Application Insights

I spy
Made by Cazapelusas

¿Y qué es Application Insights? Como dice la documentación:

Application Insights is an extensible Application Performance Management (APM) service for web developers on multiple platforms. Use it to monitor your blah web application. It will blah blah detect blaaah anomalies. It blah powerful blahblah tools to bleh blah blih and blah blah blaaaah. It’s blaaaaaaaah.

Mmmm… ved este vídeo mejor:

Hay tanta miseria y tristeza en los primeros 30 segundos…

Monitoreo. Eso hace y para eso es. «Eh, pero LCS ya hace eso!«. Vale, monitoreo extra! A todo el mundo le gusta lo extra, como la pizza, excepto si es piña, claro.

Haciendo que funcione

El primer paso será crear un recurso para Application Insights en nuestra suscripción de Azure. Sobre el precio: los 5 primeros gigas por mes son gratuitos, y los datos se guardan durante 90 días. Más información aquí.

Después necesitamos el código. Me voy a ahorrar los detalles en esta parte porque está perfectamente explicado en el link que he puesto antes (este). Básicamente tienes que crear una DLL para manejar los eventos y mandar la información a AAI y usar esa DLL desde MSDyn365FO. En nuestra versión hemos añadido un método extra para trazas llamado trackTrace. Después solo hay que referenciar la DLL en 365 y ya lo podemos usar.

Qué podemos medir?

Ahora viene la parte interesante (espero). Visitas de páginas, capturar errores (o todos los infologs), ejecuciones de lotes, cambios de valor de campos, y cualquier cosa que podamos extender y desde ahí llamar a nuestra API.

Por ejemplo, podemos extender la clase FormDataUtil del motor de formularios. Esta clase tiene varios métodos que se llaman desde los formularios en acciones de los datasources, como validaciones de writes, deletes, campos, etc… Y también esto:

modifiedField in FormDataUtils

Este método se ejecuta cada vez que se modifica un campo en un formulario. Lo vamos a extender para registrar qué campo se ha modificado, el valor anterior y el nuevo. Así:

Extending modifiedField
Prometo que siempre uso etiquetas!

Y como la llamada a Application Insights también guarda el usuario que ha hecho el cambio de valor, tenemos un nuevo log de la base de datos! Incluso mejor, tenemos un nuevo registro de la base de datos que no afecta al rendimiento porque no se generan datos extra en MSDyn365FO. La única pega es que solo se llamará desde formularios, pero puede ser suficiente para monitorear el uso de formularios y los “yo no he tocado ningún parámetro!” 🙂

Esto es lo que vemos en el explorador de métricas de Azure Application Insights:

Azure Application Insights Custom Event
Qué quieres decir con que he tocado eso!?

Sí, fuiste tú usuario Admin! Uy si soy yo…

Custom events

Todas las métricas de los eventos se muestra  en Azure, y los datos se pueden mostrar en Power BI.

Repito, planead bien lo que queréis monitorear antes de usar esto y testeadlo. Luego testeadlo otra vez, sobretodo en entornos SAT con bases de datos Azure SQL. Tienen un rendimiento distinto a un SQL Server normal y hay que estar seguro.

A disfrutar de los datos!