Author: William Lacy Date: July 2025 Environment: Sandbox (Dev/Test)
This document outlines the design, implementation, and deployment of a secure and scalable sandbox infrastructure in Microsoft Azure using Terraform and Azure DevOps
resource "azurerm_resource_group" "sandbox" { name = "sandbox-rg" location = "East US" }
resource "azurerm_virtual_network" "sandbox" { name = "sandbox-vnet" address_space = ["10.0.0.0/16"] location = azurerm_resource_group.sandbox.location resource_group_name = azurerm_resource_group.sandbox.name } resource "azurerm_subnet" "sandbox" { name = "sandbox-subnet" resource_group_name = azurerm_resource_group.sandbox.name virtual_network_name = azurerm_virtual_network.sandbox.name address_prefixes = ["10.0.1.0/24"] }
resource "azurerm_windows_virtual_machine_scale_set" "sandbox_scale_set" { name = "sandbox-vmss" location = azurerm_resource_group.sandbox.location resource_group_name = azurerm_resource_group.sandbox.name sku = "Standard_F2" instances = 2 admin_username = var.admin_username admin_password = var.admin_password computer_name_prefix = "sandbox" source_image_reference { publisher = "MicrosoftWindowsServer" offer = "WindowsServer" sku = "2019-Datacenter" version = "latest" } os_disk { storage_account_type = "Standard_LRS" caching = "ReadWrite" } network_interface { name = "sandbox-nic" primary = true ip_configuration { name = "internal" primary = true subnet_id = azurerm_subnet.sandbox.id } } upgrade_mode = "Manual" }
- task: AzureKeyVault@2 inputs: azureSubscription: 'AzureSP-TFScaling' KeyVaultName: 'TFScalingKV' SecretsFilter: 'sandboxAdminUser,sandboxAdminPassword,servicePrincipalClientId,servicePrincipalClientSecret,subscriptionId,tenantId' RunAsPreJob: true
Retrieves secrets securely and makes them available as pipeline variables.
terraform { backend "azurerm" { resource_group_name = "tfstate-rg" storage_account_name = "tfstatestorageaccount1" container_name = "tfstate" key = "terraform.tfstate" } }
Enables remote state storage with locking and consistency.
- script: | terraform init terraform plan -out=tfplan terraform apply tfplan displayName: 'Run Terraform' env: TF_VAR_admin_username: $(sandboxAdminUser) TF_VAR_admin_password: $(sandboxAdminPassword) ARM_CLIENT_ID: $(servicePrincipalClientId) ARM_CLIENT_SECRET: $(servicePrincipalClientSecret) ARM_SUBSCRIPTION_ID: $(subscriptionId) ARM_TENANT_ID: $(tenantId)
trigger: branches: include: - main
Automatically runs the pipeline on changes to the main branch.
main
pool: vmImage: 'ubuntu-latest'
Uses Microsoft-hosted Ubuntu agents for Terraform execution.
variables: TF_VAR_admin_username: $(sandboxAdminUser) TF_VAR_admin_password: $(sandboxAdminPassword) ARM_CLIENT_ID: $(servicePrincipalClientId) ARM_CLIENT_SECRET: $(servicePrincipalClientSecret) ARM_SUBSCRIPTION_ID: $(subscriptionId) ARM_TENANT_ID: $(tenantId)
Injects secrets into Terraform via environment variables.
- task: TerraformInstaller@1 inputs: terraformVersion: 'latest'
Ensures the latest version of Terraform is available on the agent.
Executes the full Terraform workflow using service principal authentication.
networking
compute
identity
monitoring
dev
test
prod