Category
Developer Tools
1. Introduction
Azure DevTest Labs is an Azure service designed to help teams create and manage dev/test environments quickly, safely, and cost-effectively—without requiring every developer to be an Azure infrastructure expert.
In simple terms: Azure DevTest Labs lets you create “a lab” where developers can spin up pre-approved virtual machines (VMs) and environments, with guardrails like auto-shutdown, quotas, and allowed VM sizes. This reduces cloud waste and improves consistency across teams.
Technically, Azure DevTest Labs is a policy-driven management layer over Azure IaaS (primarily Azure Virtual Machines, networking, and storage). A “lab” is an Azure resource that provisions and governs compute in a subscription/resource group using lab-wide settings (like allowed images/sizes), per-user quotas, schedules (auto-shutdown/auto-start), and reusable templates (formulas, artifacts, and ARM-template-based environments).
It solves a common problem in engineering organizations: dev/test cloud sprawl. Without guardrails, dev/test VMs are often oversized, duplicated, left running overnight, and deployed inconsistently—leading to higher bills, security drift, and operational headaches.
Service status note: Azure DevTest Labs is a long-running Azure service and remains available in the Azure portal at the time of writing. Azure has also introduced newer developer-environment options (for example, Microsoft Dev Box and Azure Deployment Environments). If you’re starting new platform initiatives, verify the latest positioning and roadmap in official documentation.
2. What is Azure DevTest Labs?
Official purpose
Azure DevTest Labs helps development and test teams quickly create environments in Azure while minimizing waste and controlling cost through policies and automation.
Core capabilities – Create dev/test VMs from curated base images (Marketplace, custom images, Shared Image Gallery/Azure Compute Gallery images—depending on your configuration). – Apply lab policies (allowed VM sizes, allowed images, VM count limits, auto-shutdown requirements, etc.). – Enforce cost controls (e.g., auto-shutdown schedules, quotas, and governance patterns). – Standardize VM configuration using artifacts (post-deploy actions like installing software) and formulas (reusable VM definitions). – Enable self-service provisioning with guardrails (developers can create what they need within constraints).
Major components – Lab: The main DevTest Labs resource. It holds policy, configuration, and artifacts/formulas. – Lab virtual machines: Azure VMs created “inside” the lab, governed by lab settings. – Artifacts: Reusable deployment actions (scripts/packages) to install and configure software on VMs. – Formulas: “Golden” VM definitions (base image + size + artifacts + settings) for consistent provisioning. – Policies: Rules and limits controlling what can be created and when it runs. – Users/Access: Azure RBAC access to the lab resource and related resource groups/resources. – Networking: Lab VNet options (create new or use existing, depending on supported configurations and permissions).
Service type – Azure resource provider: Microsoft.DevTestLab – Category fit: Developer Tools, with strong overlap into cost governance and self-service infrastructure.
Scope (subscription/resource grouping) – A lab is created within an Azure subscription and placed in a resource group. – The lab then provisions Azure resources (VMs, NICs, disks, public IPs, VNets, etc.) into resource groups according to lab configuration. – Most governance is applied at the lab level, with additional constraints possible via Azure Policy at the subscription/resource group level.
Regional/global/zonal considerations – Azure DevTest Labs is generally regional, because it provisions regional resources (VMs, managed disks, VNets). – Feature availability (images, VM sizes, underlying compute features like Availability Zones) depends on the Azure region and the chosen VM SKU. Verify region support in official docs.
How it fits into the Azure ecosystem Azure DevTest Labs sits between: – Developers/testers who need fast self-service environments, and – Azure governance/operations/security teams who need guardrails (cost control, compliance, least privilege, standardized builds)
It integrates naturally with: – Azure Virtual Machines (core compute) – Azure Virtual Network (networking and isolation) – Azure Monitor (metrics/logs for VMs and platform activity) – Azure RBAC and Microsoft Entra ID (identity and authorization) – Azure Policy (organization-wide controls, complementary to lab policies) – Azure Compute Gallery (formerly Shared Image Gallery) for curated images (common in mature enterprises) – CI/CD and automation tooling (Azure DevOps, GitHub Actions, PowerShell, ARM/Bicep, REST APIs—verify the latest task/extensions availability)
Official docs entry point:
https://learn.microsoft.com/azure/devtest-labs/
3. Why use Azure DevTest Labs?
Business reasons
- Lower cloud spend for non-production: Auto-shutdown and quotas reduce “forgotten VM” costs.
- Faster time-to-environment: Developers don’t wait for ops tickets; they self-serve within constraints.
- Standardization: Formulas/artifacts reduce configuration drift and “works on my machine” issues.
- Chargeback/showback alignment: Labs can be organized by team/project with clear ownership tags and budgets.
Technical reasons
- Curated images and sizes: Limit VM SKUs to what’s approved (security, cost, compatibility).
- Repeatable VM builds: Formulas + artifacts create consistent environments.
- Controlled networking: Labs can be aligned to standard network segmentation patterns (within supported capabilities).
Operational reasons
- Policy-driven operations: Centralized rules for shutdown, quotas, and allowed configurations.
- Reduced toil: Less manual provisioning; fewer exceptions.
- Lifecycle hygiene: Claimable VMs, expiration, and schedules help keep environments current.
Security/compliance reasons
- Least privilege via Azure RBAC: developers can be restricted to lab resources.
- Approved images: helps avoid unpatched/unapproved OS images.
- Network boundary control: supports patterns where dev/test is isolated from production networks.
- Auditing: Azure Activity Log visibility plus VM diagnostics via Azure Monitor.
Scalability/performance reasons
- Scaling is mainly determined by underlying Azure Compute limits (VM quotas, regional capacity).
- DevTest Labs improves operational scalability (many developers self-serving) rather than improving VM performance itself.
When teams should choose Azure DevTest Labs
Choose it when you need: – Self-service dev/test VMs for teams – Guardrails to control cost and sprawl – Standard VM setups through reusable configurations – A lab “landing zone” for development teams that is faster than building a custom portal
When teams should not choose it
Avoid (or reconsider) when: – You primarily need PaaS environments rather than VMs (consider ARM/Bicep + platform automation; Azure Deployment Environments may be a better fit—verify). – You need managed developer desktops with centralized policy, identity integration, and lifecycle at scale (evaluate Microsoft Dev Box—verify). – Your org already has a mature internal developer platform with golden images, budgets, quotas, and self-service workflows; DevTest Labs may overlap or add another layer. – You require features outside DevTest Labs’ current scope (for example, advanced multi-region orchestration, deep environment catalog with approvals, etc.).
4. Where is Azure DevTest Labs used?
Industries
- Software/SaaS
- Financial services (sandboxed dev/test with tight guardrails)
- Healthcare and life sciences (controlled access, standardized builds)
- Retail/e-commerce (feature testing, load testing labs)
- Education/training departments (though Azure Lab Services is often evaluated for classroom scenarios—verify best fit)
Team types
- Application development teams
- QA and test automation teams
- DevOps/platform engineering teams providing self-service
- Security engineering teams that want standardized images and reduced shadow IT
- Consulting/partner teams building repeatable demo/test environments
Workloads
- Dev/test VMs for application development
- Integration test environments
- Build agents (self-hosted, ephemeral, or scheduled—depending on your strategy)
- PoC and prototype environments
- Training labs for internal teams (with cost controls)
Architectures and deployment contexts
- Single team lab per product
- Shared lab per department with per-user quotas
- Enterprise hub-and-spoke network with labs in spokes
- Hybrid orgs where dev/test is in Azure while production is elsewhere (or on-prem)
Production vs dev/test usage
Azure DevTest Labs is designed for non-production environments. While it provisions standard Azure resources, using it for production is usually not the intent because: – its policies are optimized for cost control and self-service, – the operational model is different from production landing zones, – production typically requires stricter change control and availability patterns.
5. Top Use Cases and Scenarios
Below are realistic scenarios where Azure DevTest Labs fits well.
1) Standardized developer VMs with auto-shutdown
- Problem: Developers create VMs manually, leave them running, and use inconsistent configurations.
- Why it fits: Lab policies enforce auto-shutdown and constrain VM sizes/images.
- Example: A .NET team provisions Windows or Ubuntu dev VMs that automatically shut down at 7 PM local time.
2) QA test rigs for reproducible testing
- Problem: QA needs consistent test machines and fast rebuilds when tests fail.
- Why it fits: Formulas + artifacts allow rebuilding a known baseline quickly.
- Example: QA rebuilds an “Selenium Test Agent” VM formula with browser + drivers + test tools.
3) Disposable PoC environments
- Problem: Proof-of-concept projects create cloud sprawl and surprise bills.
- Why it fits: Quotas and schedules reduce risk; expiration policies encourage cleanup.
- Example: A team spins up a short-lived VM for evaluating a new database connector.
4) Shared “claimable” VMs for expensive tooling
- Problem: Some tools require high-memory VMs; giving one per developer is too expensive.
- Why it fits: Claimable VMs can be shared across a team under policy controls.
- Example: A graphics/rendering team shares a few larger VMs that developers claim when needed.
5) Golden image rollout and controlled experimentation
- Problem: Security needs patch-compliant images; developers need flexibility.
- Why it fits: Approved images can be curated; artifacts can add dev tools without breaking baselines.
- Example: Security publishes a monthly patched image; devs use artifacts to add language runtimes.
6) Self-hosted build/test agents with schedules
- Problem: Build agents run 24/7 though pipelines run only business hours.
- Why it fits: Auto-start/auto-shutdown schedules reduce compute time.
- Example: A nightly build VM starts at 1 AM, runs tests, then shuts down automatically.
7) Hackathon / internal innovation labs
- Problem: Events require fast provisioning and cost ceilings.
- Why it fits: Labs provide self-service with quotas and allowed SKUs.
- Example: A 3-day hackathon uses a lab with strict VM size limits and daily shutdown.
8) Vendor demo and sales engineering environments
- Problem: Demo environments must be consistent and easy to reset.
- Why it fits: Formulas and artifacts standardize demos; environments can be rebuilt quickly.
- Example: Sales engineers deploy a demo VM with preinstalled sample data and demo scripts.
9) Secure sandbox for untrusted code testing
- Problem: Teams need isolation to run potentially risky tests.
- Why it fits: Labs can be placed in isolated VNets with limited inbound/outbound.
- Example: A security team runs malware-analysis-like behavior testing in isolated dev/test VMs (with strong controls).
10) Migration rehearsal environments
- Problem: Teams need temporary environments to test migration steps.
- Why it fits: Quick provisioning with known VM baselines; cleanup enforced.
- Example: A team creates a VM to rehearse a legacy app upgrade or data migration script.
11) Training environments for internal enablement
- Problem: Trainers need consistent lab machines and predictable cost.
- Why it fits: Controlled images and auto-shutdown prevent runaway spend.
- Example: An internal course provides one VM per attendee for two days, with strict quotas.
12) Development environments with network access to shared dev services
- Problem: Developers need VMs that can reach dev databases, caches, or internal APIs.
- Why it fits: Labs can be configured to use specific VNets/subnets aligned to dev shared services.
- Example: A lab VM sits in a dev subnet with controlled access to an Azure SQL dev instance.
6. Core Features
Note: Feature availability can vary by region and by the service’s current state. Always verify in official docs for the latest behavior.
1) Lab policies (guardrails)
- What it does: Controls what users can create (VM sizes, images), how many they can create, and how resources behave (shutdown schedules).
- Why it matters: Prevents sprawl and enforces organization standards.
- Practical benefit: Lower costs, fewer security exceptions, less operational clean-up.
- Caveats: Lab policies complement but do not replace Azure Policy. Use Azure Policy for subscription-wide enforcement.
2) Auto-shutdown schedules
- What it does: Shuts down lab VMs at specified times (and can optionally notify users).
- Why it matters: Most dev/test waste is from compute running idle.
- Practical benefit: Significant reduction in monthly compute hours.
- Caveats: Shutdown stops compute charges but disks and some IP resources may still incur costs.
3) Quotas and per-user limits
- What it does: Limits number of VMs per user, total VMs, and potentially allowed VM sizes.
- Why it matters: Prevents one user or team from exhausting budget or quotas.
- Practical benefit: Predictable spend and capacity.
- Caveats: Underlying Azure quotas (regional vCPU quotas, public IP quotas) still apply.
4) Artifacts (post-deploy configuration)
- What it does: Applies scripts/packages to configure a VM after provisioning (install tools, set registry, configure services).
- Why it matters: Speeds up and standardizes VM setup.
- Practical benefit: New VM becomes “developer-ready” in minutes.
- Caveats: Artifact success depends on network access (package repos), OS compatibility, and script reliability.
5) Formulas (reusable VM definitions)
- What it does: Saves a VM “recipe” (image + size + artifacts + settings) so users can create consistent VMs repeatedly.
- Why it matters: Standardization and repeatability reduce drift.
- Practical benefit: Consistent dev/test machines across teams.
- Caveats: Keep formulas maintained as images/tooling versions evolve.
6) Custom images and curated base images
- What it does: Uses Marketplace images and/or your organization’s custom images.
- Why it matters: Security and compliance often require managed images.
- Practical benefit: Faster provisioning and better patch compliance.
- Caveats: Image pipelines and lifecycle management are your responsibility (often via Azure Compute Gallery and image building pipelines).
7) VM claiming (claimable VMs)
- What it does: Allows shared VMs that users can claim for temporary use.
- Why it matters: Efficient sharing of expensive compute.
- Practical benefit: Lower costs than one-VM-per-developer for specialized needs.
- Caveats: Governance and cleanup are important; treat claimable VMs as shared assets.
8) Repository integration for artifacts (Git-based)
- What it does: Supports using repositories as sources for artifacts (commonly GitHub or Azure Repos).
- Why it matters: Infrastructure/config becomes version-controlled.
- Practical benefit: Change management for developer workstation setup.
- Caveats: Secure repository access and review artifact scripts like any other code.
9) Environment deployment via templates (where supported)
- What it does: Deploys multi-resource environments using templates (historically ARM templates).
- Why it matters: Some dev/test needs more than a VM (e.g., VM + database + networking).
- Practical benefit: One-click deployment of a small stack.
- Caveats: This capability has evolved across Azure services; verify current DevTest Labs “environments” support and best practice in official docs.
10) Centralized lab administration
- What it does: Provides a single place to manage lab-wide settings, policies, and user access.
- Why it matters: Reduces admin overhead compared to per-VM manual controls.
- Practical benefit: Scales operationally across many developers.
- Caveats: Organizational governance still needs Azure Policy, tagging standards, and RBAC design.
7. Architecture and How It Works
High-level architecture
Azure DevTest Labs is a control-plane service that provisions and manages Azure resources under the hood:
- Control plane: The lab resource (Microsoft.DevTestLab/labs) stores configuration and policies.
- Data/compute plane: Actual workloads run on standard Azure resources—primarily Azure VMs, disks, VNets, NICs, and IPs.
- Identity plane: Microsoft Entra ID + Azure RBAC govern who can create/manage lab resources.
- Automation plane: Schedules/policies and artifacts automate creation and lifecycle actions.
Request / data / control flow (typical VM creation)
- A user (developer) requests a VM from the lab (portal/API).
- Azure DevTest Labs checks lab policies: allowed image, size, quota, schedule requirements.
- The service provisions an Azure VM and associated resources in the configured resource group(s).
- After provisioning, selected artifacts run to install/configure software.
- Schedules enforce auto-shutdown (and possibly auto-start if configured/available).
- Ops teams monitor via Azure Activity Log and Azure Monitor VM insights/diagnostics.
Integrations with related services
- Azure Virtual Machines: Actual compute instances.
- Azure Virtual Network: Network isolation and routing.
- Azure Compute Gallery (common enterprise pattern): Curated images.
- Azure Monitor: Metrics/logs/alerts for VMs and operations.
- Azure Policy: Additional governance controls beyond lab policies.
- Azure Key Vault: Secure secret storage for scripts and build pipelines (recommended).
- CI/CD (optional): Pipeline-driven provisioning and teardown (verify supported tasks/APIs).
Dependency services
- Storage (managed disks) for VM OS/data disks
- Networking resources for VM connectivity
- Public IPs and NSGs for inbound connectivity (if enabled)
- Azure resource provider registration: Microsoft.DevTestLab
Security/authentication model
- Authentication: Microsoft Entra ID.
- Authorization: Azure RBAC roles applied at lab/resource group/subscription scope.
- Lab-specific roles and permissions may be provided via built-in roles (verify current roles in docs), but the reliable baseline is Azure RBAC + resource scopes.
Networking model
Common patterns: – Simple: Lab creates its own VNet and subnet; VMs get public IPs for RDP/SSH. – Enterprise: Lab uses a pre-created VNet/subnet connected to hub-spoke; inbound access via Bastion or jump boxes; outbound via firewall.
If you need strict control: – Prefer private access patterns (Azure Bastion, private subnets, controlled egress). – Use NSGs, UDRs, and firewall rules consistent with your landing zone.
Monitoring/logging/governance considerations
- Use Azure Activity Log for control-plane operations (create/update/delete).
- Use Azure Monitor and VM diagnostics for guest OS logs and metrics.
- Apply consistent tagging and naming conventions.
- Use Azure Policy for: required tags, allowed regions, allowed SKUs, deny public IP creation (if desired), etc.
Simple architecture diagram (Mermaid)
flowchart LR
Dev[Developer] -->|Azure Portal / API| DTL[Azure DevTest Labs (Lab)]
DTL -->|Policy checks| Policies[Lab Policies & Quotas]
DTL -->|Provision| VM[Azure Virtual Machine]
DTL -->|Attach| Disk[Managed Disks]
DTL -->|Connect| VNet[Virtual Network/Subnet]
DTL -->|Run post-deploy| Artifacts[Artifacts (scripts/packages)]
VM -->|Metrics/Logs| Mon[Azure Monitor]
Production-style architecture diagram (Mermaid)
flowchart TB
subgraph Identity["Identity & Governance"]
Entra[Microsoft Entra ID]
RBAC[Azure RBAC]
AzPolicy[Azure Policy]
end
subgraph Ops["Operations"]
Monitor[Azure Monitor / Log Analytics]
Activity[Azure Activity Log]
KV[Azure Key Vault]
end
subgraph Network["Enterprise Network (Hub-Spoke)"]
Hub[Hub VNet\nFirewall/Bastion/DNS]
Spoke[Spoke VNet (Dev/Test)]
Hub --- Spoke
end
subgraph DevTest["Dev/Test Subscription or RG"]
Lab[Azure DevTest Labs]
Repo[Artifacts Repo (GitHub/Azure Repos)\nVersion controlled]
Gallery[Azure Compute Gallery\nCurated images]
VM1[Lab VM(s)]
end
Entra --> RBAC --> Lab
AzPolicy --> DevTest
Lab -->|Uses| Gallery
Lab -->|Fetch artifacts| Repo
Lab -->|Provision| VM1
VM1 --> Spoke
Hub -->|Secure access| VM1
VM1 --> Monitor
Lab --> Activity
Repo --> KV
8. Prerequisites
Account/subscription requirements
- An Azure subscription where you can create resources.
- The Microsoft.DevTestLab resource provider must be registered in the subscription (often auto-registered when creating the first lab, but not always).
Permissions / IAM roles
At minimum, for the lab creator: – Contributor on the target resource group (or subscription), plus permissions to create networking and compute resources. For lab users (developers): – RBAC roles scoped to the lab/resource group that allow creating VMs inside the lab (commonly Contributor-like permissions, but many orgs scope permissions more tightly).
Because RBAC needs vary by org: – Start with least privilege and expand based on observed authorization failures. – Verify built-in DevTest Labs roles and recommended RBAC patterns in official docs.
Billing requirements
- A payment method associated with the subscription (unless using a sponsored/education subscription with credits).
- Spending will primarily come from VMs and storage.
CLI/SDK/tools
For this tutorial: – Azure Portal (web) – Optional: Azure CLI (helpful for resource group creation and cleanup) – Install: https://learn.microsoft.com/cli/azure/install-azure-cli
Region availability
- Choose an Azure region that supports your target VM sizes and images.
- DevTest Labs is tied to the region of deployed resources.
If you rely on specific SKUs or images, confirm availability in your chosen region.
Quotas/limits
- Azure subscription/regional quotas for:
- vCPU (VM family quotas)
- Public IP addresses
- Storage and disks
- Network interfaces
- DevTest Labs may also have service-specific limits. Verify in official docs if you anticipate large scale.
Prerequisite services
- None required beyond what Azure provisions automatically (VM, disk, networking), but in enterprise setups you may need:
- Existing VNet/subnet
- Azure Compute Gallery for approved images
- Log Analytics workspace for monitoring
- Key Vault for secrets used in artifacts/scripts
9. Pricing / Cost
Pricing model (accurate framing)
Azure DevTest Labs is primarily a management layer. In typical usage: – You pay for the underlying Azure resources created in the lab (VM compute, disks, storage, networking, public IPs, outbound data transfer, etc.). – The DevTest Labs service itself is generally not billed as a separate metered item (confirm in current official docs/pricing pages for your scenario).
Official references: – DevTest Labs documentation: https://learn.microsoft.com/azure/devtest-labs/ – Azure Pricing Calculator: https://azure.microsoft.com/pricing/calculator/ – Azure pricing pages (search for DevTest Labs pricing in your region; if a dedicated page is not available, rely on VM/storage/network pricing and verify via docs).
Pricing dimensions (what drives cost)
Direct cost drivers – VM compute hours (largest factor): size/SKU, OS type, region, pay-as-you-go vs reservations/savings plans (if applicable to dev/test). – Managed disks: OS disk + data disks (billed even when VM is stopped/deallocated, depending on disk type). – Public IP addresses: some public IP SKUs are billable even when not attached—verify current pricing rules. – Network egress: outbound data transfer to the internet or across regions. – Load balancers/NAT gateways/firewalls (if part of your network design).
Indirect/hidden costs – Idle but not deallocated VMs: “Stopped” vs “Stopped (deallocated)” affects billing. DevTest Labs auto-shutdown usually stops/deallocates, but always verify state in portal. – Orphaned disks: deleting a VM may leave disks/snapshots if configured or if deletion fails. – Shared infrastructure: Log Analytics ingestion costs if collecting detailed logs. – Custom image pipelines: image building and storage in Azure Compute Gallery.
How to optimize cost (practical levers)
- Enforce auto-shutdown for all lab VMs.
- Set per-user VM quotas and restrict high-cost SKUs.
- Prefer smaller VM sizes and scale up only when needed.
- Use shared/claimable VMs for expensive workloads.
- Clean up unused VMs/disks regularly; consider expiration policies where supported.
- Use standardized images to reduce “pet VM” behavior and rebuild instead of keeping long-lived VMs.
Example low-cost starter estimate (no fabricated numbers)
A minimal lab with one small Linux VM will cost roughly: – VM compute for the hours it’s running (e.g., business hours only if auto-shutdown is set) – OS disk storage (billed monthly) – Possibly a small public IP cost depending on SKU and region – Minimal outbound data transfer
Because exact pricing varies by region and SKU: – Use the Azure Pricing Calculator with: – 1 small VM in your region – Managed disk type/size – Expected hours per month (e.g., ~160 hours for business hours) – Any monitoring logs you plan to collect
Example production cost considerations
For a department-wide lab supporting 50–200 developers: – vCPU quota management becomes important. – Savings come mainly from: – strict shutdown schedules, – eliminating oversized VMs, – enforcing expiration/cleanup, – minimizing public IP usage (use Bastion/jump access), – standardized images and rebuild patterns. – Monitoring costs can become material if you ingest verbose logs from many VMs.
10. Step-by-Step Hands-On Tutorial
Objective
Create an Azure DevTest Labs lab with guardrails, provision a low-cost Linux VM inside the lab, apply an artifact-like configuration (or minimal bootstrapping), enable auto-shutdown, validate access, and clean up safely.
Lab Overview
You will: 1. Create a resource group. 2. Create an Azure DevTest Labs lab. 3. Configure auto-shutdown and basic policies. 4. Create a Linux VM in the lab (Ubuntu or similar). 5. Connect to the VM, validate it works, and confirm shutdown scheduling. 6. Clean up by deleting the resource group.
This is designed to be low-cost: – Use a small VM size – Enable auto-shutdown soon after creation – Delete everything at the end
Step 1: Create a resource group (Azure CLI)
Action 1. Open a terminal with Azure CLI installed. 2. Sign in and select your subscription. 3. Create a resource group.
az login
az account set --subscription "<YOUR_SUBSCRIPTION_ID>"
az group create --name rg-devtestlabs-lab01 --location eastus
Expected outcome
– A new resource group named rg-devtestlabs-lab01 exists in your chosen region.
Verification
az group show --name rg-devtestlabs-lab01 --query "{name:name, location:location}" -o table
Step 2: Create an Azure DevTest Labs lab (Azure Portal)
Action (Portal)
1. Go to the Azure portal: https://portal.azure.com
2. Search for DevTest Labs.
3. Select DevTest Labs → Create.
4. Fill out:
– Lab name: dtl-lab01
– Subscription: your subscription
– Resource group: rg-devtestlabs-lab01
– Location: choose the same region as the resource group (for simplicity)
5. Review and create.
Expected outcome – The lab resource is created and you can open it in the portal.
Verification – In the lab overview blade, confirm: – Provisioning state succeeded – You can see sections for VMs, policies/configuration, artifacts/formulas (names may vary slightly by portal UX updates)
Step 3: Configure auto-shutdown and basic cost guardrails
Action (Portal)
1. In your lab (dtl-lab01), find Configuration and policies (or similar).
2. Configure Auto-shutdown policy:
– Enable auto-shutdown
– Set time to ~30–60 minutes from now (for quick validation), then later change it to your preferred daily schedule
– Configure notification email if desired
3. Configure Allowed virtual machine sizes to restrict to small, low-cost SKUs (choose from what your region supports).
4. Optionally set:
– Maximum VMs per user (e.g., 1–2 for a small test)
– Maximum number of VMs in lab
Expected outcome – Lab has guardrails to prevent accidental high spend.
Verification – Re-open policy settings and confirm your changes are saved.
Common mistake – Setting auto-shutdown but leaving VMs in states that still incur costs (for example, disks always cost money). Auto-shutdown mainly reduces compute hours.
Step 4: Create a Linux VM inside the lab
Action (Portal)
1. In the lab, go to Virtual machines → Add (or + Create).
2. Choose a base image:
– Ubuntu LTS (or another Linux distribution you prefer)
3. Choose a VM size allowed by your policy (smallest practical for SSH + a web server).
4. Configure authentication:
– Prefer SSH public key (recommended)
– Or password (less recommended; restrict inbound if you do)
5. Networking:
– For simplest validation, allow inbound SSH (port 22) from your IP if the UI offers this.
– In stricter environments, you would use Bastion/jump host and no public IP. For a simple lab, public IP is acceptable if locked down.
6. Select any available artifacts if the UI offers a built-in “install nginx/apache” artifact.
– If you don’t see such artifacts, proceed without artifacts and you’ll install nginx manually after connecting.
7. Create the VM.
Expected outcome – A VM appears in the lab’s VM list. – VM provisioning completes successfully.
Verification – Open the VM in the lab and confirm: – Status is Running – It has an IP or connection method available (public IP or internal IP if using private access)
Step 5: Connect via SSH and install a simple web server (manual bootstrap)
If you used an artifact to install software, you can validate that instead. Otherwise, do a manual install to confirm the VM is usable.
Action 1. From your terminal, connect to the VM (use the public IP shown in the portal):
ssh <username>@<vm_public_ip>
- Install nginx (Ubuntu/Debian example):
sudo apt-get update
sudo apt-get install -y nginx
sudo systemctl enable --now nginx
- Confirm nginx is running:
systemctl status nginx --no-pager
curl -I http://localhost
Expected outcome
– nginx service is active/running.
– curl -I returns an HTTP 200/302 response.
Verification from your workstation
– If HTTP (port 80) is allowed inbound, test:
– http://<vm_public_ip>/ in a browser
If not allowed inbound (common), that’s fine—SSH validation is sufficient.
Common errors and fixes – SSH timeout: inbound port 22 blocked by NSG or your corporate network. – Fix: check NSG rules, ensure your IP is allowed, or use Bastion (recommended for enterprise). – apt-get fails: outbound internet blocked. – Fix: allow outbound via firewall/proxy or use internal package mirrors.
Step 6: Validate auto-shutdown behavior
Action (Portal) 1. In the lab, open the VM’s settings and confirm it has an auto-shutdown schedule applied (either inherited or explicitly set). 2. Wait for the configured shutdown time.
Expected outcome – The VM transitions to stopped/deallocated (wording may vary). – Compute charges should stop when deallocated; disks still incur storage cost.
Verification – In the VM status in the portal, confirm it is not “running”. – (Optional) Use Azure CLI to query the VM instance view if you know the underlying VM resource name in the VM’s resource group.
Validation
You have successfully completed the lab if: – The Azure DevTest Labs lab exists and contains at least one VM – Lab policies (at least auto-shutdown and allowed sizes) are configured – You can SSH into the VM and run a basic command – Auto-shutdown stops/deallocates the VM at the expected time
Troubleshooting
Issue: Cannot create the lab (provider not registered)
– Symptom: Error about Microsoft.DevTestLab not registered.
– Fix: Register the resource provider:
– Azure portal: Subscription → Resource providers → search Microsoft.DevTestLab → Register
– Or CLI (if you have permission):
az provider register --namespace Microsoft.DevTestLab
Issue: VM creation fails due to quota – Symptom: vCPU quota exceeded. – Fix: Request quota increase for the VM family/region or choose a smaller VM size.
Issue: VM image not available – Symptom: selected image is unavailable in region. – Fix: choose a different region or image. For enterprises, publish an image to Azure Compute Gallery.
Issue: Auto-shutdown didn’t reduce costs – Cause: VM may be stopped but not deallocated, or disks/IPs still incur charges. – Fix: confirm VM state is deallocated; review disk and IP billing; remove unused disks.
Cleanup
To avoid ongoing charges, delete the resource group (this deletes the lab, VM, disks, networking created inside that RG).
az group delete --name rg-devtestlabs-lab01 --yes --no-wait
Verification
az group exists --name rg-devtestlabs-lab01
When it returns false, cleanup is complete.
11. Best Practices
Architecture best practices
- Align labs to your org structure:
- One lab per team/product for clear ownership, or
- One shared lab per department with strict per-user quotas
- Prefer standardized images via Azure Compute Gallery in enterprises.
- Use formulas for repeatability; treat them like product artifacts with versioning.
IAM/security best practices
- Use least privilege:
- Give developers access to the lab scope, not the entire subscription.
- Separate roles:
- Lab admins manage policies/images/formulas
- Lab users create and operate their own VMs within guardrails
- Require MFA and conditional access via Microsoft Entra ID (organization-wide).
Cost best practices
- Enforce auto-shutdown for every VM.
- Set allowed VM sizes; remove expensive SKUs by default.
- Use per-user quotas and require justification for exceptions.
- Prefer ephemeral rebuild over long-lived “pet” VMs.
- Tag consistently (owner, costCenter, app, environment, expiryDate).
Performance best practices
- Keep base images lean; install heavy tools via artifacts only when needed.
- Use appropriate disk types for dev/test; avoid premium disks by default unless required.
Reliability best practices
- Treat lab VMs as non-production:
- Automate rebuilds
- Store code in repos and data in durable services, not only inside VM disks
- For shared/claimable VMs, implement a reset/reimage process.
Operations best practices
- Centralize logging/monitoring:
- Use Azure Monitor/Log Analytics for VM telemetry.
- Automate cleanup:
- Scheduled audits for unused VMs/disks
- Expiration policies where available
- Track failures:
- Artifact failures should be visible and actionable (log output, versioning, rollbacks).
Governance/tagging/naming best practices
- Naming convention examples:
- Lab:
dtl-<org>-<team>-<region> - VM:
vm-<app>-<user>-<purpose>-<nn> - Enforce tags with Azure Policy:
owner,costCenter,dataClassification,expiryDate,environment=devtest
12. Security Considerations
Identity and access model
- Azure DevTest Labs uses Microsoft Entra ID for authentication and Azure RBAC for authorization.
- Apply RBAC at the narrowest scope:
- Lab resource group or the lab resource itself where possible.
- Consider separate admin and user groups:
dtl-lab-adminsdtl-lab-users
Encryption
- Azure managed disks are encrypted at rest by default (Azure Storage encryption).
- For stricter needs, evaluate customer-managed keys (CMK) for disks and supporting services—availability depends on configuration and region. Verify in official docs.
Network exposure
- Avoid broad inbound rules (0.0.0.0/0) for SSH/RDP.
- Preferred enterprise pattern:
- No public IP on lab VMs
- Access via Azure Bastion or a controlled jump host
- Controlled outbound via firewall/NAT with logging
- Use NSGs and route tables consistent with your landing zone.
Secrets handling
- Do not bake secrets into artifacts or formulas.
- Store secrets in Azure Key Vault and retrieve them at runtime using managed identity where possible.
- If artifacts require credentials, use short-lived tokens and least privilege.
Audit/logging
- Use:
- Azure Activity Log (who created/changed resources)
- Azure Monitor / Log Analytics for VM logs
- Consider sending logs to a SIEM (e.g., Microsoft Sentinel) if required.
Compliance considerations
Azure DevTest Labs is a management service; compliance posture largely depends on: – Subscription governance (Azure Policy) – Network isolation – Approved images and patching – Logging and access controls
Always map your control requirements to the underlying resources.
Common security mistakes
- Leaving SSH/RDP open to the internet.
- Allowing any Marketplace image without review.
- Giving developers Contributor on the whole subscription.
- Long-lived VMs with no patching strategy.
- Artifact scripts with embedded secrets.
Secure deployment recommendations
- Use curated images, patch monthly (or more often).
- Restrict inbound access; prefer Bastion.
- Enforce tagging and expiration.
- Use Azure Policy to deny public IP creation if your model supports private access.
13. Limitations and Gotchas
Because Azure DevTest Labs is a managed service with opinionated workflows, expect constraints.
Known limitations / operational gotchas (commonly encountered)
- Quota collisions: Lab quotas don’t override Azure regional quotas; both can block provisioning.
- “Stopped” vs “Deallocated” confusion: Cost savings depend on actual deallocation state.
- Disk costs persist: Even when VMs are deallocated, managed disks continue billing.
- Networking complexity: Enterprise hub-spoke, private DNS, forced tunneling, and firewalls can break artifact installs or provisioning workflows if not planned.
- Artifact reliability: Scripts can fail due to package repository downtime, proxy needs, or OS differences.
- Image availability: Marketplace images and VM sizes differ by region and may change over time.
- RBAC complexity: Least-privilege setups can require iterative tuning when users hit authorization errors.
Regional constraints
- Some VM families are not available in all regions.
- Availability Zone support depends on region and VM SKU; DevTest Labs doesn’t change that.
Pricing surprises
- Public IP charges (depends on SKU/rules).
- Log Analytics ingestion if you enable verbose logs at scale.
- Orphaned disks/snapshots.
Compatibility issues
- If using custom VNets, ensure DNS, outbound access, and required endpoints are available.
- If using private-only networks, plan for secure access (Bastion/jump box).
Migration challenges
- If you decide later to move from DevTest Labs to another developer environment platform:
- VMs are still Azure VMs, but formulas/policies/artifacts are service-specific.
- Plan to represent standard builds in IaC and image pipelines to reduce lock-in.
14. Comparison with Alternatives
Azure DevTest Labs is one option among several ways to deliver dev/test environments.
Comparison table
| Option | Best For | Strengths | Weaknesses | When to Choose |
|---|---|---|---|---|
| Azure DevTest Labs | Self-service dev/test VMs with guardrails | Lab policies, auto-shutdown, artifacts/formulas, fast provisioning | Service-specific constructs; primarily VM-centric | You want VM-based dev/test with centralized cost control |
| Microsoft Dev Box | Managed developer workstations | Centralized management, dev workstation experience | Different model than self-managed VMs; may require licensing/constraints | You want standardized developer desktops (verify fit) |
| Azure Deployment Environments | Standardized app environments using templates | Environment catalog, IaC-driven, platform approach | May be more suited to app stacks than single VMs | You want platform-engineering style environment provisioning (verify) |
| Plain Azure VMs + IaC (Bicep/Terraform) | Full control and portability | Maximum flexibility; no service-specific layer | You must build governance, schedules, self-service UX | You already have a platform team and want custom workflows |
| Azure Lab Services | Training/classroom labs (often) | Classroom management model | Different target use case from DevTest Labs | Choose for formal training labs if it meets requirements (verify current status/roadmap) |
| AWS EC2 + Service Catalog / CloudFormation | AWS-based dev/test environments | Strong IaC and catalog patterns | Must design cost controls and self-service patterns | Your org is AWS-first |
| Google Compute Engine + templates | GCP dev/test VMs | Strong VM platform | Similar need to build guardrails | Your org is GCP-first |
| Self-managed (vSphere/on-prem) + automation | On-prem dev/test | Data locality, existing tooling | Capacity constraints, slower provisioning | You must stay on-prem for compliance or latency |
15. Real-World Example
Enterprise example (regulated industry)
- Problem: A bank has 300 developers. Dev/test VMs were created manually across subscriptions, with inconsistent OS baselines and high monthly spend due to always-on VMs.
- Proposed architecture
- One DevTest Labs lab per line-of-business in a dev/test subscription.
- Curated images stored in Azure Compute Gallery built from hardened baselines.
- Hub-spoke networking with:
- Private subnets for lab VMs
- Azure Bastion for access
- Central firewall for outbound with logging
- Azure Policy enforces:
- Required tags
- Approved regions
- No public IPs
- Lab policies enforce:
- Allowed VM sizes
- Max VMs per user
- Auto-shutdown schedules
- Why Azure DevTest Labs was chosen
- Rapid self-service with guardrails, without building an internal portal from scratch.
- Expected outcomes
- Reduced dev/test compute hours via enforced shutdown
- Improved compliance through curated images and controlled network access
- Better auditability and ownership tagging
Startup/small-team example
- Problem: A 12-person SaaS startup needs repeatable dev/test VMs for integration testing and demos, but keeps forgetting to shut down machines.
- Proposed architecture
- Single lab with:
- Allowed small VM sizes only
- Auto-shutdown at 7 PM
- One VM per user quota
- A couple of formulas:
- “Demo VM” (installs demo stack)
- “Test Agent VM” (installs CI tools)
- Why Azure DevTest Labs was chosen
- Quick setup, simple guardrails, no need for complex platform engineering.
- Expected outcomes
- Lower surprise bills
- Faster onboarding (new devs create a VM from a formula)
- Reduced variance in dev environments
16. FAQ
1) Is Azure DevTest Labs the same as Azure DevOps?
No. Azure DevTest Labs is an Azure service for provisioning and governing dev/test environments (mostly VMs). Azure DevOps is a suite for repos, pipelines, boards, and artifacts.
2) Do I pay for Azure DevTest Labs itself?
Typically, you pay for the underlying Azure resources (VMs, disks, networking). Confirm the latest billing details in official docs for your subscription and region.
3) What’s the biggest way DevTest Labs saves money?
Auto-shutdown and VM size restrictions. Most dev/test waste comes from always-on compute and oversized VMs.
4) Does auto-shutdown delete the VM?
No—auto-shutdown generally stops/deallocates the VM. Disks usually remain and continue to incur storage costs.
5) Can I restrict which VM sizes developers can use?
Yes, via lab policies. Pair this with Azure Policy if you need enforcement beyond the lab.
6) Can I require tags on lab VMs?
DevTest Labs has its own governance features, but the most consistent way to require tags is Azure Policy at the subscription/resource group level.
7) Can DevTest Labs deploy full environments (VM + database + app services)?
DevTest Labs has historically supported template-based environments (often ARM templates). The exact current capabilities and recommended approach can evolve—verify in official docs and consider Azure Deployment Environments for broader environment catalogs.
8) How do artifacts work?
Artifacts are post-deployment actions that run on the VM to install/configure software (scripts, package installs). Treat them like code: version control, code review, and testing.
9) Can I use my own custom images?
Yes. Many enterprises use Azure Compute Gallery for curated images and then allow those images in the lab.
10) Is DevTest Labs suitable for production workloads?
It’s intended for dev/test. Production typically requires different governance, reliability patterns, and change control.
11) How do I prevent public internet exposure?
Use private subnets, deny public IP creation with Azure Policy, and provide access through Azure Bastion or a jump host.
12) What if developers need admin rights on their VMs?
That’s common for dev/test. Mitigate risk with isolated networks, approved images, endpoint protection, and strict RBAC at the subscription level.
13) How do I handle patching for lab VMs?
Use monthly patched images and rebuild often, or implement a patching solution (Update Manager/guest patching strategy). Standardize via images instead of patching long-lived VMs.
14) How do I troubleshoot VM creation failures?
Check:
– Azure Activity Log for errors
– Subscription quotas (vCPU, IPs)
– Lab policies (allowed sizes/images)
– Network constraints that may block provisioning scripts/artifacts
15) Can I integrate DevTest Labs with CI/CD pipelines?
Often yes via APIs and automation, but specific pipeline tasks/extensions can change over time. Verify current guidance in Microsoft Learn docs and supported tooling.
16) What’s the difference between formulas and images?
Images are OS/base disk templates. Formulas are higher-level VM definitions (image + size + artifacts + settings) to standardize builds.
17) How should I structure labs in a large organization?
Common patterns:
– One lab per team/product (clear ownership)
– One lab per department with strict per-user quotas
Choose based on governance needs, network isolation requirements, and cost allocation.
17. Top Online Resources to Learn Azure DevTest Labs
| Resource Type | Name | Why It Is Useful |
|---|---|---|
| Official documentation | Azure DevTest Labs docs (Microsoft Learn) — https://learn.microsoft.com/azure/devtest-labs/ | Primary source for features, configuration, and concepts |
| Official quickstarts/tutorials | Browse DevTest Labs tutorials in Microsoft Learn — https://learn.microsoft.com/azure/devtest-labs/ | Step-by-step guidance aligned to current portal/API behavior |
| REST API reference | DevTest Labs REST API (Microsoft.DevTestLab) — https://learn.microsoft.com/rest/api/azure/devtestlabs/ | Automate labs, VMs, policies, artifacts via API |
| Azure CLI | Azure CLI documentation — https://learn.microsoft.com/cli/azure/ | Helpful for provisioning, cleanup, and scripting around labs |
| Pricing | Azure Pricing Calculator — https://azure.microsoft.com/pricing/calculator/ | Estimate VM/disk/network costs that dominate lab spend |
| Governance | Azure Policy documentation — https://learn.microsoft.com/azure/governance/policy/ | Enforce org-wide controls (tags, SKUs, regions, public IP restrictions) |
| Monitoring | Azure Monitor documentation — https://learn.microsoft.com/azure/azure-monitor/ | Monitor VM performance, logs, and alerts for lab resources |
| Identity | Azure RBAC documentation — https://learn.microsoft.com/azure/role-based-access-control/ | Design least-privilege access to labs and lab VMs |
| Images | Azure Compute Gallery documentation — https://learn.microsoft.com/azure/virtual-machines/azure-compute-gallery | Enterprise pattern for curated images used in labs |
| Updates | Azure Updates — https://azure.microsoft.com/updates/ | Track announcements that may affect DevTest Labs and adjacent services |
18. Training and Certification Providers
| Institute | Suitable Audience | Likely Learning Focus | Mode | Website URL |
|---|---|---|---|---|
| DevOpsSchool.com | DevOps engineers, cloud engineers, platform teams | DevOps and Azure tooling; environment automation; governance basics | Check website | https://www.devopsschool.com/ |
| ScmGalaxy.com | Beginners to intermediate DevOps learners | SCM + DevOps fundamentals; practical labs | Check website | https://www.scmgalaxy.com/ |
| CLoudOpsNow.in | Cloud operations teams, SREs | Cloud operations, monitoring, reliability practices | Check website | https://www.cloudopsnow.in/ |
| SreSchool.com | SREs, operations engineers | Reliability engineering, observability, incident response | Check website | https://www.sreschool.com/ |
| AiOpsSchool.com | Ops teams exploring AIOps | AIOps concepts, monitoring automation | Check website | https://www.aiopsschool.com/ |
19. Top Trainers
| Platform/Site | Likely Specialization | Suitable Audience | Website URL |
|---|---|---|---|
| RajeshKumar.xyz | DevOps/cloud training content (verify offerings) | Engineers seeking practical DevOps guidance | https://rajeshkumar.xyz/ |
| devopstrainer.in | DevOps training platform (verify course list) | Beginners to intermediate DevOps learners | https://www.devopstrainer.in/ |
| devopsfreelancer.com | Freelance DevOps services/training platform (verify services) | Teams needing short-term DevOps help | https://www.devopsfreelancer.com/ |
| devopssupport.in | DevOps support/training services (verify scope) | Ops/DevOps teams needing support | https://www.devopssupport.in/ |
20. Top Consulting Companies
| Company Name | Likely Service Area | Where They May Help | Consulting Use Case Examples | Website URL |
|---|---|---|---|---|
| cotocus.com | Cloud/DevOps consulting (verify exact offerings) | Dev/test governance, automation, cost controls | DevTest Labs setup, RBAC model, network integration, cost optimization | https://cotocus.com/ |
| DevOpsSchool.com | DevOps consulting and training (verify exact offerings) | Platform enablement, automation, CI/CD integration | Standardized dev/test VM patterns, artifacts/formulas strategy, governance | https://www.devopsschool.com/ |
| DEVOPSCONSULTING.IN | DevOps consulting (verify exact offerings) | DevOps process/tooling, cloud operations | Dev/test lab design, automation, monitoring, security reviews | https://www.devopsconsulting.in/ |
21. Career and Learning Roadmap
What to learn before Azure DevTest Labs
- Azure fundamentals:
- Subscriptions, resource groups, regions
- Azure Virtual Machines, disks, VNets, NSGs
- Identity and access:
- Microsoft Entra ID basics
- Azure RBAC and scopes
- Basic governance and cost:
- Tags, budgets, quotas
- Azure Policy basics
What to learn after Azure DevTest Labs
- Image engineering:
- Azure Compute Gallery
- Automated image building pipelines (Packer/Azure Image Builder—verify best fit)
- Infrastructure as Code:
- Bicep/ARM or Terraform
- Secure access patterns:
- Azure Bastion
- Hub-spoke networking, private DNS, firewall egress control
- Observability:
- Azure Monitor, Log Analytics, alerting, dashboards
- Platform engineering:
- Self-service portals, golden paths, environment catalogs (evaluate Azure Deployment Environments—verify)
Job roles that use it
- Cloud engineer / cloud operations engineer
- DevOps engineer
- Platform engineer
- Solutions architect
- Security engineer (governance/controls for dev/test)
- QA/test automation engineer (environment provisioning)
Certification path (Azure)
Azure certifications change over time; DevTest Labs is typically covered indirectly via:
– Azure fundamentals and administration (VMs, networking, RBAC, governance)
– DevOps and security certifications
Choose the cert aligned to your role and verify current Microsoft certification paths:
https://learn.microsoft.com/credentials/
Project ideas for practice
- Build a lab with:
- Allowed image list from a compute gallery
- Strict VM size policy
- Auto-shutdown
- A formula for “Dev VM” and “Test Agent VM”
- Create an artifact repository and implement:
- OS hardening steps
- Tool installation (language runtime, Docker, editors)
- Logging agent installation
- Implement governance:
- Azure Policy for tags and deny public IPs
- Budget alerts for the dev/test subscription
22. Glossary
- Artifact: A post-deployment action (script/package install) applied to a VM to configure it.
- Auto-shutdown: A schedule-based feature to stop/deallocate VMs at a set time to reduce compute cost.
- Azure Compute Gallery: Service for managing and sharing custom VM images at scale (formerly Shared Image Gallery).
- Azure Policy: Governance service to enforce rules across subscriptions/resource groups (e.g., allowed SKUs, required tags).
- Azure RBAC: Role-based access control for Azure resources.
- Claimable VM: A shared VM that can be temporarily claimed by a user for use.
- Formula: A reusable VM definition (image + size + artifacts + settings) for consistent deployments.
- Hub-spoke network: A network topology where a central hub provides shared services (firewall, Bastion, DNS) to multiple spoke VNets.
- Lab: The Azure DevTest Labs resource that stores policies/config and provisions governed dev/test resources.
- Managed disk: Azure block storage for VM OS/data disks with independent lifecycle and billing.
- NSG (Network Security Group): Azure firewall rules for subnets/NICs controlling inbound/outbound traffic.
- Quota: A subscription/regional limit (e.g., vCPUs) that can block provisioning.
- Stopped (deallocated): VM state where compute billing typically stops; storage still billed.
- VNet (Virtual Network): Azure networking construct for isolated IP spaces and routing.
23. Summary
Azure DevTest Labs (Azure) is a Developer Tools service that helps teams provision dev/test VMs quickly while enforcing guardrails like auto-shutdown, quotas, and approved VM configurations. It fits best when your organization needs self-service VM environments without sacrificing cost control and governance.
From a cost perspective, the biggest savings come from reducing VM runtime (auto-shutdown) and preventing oversized deployments (allowed sizes/quotas). From a security perspective, success depends on RBAC least privilege, curated images, and safe network access patterns (prefer private access via Bastion/jump host and avoid broad inbound rules).
Use Azure DevTest Labs when VM-based dev/test is a primary need and you want policy-driven control with minimal platform build-out. If you need more application-environment catalog capabilities or managed developer desktops, evaluate adjacent Azure services and confirm the latest guidance in official documentation.
Next step: review the official Azure DevTest Labs documentation and then expand this lab by introducing custom images (Azure Compute Gallery), artifact repositories, and Azure Policy for organization-wide governance.