Azure infrastructure for Azure WebJob consists from following resources:
- App Service Plan – scalable cluster of web servers
- Web App – hosting environment running on App Service plan
- Storage Account – stores data about Azure WebJob execution
- Application Insights – monitoring
All there resources can be created using following PowerShell script:
$resourceGroup = $(throw "Resource group is required"),
$location = "westeurope"
$resourceGroupLower = $resourceGroup.ToLower()
New-AzResourceGroup -Name $resourceGroup -Location $location -ErrorAction Stop
New-AzAppServicePlan -Name $resourceGroup -ResourceGroupName $resourceGroup `
-Location $location -Tier Basic -WorkerSize Small -NumberofWorkers 1 -ErrorAction Stop
New-AzWebApp -Name $resourceGroupLower -ResourceGroupName $resourceGroup `
-Location $location -AppServicePlan $resourceGroup -ErrorAction Stop
New-AzStorageAccount -Name $resourceGroupLower -ResourceGroupName $resourceGroup `
-Location $location -SkuName Standard_LRS -Kind StorageV2 -ErrorAction Stop
New-AzApplicationInsights -Name $resourceGroup -ResourceGroupName $resourceGroup `
-Location $location -Kind web -ErrorAction Stop
PowerShell script has following parameters:
- $resourceGroup – resource group name
- $location – location name with West Europe as default value
There are many posts on thema of Azure WebJob deployment using PowerShell. But I try to find the most simple solution possible and it is using the combination of PowerShell and Azure CLI.
Following PowerShell script deploys Azure WebJob:
[string] $buildOutput = $(throw "Directory with build output is required"),
[string] $resourceGroupName = $(throw "Resource group name is required"),
[string] $webAppName = $(throw "Web app name is required"),
[string] $webJobName = $(throw "Web job name is required"),
[string] $webJobType = "triggered"
$currentDir = (Get-Item .).FullName
$tempDir = "$currentDir\Temp"
$webJobDir = "$tempDir\App_Data\jobs\$webJobType\$webJobName"
New-Item $webJobDir -ItemType Directory
Copy-Item "$buildOutput\*" -Destination $webJobDir -Recurse
Compress-Archive -Path "$tempDir\*" -DestinationPath ".\$webJobName.zip"
Remove-Item $tempDir -Recurse -Force
az webapp deployment source config-zip -g $resourceGroupName -n $webAppName --src "$webJobName.zip"
PowerShell script has following parameters:
- $buildOutput – Azure WebJob build output, in my case it is bin\Release\net472 folder
- $resourceGroupName – Azure resource group name
- $webAppName – Azure Web App name running on Azure App Service
- $webJobName – Azure WebJob name
- $webJobType – Azure WebJob type (triggered/continuous)
PowerShell creates temp directory and copy build output to the temp directory. The key part here is to use defined directory structure
App_Data\jobs\$webJobType\$webJobName to deploy Azure WebJob to valid directory in Azure WebApp. Then create ZIP archive and remove temp directory. Then deploys Azure WebJob using Azure CLI command
az webapp deployment to Azure.
If you are interested in Azure WebJobs and how to use them for Windows service migration to Azure, take my Udemy course Migrate Windows service to Azure where you learn more about Azure WebJob implementation, deployment, configuration and monitoring.
Some time ago I solved problem how to migrate solution consisting from ASP.NET MVC website, Microsoft SQL Server DB and Windows Service to Microsoft Azure.
Migration of website and DB is straightforward, but migration of Windows Service can be realized different ways. Purpose of Windows Service was act as runtime for execution of scheduled jobs using
Timer, which run every 60 seconds to execute scheduled jobs as can be seen in source code:
public partial class JobSchedulerService : System.ServiceProcess.ServiceBase
private Timer timer;
protected override void OnStart(string args)
timer = new Timer();
timer.Elapsed += OnTimer;
timer.Interval = 60 * 1000; // 60 seconds
timer.AutoReset = false;
protected override void OnStop()
private void OnTimer(object sender, ElapsedEventArgs e)
JobExecutor.ExecuteScheduledJobs() method every 60 seconds. I found 3 options how to migrate this component into Azure infrastructure:
1. Azure Virtual Machine
- No code changes in Windows Service required
- The same deployment method as at on premise solution
2. Azure Cloud Service
- Price of Azure Cloud Service
- Complex code changes required
3. Azure WebJob
- No price of Azure WebJob because it is part od Azure App Service
- Minimal code changes required
Due to cost I decided for Azure WebJob. Transformation of Windows Service to Azure WebJob is simple. I created Azure WebJob project with the following implementation of
public class Program
static void Main()
var host = new JobHost();
public class Functions
public static void ExecuteJobs()
Then I created ZIP package from build output and uploaded it to Azure Portal with WebJob type Triggered and CRON schedule “0 * * * * *” to execute every 60 seconds.
If you are interested about more detailed step by step instructions, take my Udemy course Migrate Windows service to Azure. This course describes all aspects of migration Windows service to Azure and help you to find and implement cost effective solution, which help you to save the money in future.