3 min read
Azure DevTest Labs: Managed Development Environments
DevTest Labs provides self-service lab environments with cost controls. Developers get VMs on-demand while admins maintain governance.
Creating a Lab
az lab create \
--resource-group myRG \
--name my-devtest-lab \
--location eastus
Custom Images
# Create image from VM
az lab custom-image create \
--lab-name my-devtest-lab \
--resource-group myRG \
--name "dev-environment-v1" \
--source-vm-id /subscriptions/.../virtualMachines/template-vm \
--os-type Windows \
--os-state Generalized \
--description "Standard dev environment with VS 2019, Docker, .NET 5"
Formulas (Reusable Configurations)
{
"name": "web-dev-formula",
"description": "Web development environment",
"formulaContent": {
"properties": {
"size": "Standard_D4s_v3",
"userName": "devuser",
"galleryImageReference": {
"offer": "visualstudio2019latest",
"publisher": "microsoftvisualstudio",
"sku": "vs-2019-comm-latest-ws2019",
"osType": "Windows",
"version": "latest"
},
"artifacts": [
{
"artifactId": "/artifacts/Windows-vscode"
},
{
"artifactId": "/artifacts/Windows-docker"
}
]
}
}
}
Artifacts (Software Installers)
{
"name": "install-nodejs",
"description": "Installs Node.js",
"targetOsType": "Windows",
"parameters": [
{
"name": "version",
"type": "string",
"defaultValue": "14.x",
"allowedValues": ["12.x", "14.x", "16.x"]
}
],
"runCommand": {
"commandToExecute": "powershell.exe -File install-nodejs.ps1 -Version $version"
}
}
Cost Management
Auto-Shutdown
az lab vm set-schedule \
--lab-name my-devtest-lab \
--resource-group myRG \
--name my-dev-vm \
--daily-recurrence '{"time": "1900"}' \
--time-zone-id "Pacific Standard Time" \
--status Enabled
Quotas
# Set per-user VM limits
az lab policy set \
--lab-name my-devtest-lab \
--resource-group myRG \
--name UserOwnedLabVmsCount \
--threshold 5
# Set allowed VM sizes
az lab policy set \
--lab-name my-devtest-lab \
--resource-group myRG \
--name AllowedVmSizesInLab \
--threshold '["Standard_D2s_v3", "Standard_D4s_v3"]'
Cost Tracking
# Get lab costs
az lab cost get \
--lab-name my-devtest-lab \
--resource-group myRG \
--name TargetCost
Claimable VMs
Pre-create VMs for quick access:
# Create claimable pool
az lab vm create \
--lab-name my-devtest-lab \
--resource-group myRG \
--name "dev-pool" \
--image "Visual Studio 2019" \
--size Standard_D4s_v3 \
--notes "Claimable dev environment" \
--allow-claim true
Virtual Networks
# Add existing VNet
az lab vnet set \
--lab-name my-devtest-lab \
--resource-group myRG \
--name my-lab-vnet \
--virtual-network-id /subscriptions/.../virtualNetworks/dev-vnet \
--subnet-name dev-subnet \
--enabled-for-vm-creation true
Environments (ARM Templates)
# Create environment from repo
az lab environment create \
--lab-name my-devtest-lab \
--resource-group myRG \
--name my-environment \
--arm-template-id /subscriptions/.../artifactsources/repo/armtemplates/webapp
CLI for Users
# List my VMs
az lab vm list \
--lab-name my-devtest-lab \
--resource-group myRG \
--query "[?contains(ownerObjectId, 'myuserid')]"
# Claim a VM
az lab vm claim \
--lab-name my-devtest-lab \
--resource-group myRG \
--name dev-pool-001
# Start/Stop VM
az lab vm start --lab-name my-devtest-lab --resource-group myRG --name my-vm
az lab vm stop --lab-name my-devtest-lab --resource-group myRG --name my-vm
DevTest Labs: self-service environments with guardrails.