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:
Le damos un nombre y seleccionamos el trigger «Http trigger»:
La solución se abrirá con algo de código de ejemplo. Lo podemos ejecutar localmente dándole a F5:
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:
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:
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
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:
Finalmente hacemos click en Publish y se desplegará nuestra función en Azure.
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.