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:

ngrok.exe http 7071

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

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:

public static class Function1
{
    [FunctionName("Function1")]
    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;
        string responseMessage = string.IsNullOrEmpty(name)
            ? "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response."
            : $"Hello, {name}. This HTTP triggered function executed successfully.";
        return new OkObjectResult(responseMessage);
    }
}

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:

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

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.

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»:

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

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:

¡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.

¡Suscríbete!

Recibe un correo cuando se publique un nuevo post
Author

Microsoft Dynamics 365 Finance & Operations technical architect and developer. Business Applications MVP since 2020.

Write A Comment

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

ariste.info