AWS EC2 Reserved Instance Yönetimi: Maliyet Optimizasyonu Rehberi
AWS’de bulut maliyetlerini kontrol altına almak isteyen her sistem yöneticisinin eninde sonunda karşılaştığı bir nokta var: Reserved Instance yönetimi. On-Demand fiyatlandırmasıyla çalışan bir EC2 filosu, büyüdükçe fatura kalemlerinin en büyüğü haline geliyor. Reserved Instance’lar (RI) doğru kullanıldığında bu maliyeti yüzde altmışa kadar düşürebiliyor, ama yanlış yönetildiğinde kullanılmayan rezervasyonlar için para ödemek zorunda kalıyorsunuz. Bu yazıda RI satın alma stratejilerinden mevcut rezervasyonları izlemeye, atıl kalan RI’ları optimize etmekten Savings Plans ile karşılaştırmaya kadar her şeyi ele alacağız.
Reserved Instance Nedir ve Neden Önemlidir
Reserved Instance, temel olarak AWS’ye “şu kadar süre boyunca bu tip instance’ı kullanacağım” dediğiniz bir taahhüttür. Karşılığında AWS size ciddi bir indirim sunuyor. Ödeme modelinize göre bu indirim farklılaşıyor:
- All Upfront (Tamamı Peşin): En yüksek indirim oranı, tek seferlik ödeme
- Partial Upfront (Kısmen Peşin): Orta düzey indirim, başlangıçta bir kısım ödeme
- No Upfront (Peşinsiz): En düşük indirim ama nakit akışı korunur
Taahhüt süresi olarak 1 yıl veya 3 yıl seçenekleriniz var. 3 yıllık taahhüt daha fazla indirim sağlıyor ama teknik borcun çok hızlı değiştiği ortamlarda bu kadar uzun taahhüt vermek riskli olabilir.
RI’lar instance ailesi ve boyutuna göre de iki türe ayrılıyor:
- Standard RI: En yüksek indirim, ama instance ailesi ve türü değiştirilemez
- Convertible RI: Biraz daha az indirim, ama instance ailesini, işletim sistemini ve kiracılık modelini değiştirebilirsiniz
Büyük bir e-ticaret platformunda çalıştığımı düşündüğümde, temel uygulama sunucularımız için Standard RI, veri işleme katmanı için ise Convertible RI mantıklı bir kombinasyon olarak öne çıkıyor. Çünkü uygulama sunucuları sabit bir boyutta çalışırken, veri işleme ihtiyaçları dönemsel olarak değişiyor.
Mevcut RI Durumunuzu İnceleme
İlk adım her zaman mevcut durumu anlamaktan geçiyor. AWS CLI ile mevcut rezervasyonlarınızı listeleyebilirsiniz:
# Mevcut tüm Reserved Instance'ları listele
aws ec2 describe-reserved-instances
--query 'ReservedInstances[?State==`active`].[ReservedInstancesId,InstanceType,AvailabilityZone,InstanceCount,End,OfferingType]'
--output table
Bu komut size aktif olan tüm rezervasyonları gösterecek. Ancak sadece listelemek yetmez, hangi rezervasyonların yakında sona ereceğini de takip etmeniz gerekiyor:
# 90 gün içinde sona erecek RI'ları bul
aws ec2 describe-reserved-instances
--filters "Name=state,Values=active"
--query 'ReservedInstances[?to_number(End) < `'$(date -d "+90 days" +%s%3N)'`].[ReservedInstancesId,InstanceType,End,InstanceCount]'
--output json
Gerçek hayatta bu sorguları elle çalıştırmak yerine bir script haline getirmek ve düzenli aralıklarla çalıştırarak e-posta bildirimi göndermek çok daha pratik. Bunun için basit bir bash scripti yazabilirsiniz:
#!/bin/bash
# ri-expiry-check.sh - Reserved Instance sona erme kontrolü
DAYS_THRESHOLD=90
ALERT_EMAIL="[email protected]"
EXPIRY_DATE=$(date -d "+${DAYS_THRESHOLD} days" --iso-8601)
echo "=== Reserved Instance Sona Erme Raporu ==="
echo "Kontrol tarihi: $(date)"
echo "Eşik: ${DAYS_THRESHOLD} gün"
echo ""
# Yakında sona erecek RI'ları JSON olarak çek
EXPIRING_RIS=$(aws ec2 describe-reserved-instances
--filters "Name=state,Values=active"
--output json | python3 -c "
import json
import sys
from datetime import datetime, timezone
data = json.load(sys.stdin)
threshold_days = ${DAYS_THRESHOLD}
now = datetime.now(timezone.utc)
for ri in data['ReservedInstances']:
end_date = datetime.fromisoformat(ri['End'].replace('Z', '+00:00'))
days_left = (end_date - now).days
if days_left <= threshold_days:
print(f"{ri['ReservedInstancesId']} | {ri['InstanceType']} | {ri['InstanceCount']} adet | {days_left} gün kaldı")
")
if [ -n "$EXPIRING_RIS" ]; then
echo "UYARI: Aşağıdaki RI'lar ${DAYS_THRESHOLD} gün içinde sona eriyor:"
echo "$EXPIRING_RIS"
echo "$EXPIRING_RIS" | mail -s "RI Sona Erme Uyarısı" "$ALERT_EMAIL"
else
echo "Tüm RI'lar iyi durumda, yakında sona erecek rezervasyon yok."
fi
RI Kullanım Oranını Analiz Etme
Sahip olduğunuz RI’ların ne kadarının gerçekten kullanıldığını bilmek, optimize etmenin temelidir. AWS Cost Explorer bu konuda çok değerli veriler sunuyor:
# Cost Explorer ile RI kullanım oranını sorgula
aws ce get-reservation-utilization
--time-period Start=2024-01-01,End=2024-01-31
--granularity MONTHLY
--filter '{
"Dimensions": {
"Key": "SERVICE",
"Values": ["Amazon EC2"]
}
}'
--query 'UtilizationsByTime[*].{Dönem:TimePeriod.Start,Kullanım:Total.UtilizationPercentage,BirikmişMaliyet:Total.AmortizedRecurringFee}'
--output table
Kullanım oranı yüzde yetmişin altına düştüğünde dikkat etmeniz gerekiyor. Bu, rezervasyon için ödeme yapıp instance çalıştırmadığınız anlamına gelir. Bu durumla karşılaştığınızda yapabileceğiniz şeyler:
- Convertible RI değişimi: Kullanılmayan RI’ı daha çok ihtiyaç duyduğunuz bir instance tipine dönüştürme
- RI Marketplace satışı: Standard RI’ları AWS Marketplace üzerinden başkalarına satma
- Instance Fleet yeniden yapılandırma: Mevcut workload’ı RI’la örtüşecek şekilde ayarlama
Reserved Instance Satın Alma Stratejisi
Yeni RI satın almadan önce doğru boyutlandırma analizini yapmak şart. Bunun için önce son birkaç aylık kullanım verilerinizi incelemeniz gerekiyor:
# Son 3 aydaki EC2 kullanım metriklerini çek
aws ce get-cost_and_usage
--time-period Start=2023-10-01,End=2024-01-01
--granularity MONTHLY
--metrics "UsageQuantity" "BlendedCost"
--group-by Type=DIMENSION,Key=INSTANCE_TYPE
--filter '{
"Dimensions": {
"Key": "SERVICE",
"Values": ["Amazon EC2"]
}
}'
--output json > ec2_usage_analysis.json
# Analiz sonuçlarını işle
cat ec2_usage_analysis.json | python3 -c "
import json
import sys
data = json.load(sys.stdin)
instance_costs = {}
for period in data['ResultsByTime']:
for group in period['Groups']:
instance_type = group['Keys'][0]
cost = float(group['Metrics']['BlendedCost']['Amount'])
if instance_type not in instance_costs:
instance_costs[instance_type] = 0
instance_costs[instance_type] += cost
sorted_instances = sorted(instance_costs.items(), key=lambda x: x[1], reverse=True)
print('Instance Tipi | 3 Aylık Toplam Maliyet')
print('-' * 45)
for instance_type, cost in sorted_instances[:10]:
print(f'{instance_type:<25} | ${cost:>10.2f}')
"
Bu analiz hangi instance tipleri için en çok para harcadığınızı gösterir. En yüksek maliyetli ve sürekli çalışan instance’lar RI satın almak için birincil adaylar.
Satın Alma Kararında Dikkat Edilecekler
Birkaç yıl önce bir fintech şirketinin altyapısını yönetirken yaptığım bir hatadan bahsedeyim. Ani bir büyüme döneminde aceleyle çok sayıda m5.2xlarge Standard RI satın aldık. Üç ay sonra uygulama mimarisinde değişiklik yapınca m5.2xlarge yerine m6i.xlarge kullanmak çok daha verimli hale geldi. Standard RI’larla sıkışıp kaldık çünkü dönüştürme yapılamıyordu. Marketplace’te satmayı denedik ama beklediğimiz fiyatı bulamadık.
Bu deneyimden çıkardığım ders: Yeni bir instance tipi veya mimari değişikliği söz konusuysa mutlaka Convertible RI tercih edin. İndirim farkı genellikle 8-12 puan arasında ama bu esneklik bedelini ödemeye değer.
# RI satın alma öncesi fiyat karşılaştırması
aws ec2 describe-reserved-instances-offerings
--instance-type m6i.xlarge
--product-description "Linux/UNIX"
--offering-class convertible
--offering-type "All Upfront"
--min-duration 31536000
--query 'ReservedInstancesOfferings[*].{ID:ReservedInstancesOfferingId,AZ:AvailabilityZone,Süre:Duration,Fiyat:FixedPrice,Kullanım:RecurringCharges}'
--output json
Convertible RI Dönüşümü Yapma
Elinizde kullanmadığınız Convertible RI varsa bunları ihtiyaç duyduğunuz tipe dönüştürebilirsiniz. Dönüştürme kuralı basit: Yeni RI’ın değeri en az eski RI’ın değeri kadar olmalı.
# Dönüştürülecek RI'ı bul
CONVERTIBLE_RI_ID="ri-0abc123def456789a"
# Dönüşüm için hedef offering'i bul
TARGET_OFFERING=$(aws ec2 describe-reserved-instances-offerings
--instance-type c6i.2xlarge
--product-description "Linux/UNIX"
--offering-class convertible
--offering-type "No Upfront"
--query 'ReservedInstancesOfferings[0].ReservedInstancesOfferingId'
--output text)
echo "Hedef Offering ID: $TARGET_OFFERING"
# Dönüşüm talebini başlat
aws ec2 accept-reserved-instances-exchange-quote
--reserved-instance-ids "$CONVERTIBLE_RI_ID"
--target-configurations "OfferingId=${TARGET_OFFERING},InstanceCount=1"
Dönüşüm işlemi genellikle birkaç dakika içinde tamamlanıyor. Sonucu kontrol etmek için:
# Dönüşüm durumunu kontrol et
aws ec2 describe-reserved-instances-modifications
--query 'ReservedInstancesModifications[?Status!=`fulfilled`].[ReservedInstancesModificationId,Status,ModificationResults]'
--output table
AWS Savings Plans ile Karşılaştırma
RI’ların yanı sıra AWS, Savings Plans adında daha esnek bir taahhüt modeli sunuyor. Sysadmin olarak hangi durumda hangisini kullanacağınızı bilmek önemli.
Compute Savings Plans: Saatlik belirli bir dolar tutarında harcama taahhüt ediyorsunuz, karşılığında instance ailesi veya bölge fark etmeksizin indirim alıyorsunuz.
EC2 Instance Savings Plans: Belirli bir instance ailesi ve bölgeye bağlanıyorsunuz ama boyut ve işletim sistemi serbestçe değişebiliyor.
Savings Plans için mevcut tavsiyelerinizi görüntülemek:
# AWS Cost Explorer'dan Savings Plans tavsiyeleri
aws ce get-savings-plans-purchase-recommendation
--savings-plans-type COMPUTE_SP
--term-in-years ONE_YEAR
--payment-option NO_UPFRONT
--lookback-period-in-days SIXTY_DAYS
--query 'SavingsPlansPurchaseRecommendation.{ToplamTasarruf:SavingsPlansPurchaseRecommendationSummary.EstimatedSavingsAmount,YillikMaliyet:SavingsPlansPurchaseRecommendationSummary.EstimatedOnDemandCostWithCurrentCommitment}'
--output json
Genel bir kural olarak şunu söyleyebilirim: Çok sayıda farklı instance tipi kullanan, Lambda veya Fargate da çalıştıran bir ortamda Compute Savings Plans daha mantıklı. Belirli instance aileleriyle sabit bir altyapı çalıştırıyorsanız Standard RI hala en yüksek indirimi sunuyor.
RI Raporlama ve Maliyet Optimizasyon Dashboard’u
Tüm bu bilgileri bir araya getiren bir monitoring scripti hazırlamak, aylık inceleme sürecini çok kolaylaştırıyor. Aşağıdaki script kapsamlı bir RI raporu üretiyor:
#!/bin/bash
# ri-full-report.sh - Kapsamlı RI analiz raporu
REPORT_FILE="/tmp/ri_report_$(date +%Y%m).txt"
REGION=$(aws configure get region)
cat > "$REPORT_FILE" << EOF
========================================
EC2 Reserved Instance Raporu
Tarih: $(date)
Bölge: $REGION
========================================
EOF
echo "1. AKTİF RESERVED INSTANCE'LAR" >> "$REPORT_FILE"
echo "--------------------------------" >> "$REPORT_FILE"
aws ec2 describe-reserved-instances
--filters "Name=state,Values=active"
--query 'ReservedInstances[*].[InstanceType,InstanceCount,OfferingType,OfferingClass,End]'
--output table >> "$REPORT_FILE"
echo "" >> "$REPORT_FILE"
echo "2. KULLANIMSIZ (RETIRED) RESERVED INSTANCE'LAR" >> "$REPORT_FILE"
echo "------------------------------------------------" >> "$REPORT_FILE"
aws ec2 describe-reserved-instances
--filters "Name=state,Values=retired"
--query 'ReservedInstances[?to_number(End) > `'$(date -d "-30 days" +%s%3N)'`].[ReservedInstancesId,InstanceType,End]'
--output table >> "$REPORT_FILE" 2>/dev/null || echo "Son 30 günde sona eren RI bulunamadı" >> "$REPORT_FILE"
echo "" >> "$REPORT_FILE"
echo "3. RI KULLANIM ÖZETI (Son 30 Gün)" >> "$REPORT_FILE"
echo "----------------------------------" >> "$REPORT_FILE"
aws ce get-reservation-utilization
--time-period Start=$(date -d "-30 days" +%Y-%m-%d),End=$(date +%Y-%m-%d)
--granularity MONTHLY
--query 'UtilizationsByTime[*].Total.{KullanımYüzdesi:UtilizationPercentage,TasarrufEdilen:NetRISavings}'
--output table >> "$REPORT_FILE"
echo ""
echo "Rapor oluşturuldu: $REPORT_FILE"
cat "$REPORT_FILE"
Gerçek Dünya Senaryosu: Büyük Ölçekli Optimizasyon
Bir SaaS şirketinde yüzü aşkın EC2 instance’ı yönettiğinizi düşünelim. Aylık AWS faturası 80.000 doları geçmiş ve maliyet optimizasyonu öncelik haline gelmiş durumda. Bu senaryoda adım adım nasıl ilerleyeceğinizi anlatalım.
Birinci adım: 3 aylık kullanım verilerini analiz edin. 7 gün 24 saat çalışan, yani uptime’ı yüzde doksanın üzerinde olan instance’ları tespit edin. Bunlar RI için birincil adaylar.
İkinci adım: Bu instance’ların hangi ailelerde yoğunlaştığını görün. Örneğin 30 adet m6i.xlarge ve 20 adet c6i.2xlarge sürekli çalışıyorsa, bunlar için hemen RI satın alabilirsiniz.
Üçüncü adım: Geliştirme ve test ortamları için RI yerine Scheduled Scaling ile On-Demand kullanmayı değerlendirin. Bu ortamlar mesai saatlerinde çalışıyor, geceleri kapatılıyorsa RI boşa gidecek.
Dördüncü adım: Satın alımı tek seferde değil kademeli yapın. Önce yüzde ellisini alın, bir ay izleyin, kullanım oranı yüksekse geri kalanını da satın alın.
Bu yaklaşımı uygulayan bir şirkette aylık EC2 maliyetini yaklaşık 35.000 dolar düşürdüğümüzü gördüm. Yıllık tasarruf 420.000 dolara yakın. Doğru stratejiyle RI yönetimi gerçekten bu kadar güçlü bir araç.
RI Satın Almada Sık Yapılan Hatalar
Yıllar içinde gözlemlediğim en yaygın hataları şöyle sıralayabilirim:
- Geliştirme ortamları için RI satın almak: Dev ortamları genellikle akşam ve hafta sonu kapatılır, RI burada para kaybettirir
- Büyük instance seçimi: m6i.4xlarge yerine dört adet m6i.xlarge RI almak çok daha esnek, çünkü instance boyutu esnekliği küçük instance’tan büyüğe doğru çalışıyor
- Tek bir AZ’ye bağlanmak: Mümkün olduğunda Regional RI tercih edin, bu tüm AZ’lere uygulanır
- Yeni servisler için uzun taahhüt: Henüz kararlı olmayan bir servise 3 yıllık RI almak ciddi risk
- Marketplace fiyatlarını kontrol etmemek: Bazen ikinci el RI marketplace’ten daha ucuza bulunabiliyor
Otomatik RI Önerilerini Takip Etme
AWS Trusted Advisor ve Cost Explorer sürekli olarak RI satın alma önerileri üretiyor. Bu önerileri programatik olarak çekmek mümkün:
# Cost Explorer'dan RI satın alma önerileri
aws ce get-reservation-purchase-recommendation
--service "Amazon EC2"
--lookback-period-in-days SIXTY_DAYS
--term-in-years ONE_YEAR
--payment-option PARTIAL_UPFRONT
--query 'Recommendations[*].{InstanceDetails:RecommendationDetails[0].InstanceDetails.EC2InstanceDetails,AylıkTasarruf:RecommendationDetails[0].EstimatedMonthlySavingsAmount,GeriBöden:RecommendationDetails[0].EstimatedBreakEvenInMonths}'
--output json | python3 -m json.tool
Bu çıktıyı düzenli olarak incelemek, kaçırdığınız optimizasyon fırsatlarını yakalamanıza yardımcı olur. Haftada bir çalışan ve sonuçları Slack’e gönderen bir cronjob eklemek sistemi proaktif bir şekilde yönetmenizi sağlar.
Sonuç
EC2 Reserved Instance yönetimi tek seferlik bir görev değil, sürekli dikkat gerektiren bir süreç. Temel adımları özetlemek gerekirse: önce mevcut durumu anla, kullanım verilerini analiz et, doğru instance tiplerini ve taahhüt sürelerini seç, satın alımları kademeli yap ve düzenli olarak izle.
Pratik bir başlangıç noktası olarak şunu öneririm: Bu hafta yukarıdaki ri-full-report.sh scriptini çalıştırın ve mevcut RI’larınızın kullanım oranına bakın. Eğer yüzde yetmişin altında kullanım görüyorsanız, bu dönüştürme ya da yeniden yapılandırma zamanı. Hiç RI’nız yoksa Cost Explorer’ın önerilerini inceleyin ve en yüksek On-Demand harcamanızın olduğu 3 instance tipini belirleyin. Bu üç tip için 1 yıllık Partial Upfront RI satın alarak başlayın. Büyük ihtimalle 6 ay içinde bu yatırımın karşılığını göreceksiniz.
Bulut maliyetleri kontrol edilmediğinde hızla büyüyen bir sorun haline gelir. Ama doğru araçlar ve disiplinli bir yönetim yaklaşımıyla bu maliyetleri önemli ölçüde azaltmak mümkün. RI yönetimi işte tam da bu noktada kritik bir beceri olarak öne çıkıyor.
