GCP Billing ve Maliyet Yönetimi: Google Cloud Harcamalarını Kontrol Altına Alma
Bulut maliyetleri, fark etmeden kontrolden çıkabilen ve sysadmin’lerin uykusunu kaçıran konuların başında geliyor. GCP’de bir sabah uyandığınızda beklenmedik bir fatura görmek, hem teknik hem de iş ilişkileri açısından ciddi sorunlara yol açabilir. Bu yazıda GCP’nin billing ve maliyet yönetimi araçlarını, gerçek dünya senaryolarıyla birlikte ele alacağız. Sadece “bütçe ayarla ve geç” değil, derinlemesine bir maliyet mühendisliği yaklaşımı benimseyeceğiz.
GCP Billing Yapısını Anlamak
GCP’de faturalama hiyerarşisi şu şekilde işliyor:
- Organization: En üst seviye, tüm kaynakları kapsar
- Billing Account: Ödeme bilgilerinin bağlandığı hesap
- Projects: Kaynakların gruplandığı birimler
- Resources: Actual Cloud kaynakları (VM, storage, vb.)
Bir billing account birden fazla projeye bağlanabilir. Bu yapıyı anlamak, maliyet takibini doğru yapmak için kritik. Özellikle büyük organizasyonlarda farklı departmanlar için farklı billing account’lar oluşturmak yaygın bir pratiktir.
İlk yapılması gereken şeylerden biri, mevcut billing durumunuzu kontrol etmek:
# Billing account'larınızı listeleyin
gcloud billing accounts list
# Belirli bir projenin billing bilgisini görün
gcloud billing projects describe my-project-id
# Bir projeyi billing account'a bağlayın
gcloud billing projects link my-project-id
--billing-account=0X0X0X-0X0X0X-0X0X0X
Cloud Billing API ile Programatik Erişim
Manuel kontrol yeterli değil. Otomasyon şart. GCP’nin Billing API’si üzerinden Python veya bash scriptlerle maliyet verilerini çekebilirsiniz.
# Billing API'yi etkinleştirin
gcloud services enable cloudbilling.googleapis.com
gcloud services enable billingbudgets.googleapis.com
gcloud services enable recommender.googleapis.com
# Servis hesabına gerekli rolleri atayın
gcloud projects add-iam-policy-binding my-project-id
--member="serviceAccount:[email protected]"
--role="roles/billing.viewer"
Gerçek dünya senaryosu: Bir e-ticaret şirketinde çalışıyorsunuz ve Kara Cuma döneminde trafik artışı bekleniyorsunuz. Bu dönemde maliyetlerin nasıl şekilleneceğini önceden modellemek istiyorsunuz. Billing API bu tür analizler için biçilmiş kaftan.
Budget Alert Kurulumu
Budget alert’ler, GCP’nin en temel maliyet koruma mekanizması. Ancak çoğu ekip bunu yüzeysel kullanıyor. Detaylara girelim:
# gcloud ile budget oluşturun
gcloud billing budgets create
--billing-account=0X0X0X-0X0X0X-0X0X0X
--display-name="Production Monthly Budget"
--budget-amount=5000USD
--threshold-rule=percent=0.5,basis=CURRENT_SPEND
--threshold-rule=percent=0.75,basis=CURRENT_SPEND
--threshold-rule=percent=0.9,basis=CURRENT_SPEND
--threshold-rule=percent=1.0,basis=CURRENT_SPEND
--all-projects
Budget threshold’ları akıllıca seçmek önemli. %50’de uyarı almak, ayın ikinci yarısında kontrolü kaybetmenizi önler. %90’da uyarı almak ise artık çok geç olabilir.
CURRENT_SPEND vs FORECASTED_SPEND farkı:
- CURRENT_SPEND: O ana kadar harcanan gerçek miktar
- FORECASTED_SPEND: Mevcut kullanım hızına göre ay sonu tahmini
Forecasted spend’i kullanan threshold’lar, proaktif uyarı için çok daha değerli. Ayın 10’unda zaten %90’lık bir harcama tahmini görüyorsanız, hemen aksiyon almanız gerekiyor.
# Forecasted spend bazlı threshold
gcloud billing budgets create
--billing-account=0X0X0X-0X0X0X-0X0X0X
--display-name="Forecasted Budget Alert"
--budget-amount=5000USD
--threshold-rule=percent=0.8,basis=FORECASTED_SPEND
--filter-projects=my-prod-project
Pub/Sub ile Otomatik Maliyet Kontrolü
Budget alert’leri sadece email göndermek için kullanmak büyük bir fırsat kaybı. Pub/Sub entegrasyonuyla, belirli bir eşik aşıldığında otomatik aksiyonlar tetikleyebilirsiniz.
Örnek senaryo: Geliştirme ortamında maliyet $500’ı geçerse, tüm non-essential VM’leri otomatik olarak durdurun.
# Pub/Sub topic oluşturun
gcloud pubsub topics create billing-alerts
# Cloud Function için subscription
gcloud pubsub subscriptions create billing-alert-sub
--topic=billing-alerts
--ack-deadline=60
# Budget'ı Pub/Sub'a bağlayın
gcloud billing budgets update BUDGET_ID
--billing-account=0X0X0X-0X0X0X-0X0X0X
--pubsub-topic=projects/my-project-id/topics/billing-alerts
Bu Pub/Sub mesajını işleyecek Cloud Function:
# Cloud Function deploy etme
gcloud functions deploy billing-cost-controller
--runtime=python39
--trigger-topic=billing-alerts
--entry-point=handle_billing_alert
--region=europe-west1
--set-env-vars PROJECT_ID=my-project-id,THRESHOLD=0.8
--service-account=billing-monitor@my-project-id.iam.gserviceaccount.com
Cloud Function içeriği (main.py):
import base64
import json
import os
from googleapiclient import discovery
def handle_billing_alert(event, context):
pubsub_data = base64.b64decode(event['data']).decode('utf-8')
budget_data = json.loads(pubsub_data)
cost_amount = budget_data.get('costAmount', 0)
budget_amount = budget_data.get('budgetAmount', 0)
if budget_amount > 0:
spend_ratio = cost_amount / budget_amount
if spend_ratio >= 0.8:
project_id = os.environ.get('PROJECT_ID')
stop_dev_instances(project_id)
def stop_dev_instances(project_id):
compute = discovery.build('compute', 'v1')
# "env:dev" label'ına sahip instance'ları bul ve durdur
request = compute.instances().aggregatedList(
project=project_id,
filter='labels.env=dev AND status=RUNNING'
)
# Instance'ları durdurma mantığı burada devam eder
BigQuery ile Detaylı Maliyet Analizi
GCP, billing verilerini BigQuery’e export etmenizi sağlıyor. Bu, belki de en güçlü maliyet analiz aracı. Bir kez kurulumu yaptıktan sonra, SQL ile istediğiniz her türlü analizi yapabilirsiniz.
Billing Export’u aktive etmek için Console üzerinden Billing > Billing Export yolunu izleyin veya:
# BigQuery dataset oluşturun
bq mk
--dataset
--location=EU
--description="GCP Billing Data"
my-project-id:billing_data
# Export için gerekli IAM izinleri
gcloud projects add-iam-policy-binding my-project-id
--member="serviceAccount:[email protected]"
--role="roles/bigquery.dataEditor"
BigQuery’e export edildikten sonra çalıştırabileceğiniz örnek sorgular:
# Servis bazlı aylık maliyet analizi
bq query --use_legacy_sql=false '
SELECT
service.description as servis,
SUM(cost) as toplam_maliyet,
SUM(cost) / SUM(SUM(cost)) OVER() * 100 as yuzde
FROM `my-project-id.billing_data.gcp_billing_export_v1_*`
WHERE
_PARTITIONTIME >= TIMESTAMP_TRUNC(CURRENT_TIMESTAMP(), MONTH)
GROUP BY 1
ORDER BY 2 DESC
LIMIT 20'
Bu sorgu size hangi GCP servisinin ne kadar para yaktığını net olarak gösterir. Çoğu zaman sürpriz sonuçlarla karşılaşırsınız; kimsenin bilmediği bir test VM’i veya unutulmuş bir Cloud SQL instance’ı gibi.
Committed Use Discounts ve Sustained Use Discounts
GCP’nin iki önemli indirim mekanizması var ve bunları doğru kullanmak ciddi tasarruf sağlıyor.
Sustained Use Discounts (SUD): Otomatik uygulanır. Bir VM’i ay boyunca çalıştırdığınızda, GCP otomatik olarak indirim uygular. Herhangi bir aksiyon almanıza gerek yok.
Committed Use Discounts (CUD): Bir yıl veya üç yıl boyunca belirli bir kaynak miktarını kullanmayı taahhüt edersiniz. Karşılığında %57’ye kadar indirim alırsınız.
# Mevcut commitment'larınızı görüntüleyin
gcloud compute commitments list --global
# Yeni bir commitment oluşturun (1 yıllık, 4 vCPU, 16GB RAM)
gcloud compute commitments create prod-commitment
--plan=12-month
--region=europe-west1
--resources=vcpu=4,memory=16GB
# Recommender API ile CUD önerilerini alın
gcloud recommender recommendations list
--project=my-project-id
--location=global
--recommender=google.compute.commitment.UsageCommitmentRecommender
Gerçek dünya senaryosu: 3 yıldır çalışan bir production ortamınız var ve her ay tutarlı bir compute harcamanız oluyor. Committed Use almamak, her ay fazladan para ödemek anlamına geliyor. Recommender API’nin önerilerine bakın, genellikle çok mantıklı bir ROI hesabı sunuyor.
Resource Labels ile Maliyet Takibi
Büyük organizasyonlarda “bu maliyet hangi takıma ait?” sorusu sürekli gündemde. Label’lar bu soruya cevap veriyor.
# VM'e label ekleyin
gcloud compute instances add-labels my-vm
--labels=team=backend,env=production,cost-center=cc-1234
--zone=europe-west1-b
# GKE node pool'una label ekleyin
gcloud container node-pools update default-pool
--cluster=my-cluster
--region=europe-west1
--node-labels=team=platform,env=prod
# Cloud Storage bucket'a label ekleyin
gsutil label ch
-l team:data-engineering
-l env:production
-l cost-center:cc-5678
gs://my-data-bucket
Label stratejisi olmadan büyük bir GCP ortamını yönetmek, karanlıkta yürümek gibi. Şu labelleri standart olarak kullanmanızı öneririm:
- team: Kaynak sahibi takım
- env: Ortam (production, staging, development)
- cost-center: Muhasebe kodu
- project-code: İş projesi kodu
- managed-by: Terraform, helm gibi yönetim aracı
Bu label’lar BigQuery’deki billing verisine yansıdığında, her takımın ne kadar harcadığını dakikalar içinde çıkarabilirsiniz.
Idle Kaynakları Tespit Etme ve Temizleme
En kolay maliyet düşürme yöntemi: kullanılmayan kaynakları silmek. Kulağa basit geliyor ama büyük ortamlarda bu kaynakları bulmak zorlayıcı.
# 30 günden fazladır durdurulan VM'leri listele
gcloud compute instances list
--filter="status=TERMINATED"
--format="table(name,zone,status,lastStartTimestamp)"
# Hiçbir VM'e bağlı olmayan persistent disk'leri bul
gcloud compute disks list
--filter="NOT users:*"
--format="table(name,zone,sizeGb,type)"
# Kullanılmayan static IP'leri listele
gcloud compute addresses list
--filter="status=RESERVED"
--format="table(name,region,address,status)"
# Kullanılmayan Load Balancer'ları kontrol et
gcloud compute forwarding-rules list
--format="table(name,region,IPAddress,target)"
Bu komutları bir cron job’a bağlayıp, haftalık rapor olarak ekibinize gönderebilirsiniz. Deneyimlerime göre, büyük organizasyonlarda bu idle kaynaklar toplam maliyetin %15-25’ini oluşturabiliyor.
# Haftalık idle kaynak raporu script'i
#!/bin/bash
PROJECT_ID="my-project-id"
REPORT_DATE=$(date +%Y-%m-%d)
echo "=== GCP Idle Kaynak Raporu - $REPORT_DATE ===" > /tmp/idle-report.txt
echo -e "n--- Durdurulan VM'ler ---" >> /tmp/idle-report.txt
gcloud compute instances list
--project=$PROJECT_ID
--filter="status=TERMINATED"
--format="table(name,zone,status)" >> /tmp/idle-report.txt
echo -e "n--- Sahipsiz Diskler ---" >> /tmp/idle-report.txt
gcloud compute disks list
--project=$PROJECT_ID
--filter="NOT users:*"
--format="table(name,zone,sizeGb)" >> /tmp/idle-report.txt
echo -e "n--- Reserved Static IP'ler ---" >> /tmp/idle-report.txt
gcloud compute addresses list
--project=$PROJECT_ID
--filter="status=RESERVED"
--format="table(name,region,address)" >> /tmp/idle-report.txt
# Slack webhook'una gönderin
curl -X POST -H 'Content-type: application/json'
--data "{"text":"$(cat /tmp/idle-report.txt)"}"
$SLACK_WEBHOOK_URL
Cloud Monitoring ile Maliyet Anomali Tespiti
Normal bir günde $100 harcayan bir proje, bir anda $800 harcamaya başladığında ne kadar hızlı fark edersiniz? Cloud Monitoring metrikleri ve alerting bu noktada devreye giriyor.
# Custom metric oluşturmak için monitoring API'yi etkinleştirin
gcloud services enable monitoring.googleapis.com
# Alert policy oluşturun (YAML formatında)
cat > billing-anomaly-alert.yaml << 'EOF'
displayName: "Billing Anomaly Alert"
conditions:
- displayName: "Daily cost spike"
conditionThreshold:
filter: 'metric.type="billing.googleapis.com/billing/cost"'
aggregations:
- alignmentPeriod: 86400s
crossSeriesReducer: REDUCE_SUM
perSeriesAligner: ALIGN_SUM
comparison: COMPARISON_GT
thresholdValue: 150
duration: 0s
notificationChannels:
- projects/my-project-id/notificationChannels/CHANNEL_ID
EOF
gcloud monitoring policies create
--policy-from-file=billing-anomaly-alert.yaml
GCP Cost Optimization İçin Checklist
Düzenli olarak yapmanız gereken kontroller:
- Rightsize tavsiyeleri:
gcloud recommender recommendations list --recommender=google.compute.instance.MachineTypeRecommenderkomutuyla VM boyutlarını optimize edin - Preemptible/Spot VM kullanımı: Batch işler ve CI/CD pipeline’ları için Spot VM maliyeti %60-90 düşürür
- Storage sınıfları: Nadiren erişilen veriler için Coldline veya Archive storage kullanın
- Network çıkış trafiği: Cross-region trafik maliyetlidir, mimarinizi buna göre tasarlayın
- Cloud SQL tier’ları: Development ortamlarında shared core instance’lar kullanın
- Artifact Registry temizliği: Eski container image’ları storage maliyeti yaratır
- Unutulan Cloud Run revisions: Aktif olmayan revision’lar kaynak tüketmez ama log storage’ı tüketir
# Makine tipi optimize edilebilecek VM'leri listele
gcloud recommender recommendations list
--project=my-project-id
--location=europe-west1-b
--recommender=google.compute.instance.MachineTypeRecommender
--format="table(name,description,primaryImpact.costProjection.cost.units)"
# Idle VM önerilerini al
gcloud recommender recommendations list
--project=my-project-id
--location=europe-west1-b
--recommender=google.compute.instance.IdleResourceRecommender
FinOps Kültürü Oluşturmak
Teknik araçlar önemli, ama kültürel değişim olmadan maliyet optimizasyonu kalıcı olmaz. Sysadmin olarak şunları yapabilirsiniz:
- Her sprint’e maliyet metriklerini dahil edin; özellik geliştirme kadar maliyet verimliliğini de takip edin
- Takımlara kendi kaynaklarının maliyetini şeffaf şekilde gösterin; BigQuery raporlarını haftalık paylaşın
- “Bütçeti aşan takım açıklama yapar” gibi basit ama etkili accountability mekanizmaları kurun
- Geliştirme ortamları için otomatik kapatma (scheduled shutdown) politikaları uygulayın; saat 20:00’den sonra dev VM’ler otomatik kapansın
- Terraform veya Pulumi gibi IaC araçlarında maliyet tahmini adımları ekleyin
# Scheduled instance kapatma (Cloud Scheduler ile)
gcloud scheduler jobs create http shutdown-dev-vms
--schedule="0 20 * * 1-5"
--uri="https://compute.googleapis.com/compute/v1/projects/my-project-id/zones/europe-west1-b/instances/dev-vm/stop"
--oauth-service-account-email=scheduler@my-project-id.iam.gserviceaccount.com
--time-zone="Europe/Istanbul"
# Sabah otomatik başlatma
gcloud scheduler jobs create http start-dev-vms
--schedule="0 8 * * 1-5"
--uri="https://compute.googleapis.com/compute/v1/projects/my-project-id/zones/europe-west1-b/instances/dev-vm/start"
--oauth-service-account-email=scheduler@my-project-id.iam.gserviceaccount.com
--time-zone="Europe/Istanbul"
Sonuç
GCP maliyet yönetimi, bir kez yapıp unutulan bir iş değil. Sürekli dikkat, otomasyon ve doğru araçların kombinasyonu gerektiriyor. Bu yazıda ele aldığımız konuları özetlersek:
Budget alert’leri kurun ama sadece email bildirimiyle sınırlı kalmayın; Pub/Sub entegrasyonuyla otomatik aksiyonlar tetikleyin. BigQuery billing export’u bir kez etkinleştirin ve SQL sorguları ile derinlemesine analiz yapın. Label stratejinizi baştan oturun; sonradan eklemeye çalışmak çok daha zahmetli. Idle kaynakları bulmak için düzenli tarama script’leri yazın ve bu raporları takımla paylaşın. Committed Use Discounts’ı değerlendirin; tutarlı bir workload’unuz varsa bu para yakıyorsunuz demektir.
Maliyet optimizasyonu bir kültür meselesi. Teknik altyapıyı kurabilirsiniz, ama ekibin maliyet farkındalığı olmadan bu araçlar yeterli olmaz. Sysadmin olarak hem teknik hem de kültürel değişime liderlik etmek sizin elinizde.
