In one of my post I wrote about creating infrastructure for Azure WebJob using PowerShell. It is imperative approach using PowerShell cmdlets. More DevOps friendly alternative to this is to use declarative approach together with infrastructure as code approach using Terraform. Infrastructure for Azure WebJob consists of 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
To create required Azure resources create file named main.tf
and place following content into it:
terraform { required_providers { azurerm = { source = "hashicorp/azurerm" version = ">= 2.0" } } } provider "azurerm" { features {} } variable "resource_group_name" { type = string description = "Resource group name" default = "WinServiceToAzureTest" } variable "location_name" { type = string description = "Resource location" default = "westeurope" } resource "azurerm_resource_group" "rg" { name = var.resource_group_name location = var.location_name } resource "azurerm_app_service_plan" "asp" { name = var.resource_group_name location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name sku { tier = "Basic" size = "B1" } } resource "azurerm_app_service" "as" { name = var.resource_group_name location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name app_service_plan_id = azurerm_app_service_plan.asp.id } resource "azurerm_storage_account" "sa" { name = lower(var.resource_group_name) location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name account_tier = "Standard" account_replication_type = "LRS" } resource "azurerm_application_insights" "ai" { name = var.resource_group_name location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name application_type = "web" }
Then run terraform init
command to download providers and initialize state. To see planned infrastructure changes run the terraform plan
command. As a final step the infrastructure will be created using terraform apply
command.
Azure WebJob requires some additional settings which can be done manually using Azure Portal, but it is possible to implement them in code. Next code snippet shows changes in azurerm_app_service
resource where is disabled client affinity, added site config, instrumentation key for Application Insights and connection strings to Storage Account:
resource "azurerm_app_service" "as" { name = var.resource_group_name location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name app_service_plan_id = azurerm_app_service_plan.asp.id client_affinity_enabled = false site_config { use_32_bit_worker_process = false always_on = true } app_settings = { "APPINSIGHTS_INSTRUMENTATIONKEY" = azurerm_application_insights.ai.instrumentation_key } connection_string { name = "AzureWebJobsDashboard" type = "Custom" value = "DefaultEndpointsProtocol=https;AccountName=${lower(var.resource_group_name)};AccountKey=${azurerm_storage_account.sa.primary_access_key};EndpointSuffix=core.windows.net" } connection_string { name = "AzureWebJobsStorage" type = "Custom" value = "DefaultEndpointsProtocol=https;AccountName=${lower(var.resource_group_name)};AccountKey=${azurerm_storage_account.sa.primary_access_key};EndpointSuffix=core.windows.net" } }
With this changes are Azure resources prepared for deployment of Azure WebJob.
If you are interested in Azure WebJobs and how to use them to migrage Windows service to Azure, take my Udemy course Migrate Windows service to Azure.