Migrar AZFunction de .NetFramework a .Net 5 Isolated

Introducción

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.

Qué es una Azure Function

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.

Migrar archivo de proyecto (.csproj)

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();
        }
    }

Migrar archivo host (host.json)

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

Migrar archivo local.settings.json

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.

Migrar Azure Functions

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>

Azure Functions con desencadenador HttpTrigger

.NetFramework .Net 5.0
Request de petición
HttpRequest HttpRequestData
Response de la petición
IActionResult HttpResponseData

 

Azure Functions con desencadenador TimerTrigger

.NetFramework .Net 5.0
Request de petición
HttpRequest HttpRequestData
Response de la petición
IActionResult HttpResponseData

Configurar depuración de Azure Functions en local con .Net 5 Isolated

  • Necesitamos instalar la herramienta Azure Functions Core Tools. Podemos instalar la herramienta con el siguiente comando desde una ventana de consola cmd o powershell en Windows:
    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.

    Migrar azure functions

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

Migración azure

Nota: Podremos encontrar el identificador del proceso realizando un filtrado de procesos en el campo de búsqueda con el valor: dotnet.

Cambios menores necesarios

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)

Publicar Azure Funtions en Azure

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:

migrar azure functions

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.

Resumen

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.

 

 

 

Tags

He leído y acepto la política de privacidad
Acepto recibir emails sobre actividades de recruiting NTT DATA