In my previous post I wrote about creating infrastructure for Azure WebJob using Terraform. Using that solution is created empty infrastructure ready for deployment of Azure WebJob, but the deployment of Azure WebJob have to be done separately.
Terraform provides also options to deploy Azure WebJob immediately after required Azure resources are created. It is posible by combination of Terraform provisioner together with Azure CLI command az webapp deployment as demonstrated in following code snippet:
resource "null_resource" "webjob" {
provisioner "local-exec" {
when = create
command = "az webapp deployment source config-zip -g ${var.resource_group_name} -n ${var.resource_group_name} --src ${var.deployment_package}"
}
depends_on = [ azurerm_app_service.as ]
}
Terraform provisioner is executed locally at creation of resource and is placed in null_resource which has dependency on azurerm_app_service.as resource. Complete main.tf file which is responsible for creating Azure resources and then deployment of Azure WebJob is:
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"
}
variable "deployment_package" {
type = string
description = "Deployment package"
default = "Publish.zip"
}
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
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"
}
}
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"
}
resource "null_resource" "webjob" {
provisioner "local-exec" {
when = create
command = "az webapp deployment source config-zip -g ${var.resource_group_name} -n ${var.resource_group_name} --src ${var.deployment_package}"
}
depends_on = [ azurerm_app_service.as ]
}
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.
