Azure Cost Management ile Bulut Maliyetlerinizi Kontrol Altına Alın

Bulut faturanız ay sonunda sizi korkutuyorsa, yalnız değilsiniz. Azure’da kaynak oluştururken kolaylık ön planda olduğu için maliyet kontrolü çoğu zaman ikinci plana atılıyor. Sonunda ayın 1’inde gelen faturayla birlikte “bu kadar tutmaz” diye düşündüğünüz bir rakamla yüzleşiyorsunuz. İşte bu yazıda Azure Cost Management aracını kullanarak maliyetlerinizi nasıl analiz edeceğinizi, optimize edeceğinizi ve gelecek için nasıl bütçe planlayacağınızı gerçek dünya senaryolarıyla ele alacağız.

Azure Cost Management Nedir ve Neden Önemlidir?

Azure Cost Management, Microsoft’un bulut harcamalarınızı izlemek, analiz etmek ve optimize etmek için sunduğu ücretsiz bir araçtır. AWS’in Cost Explorer’ına benzer şekilde çalışır, ancak doğrudan Azure Portal’a entegre gelir. Ek bir lisans ya da kurulum gerektirmez.

Peki neden bu kadar kritik? Çünkü Azure’da kaynaklar saatlik ücretlendirilir ve farkında olmadan çalışan onlarca VM, boşta duran disk, kullanılmayan IP adresi birikiyor. Bir production VM’i test için klonlayıp kapamayı unutursunuz, bir storage account üzerinde gereksiz veri tutarsınız ya da Premium SSD seçeneğini varsayılan olarak bırakırsınız. Bunların her biri küçük miktarlarda görünse de ölçeklenince ciddi rakamlara ulaşır.

Cost Management’ın sağladığı temel avantajlar:

  • Gerçek zamanlı harcama görünürlüğü sayesinde sürpriz faturalar ortadan kalkar
  • Tag tabanlı maliyet dağılımı ile hangi ekip, proje veya ortamın ne kadar harcadığını görebilirsiniz
  • Anomali tespiti ile beklenmedik maliyet artışlarında otomatik uyarı alırsınız
  • Advisor entegrasyonu sayesinde optimization önerileri doğrudan maliyet ekranında görünür
  • Export özelliği ile verileri kendi BI araçlarınıza aktarabilirsiniz

Temel Kavramlar: Scope, Subscription ve Resource Group

Cost Management kullanmadan önce “scope” kavramını anlamanız gerekiyor. Scope, maliyet verisini hangi seviyede görüntülemek istediğinizi belirler.

  • Management Group: Birden fazla subscription’ı yöneten organizasyonlar için üst seviye görünüm
  • Subscription: Tek bir Azure aboneliğinin tüm maliyetleri
  • Resource Group: Belirli bir kaynak grubuna ait harcamalar
  • Resource: Tek bir kaynağın maliyeti (VM, SQL, Storage gibi)

Eğer bir organizasyonda birden fazla departman varsa Management Group seviyesinde çalışmak en mantıklısıdır. Küçük ekipler için Subscription veya Resource Group yeterlidir.

Azure CLI ile Maliyet Verisi Çekme

Portal üzerinden görsel analiz yapmak güzel, ancak gerçek bir sysadmin’in silahı CLI’dır. Azure CLI ile maliyet verilerini çekebilir, scriptlere entegre edebilirsiniz.

Önce gerekli extension’ı yükleyin:

az extension add --name costmanagement

Belirli bir subscription için bu ayın maliyetini sorgulamak:

az costmanagement query 
  --type Usage 
  --scope "subscriptions/YOUR_SUBSCRIPTION_ID" 
  --timeframe MonthToDate 
  --dataset-granularity Daily 
  --dataset-aggregation '{"totalCost": {"name": "Cost", "function": "Sum"}}' 
  --query "properties.rows" 
  --output table

Resource group bazında maliyet analizi yapmak istiyorsanız:

az costmanagement query 
  --type Usage 
  --scope "subscriptions/YOUR_SUBSCRIPTION_ID" 
  --timeframe MonthToDate 
  --dataset-granularity None 
  --dataset-aggregation '{"totalCost": {"name": "Cost", "function": "Sum"}}' 
  --dataset-grouping '[{"type": "Dimension", "name": "ResourceGroupName"}]' 
  --query "properties.rows" 
  --output json

Bu komutun çıktısı JSON formatında gelir ve her satırda kaynak grubu adı ile toplam maliyet yer alır. Bu veriyi bir CSV’e yazarak aylık raporlama süreçlerinize entegre edebilirsiniz.

PowerShell ile Otomatik Maliyet Raporu

Windows ortamlarında ya da hybrid senaryolarda PowerShell daha yaygın kullanılır. Aşağıdaki script, her subscription için aylık maliyeti çekip e-posta formatında hazırlar:

# PowerShell ile Azure maliyet raporu
# Az.CostManagement modülünü kur
Install-Module -Name Az.CostManagement -Force -AllowClobber

# Azure'a bağlan
Connect-AzAccount

# Subscription ID'yi tanımla
$subscriptionId = "YOUR_SUBSCRIPTION_ID"
$scope = "subscriptions/$subscriptionId"

# Bu ay için maliyet sorgusu
$query = @{
    Type = "Usage"
    Timeframe = "MonthToDate"
    DatasetGranularity = "Daily"
    DatasetAggregation = @{
        "totalCost" = @{
            Name     = "Cost"
            Function = "Sum"
        }
    }
    DatasetGrouping = @(
        @{
            Type = "Dimension"
            Name = "ServiceName"
        }
    )
}

$result = Invoke-AzCostManagementQuery -Scope $scope -Type $query.Type `
    -TimeframeType $query.Timeframe `
    -DatasetGranularity $query.DatasetGranularity

Write-Output "Servis bazlı maliyet raporu:"
$result.Row | ForEach-Object {
    Write-Output "Servis: $($_[1]) - Maliyet: $($_[0]) USD"
}

Budget ve Alert Kurulumu

Maliyet analizi tek başına yeterli değil. Asıl önemli olan harcama belirli bir eşiği aşmadan uyarı almak. Azure’da budget tanımlayarak hem ekibinizi hem de kendinizi koruyabilirsiniz.

CLI ile budget tanımlamak oldukça basit:

# Monthly budget tanımla ve uyari kur
az consumption budget create 
  --budget-name "monthly-production-budget" 
  --amount 5000 
  --time-grain Monthly 
  --start-date 2024-01-01 
  --end-date 2025-12-31 
  --resource-group "production-rg" 
  --notifications '[
    {
      "enabled": true,
      "operator": "GreaterThan",
      "threshold": 80,
      "contactEmails": ["[email protected]", "[email protected]"],
      "contactRoles": ["Owner", "Contributor"],
      "thresholdType": "Actual"
    },
    {
      "enabled": true,
      "operator": "GreaterThan",
      "threshold": 100,
      "contactEmails": ["[email protected]"],
      "contactRoles": ["Owner"],
      "thresholdType": "Forecasted"
    }
  ]'

Burada iki kritik alert tanımladık:

  • %80 Actual: Gerçek harcama bütçenin %80’ine ulaşınca uyarı gönderir
  • %100 Forecasted: Tahmini harcama bütçeyi aşacak görünüyorsa önceden uyarır

Forecasted alert son derece değerli çünkü ayın ortasında ayın sonu tahminine göre aksiyon almanızı sağlar.

Tag Stratejisi ile Maliyet Dağılımı

Azure’da maliyet yönetiminin en güçlü özelliklerinden biri tag’lere dayalı gruplama. Ama bu sadece portal’da etiket eklemekten ibaret değil. Tutarlı bir tag stratejisi olmadan maliyet dağılımı anlamlı olmaz.

Önerilen tag yapısı:

  • Environment: production, staging, development, test
  • Project: proje-adi veya proje kodu
  • Team: altyapi, backend, frontend, veri
  • CostCenter: muhasebe kodu (102, 205 gibi)
  • Owner: kaynaktan sorumlu kişinin e-postası

Bu tagları zorunlu kılmak için Azure Policy kullanabilirsiniz:

# Zorunlu tag policy tanimla
az policy definition create 
  --name "require-environment-tag" 
  --display-name "Environment tagi zorunludur" 
  --description "Tum kaynaklar environment tagine sahip olmalidir" 
  --rules '{
    "if": {
      "field": "tags[Environment]",
      "exists": "false"
    },
    "then": {
      "effect": "deny"
    }
  }' 
  --mode Indexed

# Policy'i subscription seviyesinde ata
az policy assignment create 
  --name "enforce-environment-tag" 
  --policy "require-environment-tag" 
  --scope "/subscriptions/YOUR_SUBSCRIPTION_ID"

Bu policy atandıktan sonra Environment tagı olmayan hiçbir kaynak oluşturulamaz. Başlangıçta ekipten itiraz görebilirsiniz, ancak ay sonundaki fatura analizi geldiğinde herkes tag’lemenin değerini anlar.

Mevcut kaynakları taglemek için ise toplu script kullanın:

# Bir resource group'taki tum kaynaklari toplu taglemek
RESOURCE_GROUP="legacy-rg"
ENVIRONMENT="production"
PROJECT="ecommerce"
TEAM="backend"

# Resource group altindaki tum kaynaklari listele ve tagla
az resource list --resource-group $RESOURCE_GROUP --query "[].id" -o tsv | 
while read resource_id; do
  az resource tag 
    --ids "$resource_id" 
    --tags Environment=$ENVIRONMENT Project=$PROJECT Team=$TEAM 
    --is-incremental
  echo "Taglendi: $resource_id"
done

--is-incremental parametresi mevcut tagleri silmeden yeni tagleri ekler. Bunu kullanmazsanız kaynağın tüm mevcut tagleri silinir, dikkatli olun.

Gerçek Dünya Senaryosu: Beklenmedik Maliyet Artışı

Geçen yıl bir müşterimizde yaşanan gerçek bir senaryoyu anlatayım. Normalde aylık 8.000 dolar harcayan bir Azure subscription’ında bir ay ani olarak 14.000 dolara çıkış yaşandı. Cost Management’ı aktif kullandıkları için ayın 15’inde %80 budget alert’i aldılar.

İlk adım olarak servis bazlı breakdown’a baktık:

# Son 30 gunun maliyet dagiliminı servis bazinda goster
az costmanagement query 
  --type Usage 
  --scope "subscriptions/YOUR_SUBSCRIPTION_ID" 
  --timeframe LastMonth 
  --dataset-granularity None 
  --dataset-aggregation '{"totalCost": {"name": "Cost", "function": "Sum"}}' 
  --dataset-grouping '[
    {"type": "Dimension", "name": "ServiceName"},
    {"type": "Dimension", "name": "ResourceGroupName"}
  ]' 
  --query "sort_by(properties.rows, &[0])" 
  --output table

Çıktı analiz edildiğinde “Bandwidth” ve “Storage” kalemlerinin beklenmedik şekilde arttığı görüldü. Sonrasında storage account’lara baktık ve bir developer’ın test amaçlı yüklediği video dosyalarının production storage account’una gönderildiği ortaya çıktı. 2 TB’ın üzerinde gereksiz veri depolanıyordu ve üstüne birde bu veriyi dışarı serve eden bir uygulama yüzünden egress trafiği astronomik şekilde artmıştı.

Çözüm hızlı oldu: gereksiz veriler silindi, lifecycle policy tanımlandı, geliştirme ortamı için ayrı storage account oluşturuldu. Ama asıl ders şu: Tag stratejisi ve budget alert olmasa bu durumu bir ay sonra fatura geldiğinde öğreneceklerdi.

Cost Export ile Özel Raporlama

Azure’un built-in raporları çoğu zaman yeterlidir, ancak bazen verileri kendi sistemlerinize çekmeniz gerekir. Muhasebe departmanına özel format, BI aracına entegrasyon veya uzun vadeli trend analizi için export kullanın.

# Maliyet verilerini storage account'a otomatik export et
az costmanagement export create 
  --name "monthly-cost-export" 
  --scope "subscriptions/YOUR_SUBSCRIPTION_ID" 
  --type Usage 
  --schedule-recurrence Monthly 
  --schedule-recurrence-period from="2024-01-01" to="2025-12-31" 
  --storage-account-id "/subscriptions/YOUR_SUBSCRIPTION_ID/resourceGroups/reporting-rg/providers/Microsoft.Storage/storageAccounts/costexportstorage" 
  --storage-container "cost-reports" 
  --storage-directory "monthly" 
  --dataset-type AmortizedCost 
  --dataset-granularity Daily

Bu komutla her ay otomatik olarak CSV formatında maliyet verisi belirttiğiniz storage account’a yazılır. Oradan Power BI, Grafana veya özel script’lerinizle işleyebilirsiniz.

AmortizedCost vs ActualCost farkına dikkat edin:

  • ActualCost: Rezervasyon ve savings plan maliyetlerini satın alındığı ayda gösterir, gerçek nakit akışını yansıtır
  • AmortizedCost: Rezervasyon maliyetlerini kullanım süresine dağıtır, gerçek kullanım maliyetini görmek için idealdir

Azure Advisor ile Maliyet Optimizasyonu

Cost Management tek başına harcamaları gösterir, ancak ne yapmanız gerektiğini Azure Advisor söyler. İkisini birlikte kullanmak optimize edilmiş bir maliyet yönetimi altyapısı oluşturur.

# Azure Advisor maliyet onerilerini listele
az advisor recommendation list 
  --category Cost 
  --query "[].{
    Kaynak: resourceMetadata.resourceId,
    Oneri: shortDescription.solution,
    TasarrufPotansiyeli: extendedProperties.annualSavingsAmount,
    Para: extendedProperties.savingsCurrency
  }" 
  --output table

Advisor’un en sık önerdiği aksiyonlar:

  • Kullanılmayan VM’leri kapat ya da deallocate et: CPU kullanımı %5’in altında olan VM’leri tespit eder
  • Reserved Instance satın al: Sürekli çalışan kaynaklar için %40-72 tasarruf sağlayabilir
  • Oversized VM’leri resize et: 8 core VM’in sadece 1 core kullandığını tespit edip 2 core’a düşürmeyi önerir
  • Kullanılmayan public IP’leri sil: Bağlı olmayan statik IP’ler de ücretlendirilir
  • Unmanaged disk’leri managed’a çevir: Genellikle daha ucuz ve daha yönetilebilir olur

Anomali Tespiti ve Otomatik Aksiyonlar

Azure Cost Management’ın son dönemdeki en güçlü özelliklerinden biri anomali tespiti. Makine öğrenmesi tabanlı bu sistem, harcama pattern’inizi öğrenerek beklenmedik artışları otomatik tespit eder.

Anomali uyarılarını Azure Monitor ile entegre edip Logic App veya Automation Account üzerinden otomatik aksiyon tetikleyebilirsiniz. Örneğin, maliyet anomalisi tespit edildiğinde otomatik olarak yeni VM oluşturulmasını engelleyen bir policy devreye girebilir:

# Belirli bir resource group icin maliyet anomali uyarisi olustur
az monitor alert create 
  --name "cost-anomaly-alert" 
  --resource-group "monitoring-rg" 
  --condition "avg BilledCost > 150" 
  --window-size 1d 
  --evaluation-frequency 1h 
  --action-group "/subscriptions/YOUR_SUBSCRIPTION_ID/resourceGroups/monitoring-rg/providers/microsoft.insights/actionGroups/cost-alert-action-group" 
  --description "Gunluk maliyet beklenen degerin uzerinde"

Action Group’u e-posta, SMS, webhook veya Azure Function ile tetikleyebilirsiniz. Webhook kullanarak kendi sisteminize notification gönderebilir, Teams veya Slack kanalına mesaj atabilirsiniz.

Savings Plan ve Reserved Instance Analizi

Uzun vadeli maliyet optimizasyonunun en etkili yolu commitment-based fiyatlandırma. Azure’da iki temel seçenek var:

  • Reserved Instances (RI): Belirli bir VM tipi, region ve OS için 1 veya 3 yıllık rezervasyon. %40-72 tasarruf
  • Azure Savings Plan for Compute: Daha esnek, herhangi bir compute kaynağı için saatlik taahhüt. Yaklaşık %15-37 tasarruf

Hangi kaynakları reserve etmeniz gerektiğini anlamak için geçmiş kullanım verisine bakın:

# Son 30 gunun VM kullanim verilerini cek
az consumption usage list 
  --start-date $(date -d '30 days ago' +%Y-%m-%d) 
  --end-date $(date +%Y-%m-%d) 
  --query "[?contains(instanceName, 'prod')].{
    VM: instanceName,
    Maliyet: pretaxCost,
    Kullanim: usageQuantity,
    Birim: unitOfMeasure
  }" 
  --output table

Sürekli çalışan ve önümüzdeki 1-3 yıl içinde değişmeyecek kaynaklar için RI satın almayı düşünün. Değişkenlik gösteren ya da deneysel kaynaklar için Pay-as-you-go’da kalın.

Departman Bazlı Chargeback Modeli

Kurumsal ortamlarda her departmanın kendi bulut harcamasından sorumlu tutulması yaygın bir model. Buna “chargeback” denir. Cost Management ile bu modeli uygulamak için:

  • Her departman için ayrı Resource Group veya Subscription kullanın
  • Subscription seviyesinde Management Group altında gruplayın
  • Tag’leri CostCenter bazında zorunlu kılın
  • Aylık export ile muhasebe sistemine entegre edin

Bu modeli uyguladığınızda departman yöneticileri kendi harcamalarını görebilir ve gereksiz kaynakları kapatmak için motivation sahibi olur. “Biz kullanmasak da IT ödüyor” düşüncesi ortadan kalkar.

Maliyet Yönetimi Dashboard Oluşturma

Azure Portal’da özel dashboard oluşturmak için Cost Management widget’larını kullanabilirsiniz. Ancak daha esnek bir raporlama için Grafana veya Power BI tercih edilir.

Grafana için Azure Cost Management data source plugin’ini kullanabilirsiniz. Export ettiğiniz CSV’leri de doğrudan Grafana’ya beslemeniz mümkün. Tipik bir maliyet dashboard’u şunları içermelidir:

  • Günlük harcama trendi (son 30 gün)
  • Servis bazlı maliyet pasta grafiği
  • Resource group bazlı karşılaştırma
  • Bütçe kullanım yüzdesi gauge
  • En pahalı 10 kaynak listesi
  • Anomali alert durumu

Sonuç

Azure Cost Management, kurumsal ya da bireysel kullanım fark etmeksizin her Azure kullanıcısının önce öğrenmesi gereken araçların başında geliyor. Fatura sürprizi yaşamamak, cloud harcamalarını şeffaf hale getirmek ve optimizasyon fırsatlarını kaçırmamak için bu aracı aktif olarak kullanmak şart.

Özet olarak yapmanız gerekenler:

  • Hemen bugün budget alert kurun, en azından subscription seviyesinde %80 ve %100 threshold ile
  • Bu hafta tag stratejinizi belirleyin ve Azure Policy ile zorunlu hale getirin
  • Bu ay tüm kaynaklarınıza tag uygulayın ve kaynak grubu bazlı maliyet dağılımına bakın
  • Bu çeyrekte Advisor önerilerini gözden geçirin ve RI satın alımı değerlendirin
  • Sürekli aylık export ile trend takibi yapın ve anomali alert’lerini aktif tutun

Bulut maliyetleri kontrol edilmezse hızla büyür. Ama doğru araçlar ve süreçlerle çalışıldığında Azure’u hem verimli hem de uygun maliyetli şekilde kullanmak kesinlikle mümkün. Cost Management bu sürecin merkezinde yer alıyor ve iyi haber şu: tamamen ücretsiz.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir