En este artículo definiremos qué es una Azure Function y explicaremos todo el proceso para realizar una migración desde .NetFramework a .Net 5 Isolated. Para ello iremos paso a paso: desde la migración de archivos de proyecto, host, archivo local, migración de Azure Functions y herramientas y cambios a emplear.
Es un servicio en la nube que está disponible bajo una petición olvidándonos del diseño de infraestructura necesaria para ejecutar una aplicación o servicio. Para los desarrolladores es importante debido a que solo tienen que centrarse en insertar los fragmentos de código que necesitemos según el lenguaje que programemos la Azure Function y del resto ya que ocupa la infraestructura de Azure, es decir, del servidor necesario para alojar la Azure Function se encargará Microsoft.
Permite una diversidad de aplicaciones como API web, realizar cambios en base de datos, llamar a servicios web en base a un cambio en cierto proceso o registro, procesar peticiones de IoT, administrar mensajes encolados de colas de Service Bus, etcétera.
En este artículo veremos cómo migrar una Azure Function donde se utiliza .NetFramework a .Net 5.0, 6.0, X.0 que será el estándar a partir de ahora.
El primer paso que necesitamos realizar es actualizar los valores de los archivos de proyecto de tipo Azure Function a migrar.
Para ello tenemos que localizar el archivo .csproj asociado al proyecto en nuestro directorio. Se recomienda tener el proyecto descargado en la solución en caso de tener abierta la solución para evitar conflictos, posteriormente volveremos a cargar el proyecto.
Una vez localizado el archivo .csproj procedemos a editarlo. Los cambios por realizar en el archivo son de los valores: TargetFramework y PackageReferences:
.NetFramework | .Net 5.0 |
TargetFrameWork | |
net4xxx | net5.0 |
AzureFunctionsVersion | |
v1 | v3 |
_FunctionsSkipCleanOutput | |
- | true |
PackageReferences | |
Microsoft.AspNet.WebApi.Client | |
Microsoft.Azure.WebJobs.ServiceBus |
Azure.Messaging.ServiceBus Microsoft.Azure.Functions.Worker.Extensions.SeviceBus |
Microsoft.NET.Sdk.Functions |
Microsoft.Azure.Functions.Worker Microsoft.Azure.Functions.Worker.Sdk Microsoft.Azure.Functions.Worker.Extensions.Http |
Microsoft.ApplicationInsights |
Microsoft.ApplicationInsights Microsoft.ApplicationInsights.AspNetCore |
Microsoft.CSharp | - |
System.Configuration | - |
System.Net | - |
System.Net.Http | - |
Tras los cambios anteriores, procedemos a cargar el proyecto en la solución abrir la solución que incluye el archivo de proyecto migrado.
Necesitaremos que agregar de nuget los paquetes declarados anteriormente:
Microsoft.Azure.Functions.Worker
Microsoft.Azure.Functions.Worker.Sdk
Estas referencias nos proporcionarán un aislamiento de ejecución del proceso anfitrión donde se ejecutarán las Azure Function.
Finalmente, tendremos que añadir o editar el archivo Program.cs de nuestro proyecto para crear el proceso host Isolated que se ejecutara.
Nuestro archivo Program.cs deberá tener el siguiente código al menos para un funcionamiento correcto:
class Program
{
static Task Main(string[] args)
{
var host = new HostBuilder()
.ConfigureFunctionsWorkerDefaults()
.Build();
return host.RunAsync();
}
}
A continuación, cambiaremos la versión del archivo host.json de nuestro proyecto por el siguiente valor:
.NetFramework | .Net 5.0 |
version | |
1.0 | 2.0 |
En caso de no tener el archivo, procedemos a crearlo con la siguiente configuración:
.NetFramework | .Net 5.0 |
FUNCTIONS_WORKER_RUNTIME | |
dotnet | dotnet-isolated |
Para poder depurar las Azure Function con la configuración:
donet-isolated
necesitaremos desde Visual Studio asociar al proceso con identificador que veremos a continuación una vez ejecutada la compilación del proyecto.
Necesitamos reemplazar las siguientes configuraciones en las Azure Function:
.NetFramework | .Net 5.0 |
Atributo de declaración de función | |
FunctionName | Function |
Logger | |
ILogger | FunctionContext |
En los archivos Program.cs de cada Azure Function necesitamos agregar cierta configuración como puede ser ApplicationInsight, Login, Inyección de dependencias, … o cargar un archivo de configuración personalizado.
Ejemplo de configuración adicional:
class Program
{
static Task Main(string[] args)
{
var configBuilder = new ConfigurationBuilder().AddJsonFile("appsettings.json", optional: true, reloadOnChange: true).Build();
var telemetryConfiguration = new TelemetryConfiguration(configBuilder["APPINSIGHTS_INSTRUMENTATIONKEY"]);
telemetryConfiguration.TelemetryInitializers.Add(new OperationCorrelationTelemetryInitializer());
var _config = new ConfigurationInitializer(telemetryConfiguration);
var host = new HostBuilder()
.ConfigureAppConfiguration(configurationBuilder =>
{
configurationBuilder.AddCommandLine(args);
})
.ConfigureFunctionsWorkerDefaults()
.ConfigureServices(services =>
{
// Add Logging
services.AddLogging();
// Add HttpClient
services.AddHttpClient();
//Add ApplicationInsight
services.AddSingleton<TelemetryConfiguration>(telemetryConfiguration);
// Add Custom Services
services.AddSingleton<ConfigurationInitializer>(_config);
})
.Build();
return host.RunAsync();
}
}
Dependiendo del desencadenador que tengan las Azure Function a migrar: Http, ServiceBus, Timer, EventHubs, Storages, … necesitaremos referenciar al proyecto diferentes paquetes de nuget que comparten el siguiente espacio de nombre de forma común :
Microsoft.Azure.Functions.Worker.Extensions.XXXX
Puedes encontrar el listado completo aquí.
Nota : ILogger se encuentra ahora dentro de FunctionContext con la función :
GetLogger<ilogger>()</ilogger>
.NetFramework | .Net 5.0 |
Request de petición | |
HttpRequest | HttpRequestData |
Response de la petición | |
IActionResult | HttpResponseData |
.NetFramework | .Net 5.0 |
Request de petición | |
HttpRequest | HttpRequestData |
Response de la petición | |
IActionResult | HttpResponseData |
npm i -g azure-functions-core-tools@3 --unsafe-perm true –force
Nota: Antes de ejecutar el siguiente comando necesitamos tener instalada previamente la herramienta npm. En caso de no tener necesitamos ejecutar el siguiente comando desde una ventana de consola de Windows:
npm install -g npm
Para poder depurar las Azure Function necesitamos situarnos con una ventana de consola de Windows, powershell o desde el propio IDE de Visual Studio en la ruta del archivo host.json donde está definida la configuración. Una vez situados en el directorio del archivo host.json ejecutamos el siguiente comando :
func start –verbose true dotnet-isolated
Una vez ejecutado el comando se realizará la compilación de las Azure Function y en caso de que todo este correctamente configurado debería de aparecernos los Jobs encontrados y públicos definidos en nuestro proyecto.
Importante revisar que finalmente azure-functions-core-tools nos muestra las Functions públicas en el proyecto e importante anotar el identificador del proceso resaltado anteriormente: PID 21032.
Este identificador será el que tengamos que seleccionar al Asociar nuestro proyecto de Azure Functions desde Visual Studio para poder depurar las Azure Function que desencadenaremos a posteriori:
Nota: Podremos encontrar el identificador del proceso realizando un filtrado de procesos en el campo de búsqueda con el valor: dotnet.
A veces es necesario detectar la compilación o el entorno en el que nos encontramos. En .Net 5.0 isolated cambia la configuración que nuestros proyectos deben de detectar dicha configuración.
.NetFramework | .Net 5.0 |
Environment | |
IHostingEnvironment | IWebHostEnvironment |
IHostingEnvironment.IsDevelopment() | Microsoft.Extensions.Hosting Environments.Development.Equals (IWebHostEnvironment.EnvironmentName) |
Una vez terminada la configuración y probado en local nuestras Azure Functions, antes de publicar en Azure tenemos que realizar cierta configuración previa debido al framework utilizado .Net 5.0 isolated.
Para ello sino lo estamos, nos volvemos a situar mediante consola cmd o powershell en Windows en la ruta del proyecto donde tenemos el archivo: host.json.
Lo primero que tenemos que realizar es loguearnos con una cuenta con permisos en Azure mediante el siguiente comando:
az login
Aparecerá una ventana donde se nos solicitaran las credenciales y una vez introducidas volveremos a la ventana de consola cmd o powershell.
az functionapp config set --net-framework-version v5.0 --name <azure_function_app> --resource-group <grupo_de_recursos>
Tras el comando anterior y para finalizar la publicación en Azure ejecutaremos el siguiente y último comando:
func azure functionapp publish <azure_function_app>
Si todo funciona correctamente, veremos un mensaje en pantalla parecido al siguiente:
Nota:
azure_function_app: Indicaremos el nombre del recurso de tipo Azure Function creado en Azure pendiente de publicar.
grupo_de_recursos: Indicaremos el nombre del grupo de recursos donde se encuentra la Azure Function creada y que queremos publicar.
Los principales cambios por realizar en las Azure Function son los mencionados anteriormente, espero que sirva de ayuda al tener toda la información centrada en un solo artículo y evitar tener que hacer búsquedas por internet recopilando toda la información necesaria para la migración de framework.