In the past I wrote a post how to migrate Windows service to Azure using Azure WebJobs. Another option for migration of Windows service to Azure is to use Azure Functions.
Windows service I want to migrate to Azure acts as runtime for execution of scheduled jobs using Timer
, which run every 60 seconds to execute scheduled jobs. JobSchedulerService
execute JobExecutor.Execute()
method every 60 seconds as visible in source code of Windows service:
public partial class JobSchedulerService : ServiceBase { private Timer timer; public JobSchedulerService() { InitializeComponent(); } protected override void OnStart(string[] args) { timer = new Timer(); timer.Elapsed += OnTimer; timer.Interval = 60 * 1000; timer.Start(); } protected override void OnStop() { timer.Stop(); } private void OnTimer(object sender, ElapsedEventArgs e) { JobExecutor.Execute(); } }
To convert Windows service to Azure Function, add new project to Visual Studio solution:
Select Azure Functions v1 (.NET Framework) as version, because Windows service is build on .NET Framework 4.7.2. Then select Timer trigger, none Storage Account and enter schedule “0 * * * * *”, which is CRON expression for triggering run every 60 seconds.
Code changes in function are simple, only call of JobExecutor.Execute()
is added into Run
method:
public static class JobSchedulerFunction { [FunctionName("JobSchedulerFunction")] public static void Run([TimerTrigger("0 * * * * *")]TimerInfo timer, TraceWriter log) { JobExecutor.Execute(); } }
Next step is to create Azure resources to run Azure Function using Azure CLI:
# Before running this script check if Application Insights extension is installed: # az extension show --name application-insights # If not installed, install it by: # az extension add --name application-insights az group create --name WinServiceToAzureTest --location westeurope az storage account create --resource-group WinServiceToAzureTest --name winservicetoazuretest --sku Standard_LRS --kind StorageV2 az monitor app-insights component create --resource-group WinServiceToAzureTest --app WinServiceToAzureTest --location westeurope --kind web az functionapp create --name WinServiceToAzureTest --resource-group WinServiceToAzureTest --storage-account winservicetoazuretest --app-insights WinServiceToAzureTest --consumption-plan-location westeurope --runtime dotnet az functionapp config appsettings set --name WinServiceToAzureTest --resource-group WinServiceToAzureTest --settings "FUNCTIONS_EXTENSION_VERSION=~1"
After finishing of run is created new Resource Group, Storage Account, Application Insights and finally Function App. Important part is here to set Azure Functions runtime to version 1 using application setting FUNCTIONS_EXTENSION_VERSION
.
Deployment of Azure Functions to Azure can be done by combination of PowerShell and Azure CLI:
Compress-Archive -Path .\bin\Release\net472\* -DestinationPath WindowsServiceToAzure.Job.Function.zip az functionapp deployment source config-zip --resource-group WinServiceToAzureTest --name WinServiceToAzureTest --src .\WindowsServiceToAzure.Job.Function.zip
After deployment is Azure Function running, which is visible on Function App dashboard:
Azure Function integration diagram displays function input and outputs:
Detailed logs about the activity of Azure Function is visible in monitor:
Cleanup of used Azure resources can be done using Azure CLI:
az group delete --name WinServiceToAzureTest --yes -y
If you are interested in Windows services and how to migrate them to Azure, take my Udemy course Migrate Windows service to Azure.