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.