İ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
- 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.
- 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.
- 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.



