Azure Reservations ile Bulut Maliyetlerini Optimize Etme
Bulut maliyetleri konusunda IT müdürünüzle yaptığınız toplantıları düşünün. Ekran başında Azure faturasına bakıyorsunuz, rakamlar büyüyor ve birisi masaya yumruk vuruyor: “Bu kadar mı harcıyoruz?!” İşte tam bu noktada Azure Reservations devreye giriyor ve doğru kullanıldığında faturanızı yüzde 40-70 arasında düşürebiliyorsunuz. Bu yazıda rezervasyonları teknik detaylarıyla ele alacağız, gerçek senaryolar üzerinden nasıl optimize edeceğinizi göstereceğiz.
Azure Reservations Nedir ve Neden Önemlidir?
Azure Reservations, belirli kaynaklar için 1 veya 3 yıllık taahhüt karşılığında önemli indirimler sunan Microsoft’un ön ödeme modelidir. Pay-as-you-go (kullandıkça öde) fiyatlandırmasının aksine, rezervasyonla “bu kaynağı bu süre boyunca kullanacağım” diyorsunuz ve Microsoft da buna karşılık ciddi indirim yapıyor.
Hangi kaynaklar için rezervasyon satın alabilirsiniz?
- Virtual Machines: En yaygın kullanım senaryosu
- SQL Database ve SQL Managed Instance: Veritabanı maliyetlerini düşürmek için
- Azure Cosmos DB: NoSQL iş yükleri için
- App Service: Web uygulamaları için
- Azure Blob Storage: Depolama maliyetleri için
- Azure Disk Storage: Managed disk rezervasyonları
- Azure Cache for Redis: Önbellek maliyetleri
- Azure Databricks: Büyük veri iş yükleri
- Azure VMware Solution: Hybrid senaryolar
Önemli nokta şu: Rezervasyon satın aldığınızda kapasite garantisi değil, fiyat indirimi satın almış oluyorsunuz. Yani rezerve ettiğiniz VM türünü çalıştırıyorsanız otomatik olarak indirimden yararlanıyorsunuz, ek bir yapılandırma gerektirmiyor.
Rezervasyon Satın Almadan Önce: Kullanım Analizi
Rezervasyon satın almak geri döndürülemeyen bir karar değil, ama yanlış boyut seçmek para israfına yol açar. Önce mevcut kullanımınızı analiz etmeniz şart.
Azure Cost Management üzerinden kullanım verilerini PowerShell ile çekebilirsiniz:
# Azure CLI ile VM kullanım verilerini çekme
az consumption usage list
--start-date 2024-01-01
--end-date 2024-03-31
--query "[?contains(instanceId, 'virtualMachines')]"
--output json > vm_usage.json
Bu veriyi analiz etmek için basit bir Python scripti:
# Python ile kullanım analizi
python3 << 'EOF'
import json
import pandas as pd
from datetime import datetime
with open('vm_usage.json', 'r') as f:
data = json.load(f)
df = pd.DataFrame(data)
df['usageQuantity'] = pd.to_numeric(df['usageQuantity'])
# VM başına ortalama kullanım saati
usage_summary = df.groupby('instanceId').agg({
'usageQuantity': ['sum', 'mean'],
'pretaxCost': 'sum'
}).round(2)
print("VM Kullanim Ozeti:")
print(usage_summary)
print(f"nToplam maliyet: ${df['pretaxCost'].sum():.2f}")
EOF
Azure Advisor da size otomatik olarak rezervasyon önerileri sunuyor. Bu önerileri CLI üzerinden de görebilirsiniz:
# Azure Advisor rezervasyon önerilerini listeleme
az advisor recommendation list
--category Cost
--query "[?shortDescription.problem=='Buy virtual machine reserved instances to save money over pay-as-you-go costs']"
--output table
Şunu kesinlikle aklınızdan çıkarmayın: En az 30 günlük kullanım verisi olmadan rezervasyon satın almayın. Tercihen 60-90 günlük veri daha sağlıklı karar vermenizi sağlar.
Rezervasyon Kapsamı Seçimi: Single vs Shared
Rezervasyon satın alırken kapsam seçimi kritik bir karar. Üç seçeneğiniz var:
Single Resource Group Scope: Sadece belirli bir resource group içindeki VM’lere uygulanır. Küçük ekipler veya izole projeler için mantıklı.
Single Subscription Scope: Bir abonelik içindeki tüm uygulanabilir VM’lere otomatik dağılır.
Shared Scope: Birden fazla abonelikte çalışır, Enterprise Agreement veya Microsoft Customer Agreement hesapları için ideal.
Büyük organizasyonlarda shared scope kullanmak rezervasyonun “boşa gitmesini” önlüyor. Şöyle düşünün: Dev ortamınızdaki VM gece 00:00’da kapanıyor ve rezervasyonunuz o saatte boşa gidecek. Shared scope ile aynı VM ailesinden başka bir abonelikte çalışan VM bu rezervasyonu otomatik olarak kullanıyor.
# Rezervasyon kapsamını güncelleme
az reservations reservation update
--reservation-id "/providers/Microsoft.Capacity/reservationOrders/{orderId}/reservations/{reservationId}"
--applied-scope-type Shared
Instance Size Flexibility: Kritik Bir Özellik
Azure rezervasyonlarının en güçlü özelliklerinden biri Instance Size Flexibility (ISF). Bu özellik etkin olduğunda, aynı VM serisinin farklı boyutlarına otomatik olarak indirim uygulanıyor.
Örneğin D4s_v3 rezervasyonu aldınız. ISF ile bu rezervasyon:
- D2s_v3 (2 adet, çünkü D4 = 2x D2)
- D8s_v3 (yarım rezervasyon, kalan yarı pay-as-you-go)
- D4s_v3 (tam olarak)
şeklinde esnek bir şekilde kullanılabiliyor.
# Mevcut rezervasyonun ISF durumunu kontrol etme
az reservations reservation show
--reservation-id "/providers/Microsoft.Capacity/reservationOrders/{orderId}/reservations/{reservationId}"
--query "properties.instanceFlexibility"
--output tsv
# ISF'yi etkinleştirme
az reservations reservation update
--reservation-id "/providers/Microsoft.Capacity/reservationOrders/{orderId}/reservations/{reservationId}"
--instance-flexibility On
ISF’nin çalışmadığı durumlar da var: Isolated VM serileri (Ev4, Mv2 gibi) ve bazı özel donanım gereksinimi olan VM’ler için bu özellik devre dışı kalıyor.
Gerçek Dünya Senaryosu: E-Ticaret Altyapısı
Bir e-ticaret firması düşünelim. Altyapıları şöyle:
- 10 adet Standard_D4s_v3 (web sunucuları, 7/24 çalışıyor)
- 4 adet Standard_E8s_v3 (veritabanı cache, 7/24)
- 6 adet Standard_D2s_v3 (background job işleyiciler, hafta içi 08:00-20:00)
Pay-as-you-go maliyeti aylık yaklaşık 8.500 dolar. Rezervasyon analizi yapıldığında:
Web sunucuları 7/24 çalıştığı için 3 yıllık rezervasyon en mantıklı seçim. Background job sunucuları sadece 12 saat/gün, 5 gün/hafta çalıştığı için pay-as-you-go’da kalıyor ya da Savings Plans ile ele alınıyor.
# Rezervasyon satın alma simülasyonu için fiyat hesaplama
az reservations catalog show
--reserved-resource-type VirtualMachines
--location eastus
--query "[?skuName=='Standard_D4s_v3']"
--output json
# Rezervasyon satın alma (örnek komut)
az reservations reservation-order purchase
--reservation-order-id $(cat /proc/sys/kernel/random/uuid)
--sku Standard_D4s_v3
--location eastus
--reserved-resource-type VirtualMachines
--billing-scope /subscriptions/{subscription-id}
--term P3Y
--billing-plan Upfront
--quantity 10
--applied-scope-type Shared
--display-name "WebServers-Prod-Reservation"
Bu senaryoda 3 yıllık rezervasyon ile web sunucuları ve cache sunucuları için yıllık yaklaşık 38.000 dolar tasarruf edilebiliyor. Background job’lar pay-as-you-go’da kalıyor çünkü kullanım oranı düşük.
Rezervasyon Kullanım Oranını İzleme
Rezervasyon aldınız ama gerçekten kullanılıyor mu? Kullanım oranını izlemek, paranızın boşa gidip gitmediğini görmek için kritik.
# Rezervasyon kullanım detaylarını çekme
az consumption reservations details
--reservation-order-id "{reservation-order-id}"
--start-date 2024-01-01
--end-date 2024-01-31
--output json | python3 -c "
import json, sys
data = json.load(sys.stdin)
total = len(data)
used = sum(1 for r in data if float(r.get('usedQuantity', 0)) > 0)
utilization = (used/total)*100 if total > 0 else 0
print(f'Toplam kayit: {total}')
print(f'Kullanilan: {used}')
print(f'Kullanim orani: {utilization:.1f}%')
"
Kullanım oranı yüzde 80’in altına düşerse bir sorun var demektir. Bu durumda ne yapabilirsiniz?
- Exchange: Farklı bir VM boyutu veya bölgesiyle değiştirme
- Return: Erken iade (yıllık 50.000 dolar sınırı var)
- Kapsam genişletme: Rezervasyonu farklı aboneliklere de uygulama
# Rezervasyon exchange işlemi için yeni rezervasyon talebi
az reservations reservation-order purchase
--sku Standard_D8s_v3
--location westeurope
--reserved-resource-type VirtualMachines
--billing-scope /subscriptions/{subscription-id}
--term P1Y
--billing-plan Upfront
--quantity 5
--applied-scope-type Shared
--display-name "WebServers-Exchange-Reservation"
# Exchange tamamlandıktan sonra eski rezervasyonu iptal etme
az reservations reservation return
--reservation-order-id "{old-order-id}"
--reservation-id "{old-reservation-id}"
--return-reason "Upscaling VM size"
--session-id $(cat /proc/sys/kernel/random/uuid)
Otomatik Rezervasyon Raporlama
Manuel olarak her ay kontrol etmek yorucu. Bunu otomatize etmek için basit bir monitoring scripti:
#!/bin/bash
# reservation_monitor.sh - Rezervasyon kullanim izleme scripti
THRESHOLD=80
ALERT_EMAIL="[email protected]"
LOG_FILE="/var/log/azure_reservation_monitor.log"
DATE=$(date +%Y-%m-%d)
echo "[$DATE] Rezervasyon kullanim kontrolu basliyor..." >> $LOG_FILE
# Tum rezervasyonlari listele
RESERVATIONS=$(az reservations reservation list-all
--query "[].{id:id, displayName:properties.displayName, quantity:properties.quantity}"
--output json 2>/dev/null)
if [ -z "$RESERVATIONS" ]; then
echo "[$DATE] HATA: Rezervasyon listesi alinamadi" >> $LOG_FILE
exit 1
fi
# Her rezervasyon icin kullanim kontrolu
echo "$RESERVATIONS" | python3 << 'PYEOF'
import json, sys, os, subprocess
from datetime import datetime, timedelta
reservations = json.loads(sys.stdin.read())
threshold = int(os.environ.get('THRESHOLD', 80))
issues = []
for res in reservations:
res_id = res['id']
display_name = res.get('displayName', 'Bilinmiyor')
# Son 7 gunluk kullanim (basit simulasyon)
print(f"Kontrol ediliyor: {display_name}")
# Gercek ortamda az consumption komutu ile kullanim cekilecek
# Burada threshold altindaki durumlar loglanacak
print(f" Rezervasyon ID: {res_id[-8:]}")
print("nKontrol tamamlandi.")
PYEOF
echo "[$DATE] Kontrol tamamlandi" >> $LOG_FILE
Bu scripti cron ile günlük çalıştırabilir, kritik düşüşlerde Slack veya Teams’e bildirim gönderebilirsiniz.
SQL Database ve Managed Instance Rezervasyonları
VM’lerin yanı sıra veritabanı rezervasyonları da ciddi tasarruf sağlıyor. Özellikle production SQL veritabanları genellikle 7/24 çalıştığı için rezervasyon mükemmel bir seçim.
# SQL Database rezervasyonları için katalog kontrolü
az reservations catalog show
--reserved-resource-type SqlDatabases
--location eastus
--output table
# SQL Managed Instance rezervasyon satın alma
az reservations reservation-order purchase
--sku GP_Gen5_4
--location eastus
--reserved-resource-type SqlManagedInstances
--billing-scope /subscriptions/{subscription-id}
--term P1Y
--billing-plan Monthly
--quantity 1
--applied-scope-type Shared
--display-name "ProdDB-ManagedInstance-Reservation"
SQL rezervasyonlarında dikkat edilmesi gereken nokta: DTU tabanlı ve vCore tabanlı modeller ayrı ayrı rezervasyon gerektiriyor. Yanlış modeli rezerve ederseniz indirim uygulanmıyor.
Savings Plans vs Reservations: Hangisi Ne Zaman?
Azure Savings Plans nispeten yeni bir seçenek ve Reservations ile sıkça karıştırılıyor. Fark şu:
Azure Reservations:
- Belirli bir VM boyutu/bölgesine bağlı
- Daha yüksek indirim (yüzde 40-70)
- Esnek değişim imkanı kısıtlı
- Sabit iş yükleri için ideal
Azure Savings Plans:
- Saatlik harcama taahhüdü (örneğin saatte 5 dolar)
- Daha düşük indirim (yüzde 11-65 arası)
- VM boyutu, bölge ve hatta servis değişikliklerinde bile geçerli
- Dinamik iş yükleri için ideal
Pratik kural: Yüzde 80 veya üzerinde kullanım oranıyla 7/24 çalışan stabil iş yükleri için Reservations, sürekli ölçeklenen veya farklı VM tiplerinde koşan workload’lar için Savings Plans daha mantıklı.
# Savings Plans satın alma
az billing-benefits savings-plan-order create
--sku-name Compute_Savings_Plan
--billing-scope /subscriptions/{subscription-id}
--term P1Y
--billing-plan P1M
--commitment amount=5 currency=USD grain=Hourly
--display-name "ProdWorkload-SavingsPlan"
Rezervasyon Yönetimi İçin İyi Pratikler
Yıllar içinde öğrendiğim bazı kritik noktalar:
Amortisman takibi yapın: Rezervasyonu satın aldığınızda muhasebe departmanınız bunu doğru sınıflandırmalı. 3 yıllık rezervasyon için ödenen peşin ücret, 36 aya bölünerek aylık maliyet olarak raporlanmalı.
Vade bitimlerini takip edin: Bir rezervasyon sona erdiğinde otomatik olarak pay-as-you-go fiyatına geçiyor. Bunu kaçırmak ciddi fatura artışına yol açıyor.
# Bitmek uzere olan rezervasyonları listeleme (90 gun icinde)
az reservations reservation list-all
--query "[?properties.expiryDate != null]"
--output json | python3 -c "
import json, sys
from datetime import datetime, timedelta
data = json.load(sys.stdin)
now = datetime.now()
ninety_days = now + timedelta(days=90)
expiring = []
for r in data:
expiry_str = r.get('properties', {}).get('expiryDate', '')
if expiry_str:
try:
expiry = datetime.fromisoformat(expiry_str.replace('Z', '+00:00').replace('+00:00', ''))
if expiry.replace(tzinfo=None) < ninety_days:
expiring.append({
'name': r.get('properties', {}).get('displayName', 'N/A'),
'expiry': expiry_str,
'id': r.get('id', '')[-20:]
})
except:
pass
if expiring:
print('90 gun icinde bitmek uzere olan rezervasyonlar:')
for e in expiring:
print(f" - {e['name']}: {e['expiry']}")
else:
print('90 gun icinde bitmesi planlanan rezervasyon yok.')
"
Tag stratejisi kullanın: Rezervasyonları satın alırken hangi departman, proje veya maliyet merkezi için olduğunu tag’lemek, chargeback raporlaması için hayat kurtarıyor.
Rezervasyon sahipliği atayın: Her rezervasyonun bir sahibi olmalı. Bu kişi kullanım oranını izlemeli ve gerektiğinde aksiyon almalı.
Fiyat değişikliklerini takip edin: Microsoft zaman zaman VM fiyatlarını düşürüyor. Eğer yeni pay-as-you-go fiyatı rezervasyon fiyatınıza yaklaşırsa, erken iade edip yeniden değerlendirmeniz mantıklı olabilir.
Enterprise Agreement ve MCA Müşterileri İçin Özel Notlar
Enterprise Agreement (EA) ve Microsoft Customer Agreement (MCA) müşterileri için rezervasyon yönetimi biraz farklı işliyor.
EA müşterilerinde rezervasyon satın alma yetkisi varsayılan olarak Enterprise Administrator’da. Bu yetkiyi departman yöneticilerine veya abonelik sahiplerine de verebilirsiniz. Büyük organizasyonlarda merkezi rezervasyon yönetimi yerine her iş biriminin kendi rezervasyonlarını almasına izin vermek daha esnek bir yapı sağlıyor, ancak yönetim karmaşıklaşıyor.
# EA kapsamında rezervasyon için billing hesabını belirleme
az billing account list
--query "[].{name:name, displayName:properties.displayName, agreementType:properties.agreementType}"
--output table
# MCA billing profili listesi
az billing profile list
--account-name "{billing-account-name}"
--output table
Maliyet Optimizasyonunda Bütünsel Yaklaşım
Rezervasyonlar tek başına yeterli değil. Gerçek maliyet optimizasyonu için şu unsurları bir arada düşünmeniz gerekiyor:
- Right-sizing: Fazla boyutlandırılmış VM’leri küçültmek, ardından rezervasyon almak. Önce boyut, sonra rezervasyon!
- Auto-shutdown: Dev/test ortamları için gece kapanma politikaları
- Spot Instances: Kesintiye toleranslı iş yükleri için yüzde 90’a varan indirim
- Reserved + Spot karışımı: Production için rezervasyon, scale-out için Spot
- Azure Hybrid Benefit: Mevcut Windows Server veya SQL Server lisanslarınızı Azure’da kullanma
# Hybrid Benefit etkin VM'leri listeleme
az vm list
--query "[?licenseType=='Windows_Server']"
--output table
# Hybrid Benefit etkinleştirme
az vm update
--resource-group prod-rg
--name web-server-01
--license-type Windows_Server
Azure Hybrid Benefit, özellikle on-premise’den buluta geçiş yapan organizasyonlar için Reserved Instances ile birlikte kullanıldığında en yüksek tasarrufu sağlıyor. İki indirim birbirinin üstüne uygulanıyor ve toplam tasarruf pay-as-you-go fiyatına göre yüzde 80’e kadar çıkabiliyor.
Sonuç
Azure Reservations, doğru analiz ve planlama ile bulut maliyetlerinizi ciddi ölçüde azaltmanın en etkili yollarından biri. Ancak körü körüne rezervasyon almak para kaybettirir. Şu sıralamayı takip edin:
Önce kullanım verilerinizi analiz edin ve hangi iş yüklerinin stabil olduğunu tespit edin. Ardından Instance Size Flexibility ve kapsam seçimini doğru yapın. Rezervasyon sonrası kullanım oranını düzenli izleyin ve gerektiğinde exchange veya iade seçeneklerini değerlendirin. Vade takibini bir takvime ekleyin, çünkü süre dolumunu kaçırmak anında fatura şoku yaratır.
Rezervasyonları Hybrid Benefit, right-sizing ve Spot Instance stratejileriyle birleştirdiğinizde Azure faturanızda gerçekten dramatik düşüşler görebilirsiniz. En büyük hata şu: “Önce alayım, sonra optimizasyona bakarız.” Doğrusu tam tersi. Önce optimize edin, sonra optimize edilmiş iş yüklerinizi rezerve edin.
