A bus stop with a bus parked next to it — Azure DevTest Labs - Geliştirme ve Test Ortamı Yönetimi

İstanbul’daki bir yazılım evi 18 geliştirici, 4 QA, 3 DevOps mühendisi ile 9 farklı müşteri projesinde çalışıyor. Her geliştirici Azure’da 2-4 VM ayağa kaldırıp test ediyor, sonra unutuyor. Aylık fatura 14.000 USD’ye dayandığında DevTest Labs’a geçiş kararı verildi. 6 hafta sonunda fatura 2.800 USD/ay. Bu yazı o kurulumdan notlar.

Azure DevTest Labs Nedir

Resource Manager üstüne bina edilmiş bir self-service ortam yönetim katmanı. Adminin tanımladığı policy çerçevesinde geliştiriciler kendi VM’lerini ayağa kaldırabiliyor, ama:

  • VM SKU’ları, image’lar, lokasyon kısıtlanmış
  • Auto-shutdown şart
  • Cost limit set edilmiş
  • Geliştirici başına max VM sayısı sınırlı
  • Claim-based pool ile pre-provisioned VM’leri “ödünç al”

Sonuç: Geliştirici kendi VM’ini istediği zaman alıp bırakabiliyor, ama kurumsal disiplin var.

Lab Yapılandırma

# Lab oluştur
az resource create 
  --resource-group rg-devtest 
  --resource-type Microsoft.DevTestLab/labs 
  --name lab-engineering 
  --location turkeywest 
  --is-full-object 
  --properties '{
    "labStorageType": "Standard",
    "premiumDataDisks": "Disabled"
  }'

Allowed VM Sizes Policy

Geliştiricilerin GPU VM, mega RAM VM gibi pahalı SKU’lara ulaşmasını engelle:

az lab vm-policy create 
  --lab-name lab-engineering 
  --resource-group rg-devtest 
  --policy-name AllowedVmSizes 
  --policy-type AllowedValuesPolicy 
  --threshold '["Standard_B2ms","Standard_B4ms","Standard_D2s_v5","Standard_D4s_v5"]'

4 VM SKU izinli — küçük (B2ms 2 vCPU 8 GB ~$45/ay), orta (D4s_v5 4 vCPU 16 GB ~$155/ay). Üstüne çıkmak isterse onay süreci.

Per-User VM Limit

az lab vm-policy create 
  --lab-name lab-engineering 
  --resource-group rg-devtest 
  --policy-name MaxVmsPerUser 
  --policy-type MaxVmsAllowedPerUser 
  --threshold "3"

Her geliştirici max 3 VM. 4. denerse hata. Eski sistemde geliştiriciler 8-12 VM açıp unutuyordu.

Auto-Shutdown Schedule

az lab schedule create 
  --lab-name lab-engineering 
  --resource-group rg-devtest 
  --name LabVmsShutdown 
  --status Enabled 
  --task-type LabVmsShutdownTask 
  --time-zone-id "Turkey Standard Time" 
  --daily-recurrence '{"time":"19:00"}' 
  --notification-settings '{
    "status":"Enabled",
    "timeInMinutes":30,
    "emailRecipient":"engineering-leads@example.com"
  }'

Akşam 19:00’da tüm VM’ler otomatik kapanır. 30 dk önce email/Teams notification, geliştirici “snooze 1 hour” yapabilir (gerekirse uzatır).

VM kapalıyken sadece disk ücreti (~$5/ay/disk) ödenir, compute sıfır.

Auto-Start (Sabah Açılış)

az lab schedule create 
  --lab-name lab-engineering 
  --resource-group rg-devtest 
  --name LabVmsAutoStart 
  --status Enabled 
  --task-type LabVmsStartupTask 
  --time-zone-id "Turkey Standard Time" 
  --weekly-recurrence '{
    "time":"08:30",
    "weekdays":["Monday","Tuesday","Wednesday","Thursday","Friday"]
  }'

Hafta içi sabah 08:30 otomatik açılır (sadece flag işaretli VM’ler). Geliştiriciler işe başladıklarında VM hazır.

Custom Image: Kurulum 5 Dakika, Manuel 2 Saat

Mevcut VM’i custom image olarak kaydet, sonradan oluşturulan VM’lere 5 dakikada hazır:

az lab custom-image create 
  --lab-name lab-engineering 
  --resource-group rg-devtest 
  --name dev-base-image 
  --source-vm-resource-id /subscriptions/.../virtualMachines/template-vm

Image içinde VS Code, Git, Docker, Node.js, .NET SDK, JetBrains Rider, Postman önceden yüklü. Yeni başlayan geliştirici 5 dk’da çalışmaya hazır.

Formula: Tek Tıkla VM Provisioning

Formula = “VM template önayar”. Geliştirici “WebDev VM” formula’sını seçer, otomatik olarak: D4s_v5 SKU + dev-base-image + auto-shutdown 19:00 + 256 GB SSD + dev tags.

az lab formula create 
  --lab-name lab-engineering 
  --resource-group rg-devtest 
  --name "WebDev-VM" 
  --description "Web developer VM with VS Code, Node.js, Docker pre-installed" 
  --location turkeywest 
  --size Standard_D4s_v5 
  --image dev-base-image 
  --tags '{"environment":"dev","team":"engineering"}'

Claim-Based Pool: Önceden Hazır VM’leri Ödünç Al

10 geliştirici aynı anda VM açmak istediğinde 5-10 dk provisioning. Claim-based pool ile pre-provisioned VM’ler havuzda bekler, geliştirici claim eder, hemen kullanır:

  • Pool’da sürekli 5 VM hazır (auto-shutdown’a tabi değil iş saatlerinde)
  • Geliştirici claim ettiğinde VM ona transfer edilir, bayrak değişir
  • Geliştirici işi bitirince unclaim eder, VM havuza geri dönmez (silinir, yeni boş VM provision edilir — temiz state için)

Cost Management ve Alert

# Aylık cost limit
az lab cost-management create 
  --lab-name lab-engineering 
  --resource-group rg-devtest 
  --target-cost 3000 
  --threshold 80 100 
  --status Enabled

# %80'e ulaşınca lab admin'e email, %100'e ulaşınca yeni VM provisioning blocklu

Azure DevOps Entegrasyonu

Pipeline’da DevTest Labs task’leri:

- task: AzureDevTestLabsCreateVM@3
  inputs:
    ConnectedServiceName: 'AzureSubscription'
    LabId: '/subscriptions/.../labs/lab-engineering'
    VirtualMachineName: 'integration-test-vm-$(Build.BuildId)'
    TemplateFile: 'arm-template.json'
    
- task: AzureCLI@2
  inputs:
    scriptType: 'bash'
    inlineScript: |
      # Test çalıştır
      ssh -i $SSH_KEY testuser@$VM_IP "cd /app && npm test"
      
- task: AzureDevTestLabsDeleteVM@3
  inputs:
    LabId: '/subscriptions/.../labs/lab-engineering'
    LabVmId: $(Lab.VmId)

Her CI build kendi disposable VM’ini açar, test çalıştırır, siler. Maliyet build başına ~~$0.30.

Hybrid Benefit Kullanımı

Şirketin Visual Studio Enterprise subscription’ı varsa Windows VM’lerinde Azure Hybrid Benefit aktif → %50 indirim. Lab template’inde flag işaretli, otomatik uygulanıyor.

Sonuçlar

Metrik Eski Yeni
Aylık fatura $14.000 $2.800
Ortalama active VM sayısı 97 34
Unutulan VM (24+ saat idle) ~~40 0
Yeni VM provisioning süresi 15-25 dk 5 dk (claim) veya 10 dk (yeni)

Sahada Düşülen Üç Tuzak

  1. Auto-shutdown’a istisna çoğaltmak: Geliştiriciler “benim VM’imi kapatma” ister. Disiplinli ol — özel bir nedenle (uzun süren batch test) sadece o gün için exception.
  2. Custom image’ı güncel tutmamak: 6 ay sonra image güncel değil, geliştiriciler her seferinde manual update yapıyor. Aylık image refresh.
  3. RBAC karışıklığı: Lab User rolü VM yönetir, Lab Owner rolü policy değiştirebilir. Yanlış rol verirse policy bypass.

CloudSpark olarak Azure DevTest Labs kurulumu, custom image hazırlama, formula tasarımı ve Azure DevOps pipeline entegrasyonu için danışmanlık veriyoruz.

🇹🇷 Türkçe🇬🇧 English🇩🇪 Deutsch🇫🇷 Français🇸🇦 العربية🇷🇺 Русский🇪🇸 Español