Azure Blob Storage Oluşturma ve Yönetimi
Bulut altyapısı yönetiyorsanız, er ya da geç Azure Blob Storage ile haşır neşir olmanız kaçınılmaz. Yedekleme dosyaları, uygulama logları, statik web içerikleri, medya dosyaları… Bunların hepsini güvenilir, ölçeklenebilir ve uygun maliyetli bir şekilde depolamak için Blob Storage tam anlamıyla biçilmiş kaftan. Ben de bu yazıda sıfırdan bir Blob Storage kurulumu yapıp, günlük operasyonlarda işinize yarayacak pratik yönetim tekniklerini ele alacağım.
Azure Blob Storage Nedir ve Ne Zaman Kullanılır?
Azure Blob Storage, Microsoft’un nesne depolama çözümüdür. “Blob” kelimesi Binary Large Object anlamına gelir ve yapılandırılmamış her türlü veriyi depolamak için tasarlanmıştır. Geleneksel dosya sistemlerinin aksine, burada hiyerarşik bir klasör yapısı yoktur. Bunun yerine düz bir ad alanı vardır ve klasör görünümü aslında nesne adlarındaki “/” karakteriyle simüle edilir.
Gerçek dünyada şu senaryolarda yoğun olarak kullanılır:
- Yedekleme ve arşivleme: Veritabanı dump’ları, VM snapshot’ları, log arşivleri
- Statik web sitesi barındırma: HTML, CSS, JS dosyaları doğrudan Blob Storage üzerinden servis edilebilir
- CDN kaynağı: Azure CDN ile entegre çalışarak medya dağıtımı
- Big Data ve analitik: Azure Data Lake, HDInsight ve Databricks ile doğrudan entegrasyon
- Uygulama verisi: Kullanıcı yüklemeleri, raporlar, dışa aktarma dosyaları
Temel Kavramlar
Kuruluma geçmeden önce birkaç kavramı netleştirmek gerekiyor:
Storage Account: Her şeyin başladığı yer. Blob Storage, Table Storage, Queue Storage ve File Storage bu çatı altında toplanır. Benzersiz bir isme sahip olmalıdır.
Container: S3’teki bucket’a karşılık gelir. Blob’ların gruplandırıldığı mantıksal birimdir.
Blob Türleri:
- Block Blob: En yaygın kullanılan tür. Metin ve ikili dosyalar için idealdir. Maksimum 190.7 TB.
- Append Blob: Sadece sonuna ekleme yapılabilen, log dosyaları için mükemmel.
- Page Blob: Azure VM disk dosyaları (VHD) için kullanılır. Rastgele okuma/yazma.
Erişim Katmanları:
- Hot: Sık erişilen veriler. Depolama maliyeti yüksek, erişim maliyeti düşük.
- Cool: Ayda bir veya daha az erişilen veriler. 30 gün minimum saklama.
- Cold: 90 gün minimum saklama, daha ucuz.
- Archive: Nadiren erişilen veriler. Saatler içinde erişilebilir hale gelir, en ucuz seçenek.
Storage Account Oluşturma
Azure CLI ile Oluşturma
Azure CLI, otomasyon ve scriptleme için en verimli yoldur. Önce Azure’a giriş yapın:
# Azure hesabına giriş
az login
# Mevcut subscription'ları listele
az account list --output table
# Çalışacağınız subscription'ı seçin
az account set --subscription "subscription-id-buraya"
Resource group oluşturup storage account kuralım:
# Resource group oluştur
az group create
--name rg-storage-prod
--location westeurope
# Storage account oluştur
az storage account create
--name mystorageaccount2024
--resource-group rg-storage-prod
--location westeurope
--sku Standard_LRS
--kind StorageV2
--access-tier Hot
--min-tls-version TLS1_2
--allow-blob-public-access false
--https-only true
Burada kullandığımız parametrelere bakalım:
–sku: Replikasyon türünü belirler
- Standard_LRS: Yerel tekrarlı depolama, tek bölgede 3 kopya
- Standard_GRS: Coğrafi olarak yedeklenmiş, farklı bölgede ikinci kopya
- Standard_ZRS: Bölge içinde farklı availability zone’larda kopyalar
- Standard_RAGRS: GRS + okuma erişimi ikinci kopyaya
–kind: StorageV2 her zaman tercih edin, tüm modern özellikleri destekler.
–allow-blob-public-access false: Güvenlik açısından kritik. Varsayılan olarak kapatın, gerektiğinde açın.
Container Oluşturma ve Yapılandırma
# Storage account connection string'ini al
CONN_STR=$(az storage account show-connection-string
--name mystorageaccount2024
--resource-group rg-storage-prod
--output tsv)
# Container oluştur (private erişim)
az storage container create
--name backups
--connection-string $CONN_STR
--public-access off
# Birden fazla container oluşturma
for container in backups logs media exports; do
az storage container create
--name $container
--connection-string $CONN_STR
--public-access off
echo "Container oluşturuldu: $container"
done
Blob Yükleme ve İndirme İşlemleri
Tekil Dosya İşlemleri
# Tek dosya yükleme
az storage blob upload
--container-name backups
--name "2024/01/db-backup.sql.gz"
--file /tmp/db-backup.sql.gz
--connection-string $CONN_STR
--tier Cool
# Dizin yükleme (tüm alt dizinlerle birlikte)
az storage blob upload-batch
--destination backups
--source /var/log/myapp
--pattern "*.log"
--connection-string $CONN_STR
# Blob indirme
az storage blob download
--container-name backups
--name "2024/01/db-backup.sql.gz"
--file /tmp/restore/db-backup.sql.gz
--connection-string $CONN_STR
# Container içindeki blob'ları listeleme
az storage blob list
--container-name backups
--connection-string $CONN_STR
--output table
--prefix "2024/"
Büyük Dosya Transferleri için AzCopy
Büyük dosyalar veya toplu transferler için AzCopy, Azure CLI’dan çok daha hızlıdır. Çoklu iş parçacığı ve kontrol noktası desteğiyle öne çıkar:
# AzCopy indir (Linux)
wget https://aka.ms/downloadazcopy-v10-linux -O azcopy.tar.gz
tar -xvf azcopy.tar.gz
sudo mv azcopy_linux_amd64_*/azcopy /usr/local/bin/
chmod +x /usr/local/bin/azcopy
# SAS token ile kimlik doğrulama
azcopy login
# Dizin yükle (paralel transfer, son derece hızlı)
azcopy copy '/var/backups/*'
'https://mystorageaccount2024.blob.core.windows.net/backups'
--recursive
--log-level INFO
--cap-mbps 500
# Sunucular arası kopyalama (blob'dan blob'a, veri makinenizden geçmez)
azcopy copy
'https://kaynak.blob.core.windows.net/container?sas-token'
'https://hedef.blob.core.windows.net/container?sas-token'
--recursive
# Senkronizasyon (sadece değişenleri yükler)
azcopy sync '/var/log/myapp'
'https://mystorageaccount2024.blob.core.windows.net/logs'
--recursive
--delete-destination false
Güvenlik Yapılandırması
SAS Token Oluşturma
Shared Access Signature token’ları, depolama hesabı anahtarlarını paylaşmadan sınırlı erişim vermenin en güvenli yoludur:
# Container düzeyinde SAS token (24 saatlik okuma izni)
EXPIRY=$(date -u -d "24 hours" '+%Y-%m-%dT%H:%MZ')
az storage container generate-sas
--name backups
--permissions rl
--expiry $EXPIRY
--connection-string $CONN_STR
--output tsv
# Blob düzeyinde SAS token (belirli bir dosya için yazma izni)
az storage blob generate-sas
--container-name uploads
--name "userdata/report-2024.xlsx"
--permissions rw
--expiry $EXPIRY
--connection-string $CONN_STR
--output tsv
# IP kısıtlamalı SAS token
az storage container generate-sas
--name backups
--permissions rl
--expiry $EXPIRY
--ip "203.0.113.0-203.0.113.255"
--connection-string $CONN_STR
--output tsv
SAS token izin kodları:
- r: Okuma (read)
- w: Yazma (write)
- d: Silme (delete)
- l: Listeleme (list)
- a: Ekleme (add, append blob için)
- c: Container oluşturma (create)
Firewall ve Private Endpoint
Üretim ortamında storage account’u internet üzerinden erişime kapatıp sadece belirli VNet’lerden veya IP adreslerinden erişim sağlamak kritik önem taşır:
# Varsayılan erişimi reddet
az storage account update
--name mystorageaccount2024
--resource-group rg-storage-prod
--default-action Deny
# Belirli IP adresine izin ver
az storage account network-rule add
--account-name mystorageaccount2024
--resource-group rg-storage-prod
--ip-address 203.0.113.50
# VNet subnet'ine izin ver
az storage account network-rule add
--account-name mystorageaccount2024
--resource-group rg-storage-prod
--vnet-name myVNet
--subnet mySubnet
# Tüm kuralları listele
az storage account network-rule list
--account-name mystorageaccount2024
--resource-group rg-storage-prod
Lifecycle Management
Erişim katmanı yönetimi, maliyet optimizasyonunun can damarıdır. 30 günden eski logları Cool’a, 90 günden eskilerini Archive’a taşıyan bir policy şöyle tanımlanır:
# Lifecycle policy JSON dosyası oluştur
cat > lifecycle-policy.json << 'EOF'
{
"rules": [
{
"name": "log-lifecycle",
"enabled": true,
"type": "Lifecycle",
"definition": {
"filters": {
"blobTypes": ["blockBlob"],
"prefixMatch": ["logs/"]
},
"actions": {
"baseBlob": {
"tierToCool": {
"daysAfterModificationGreaterThan": 30
},
"tierToArchive": {
"daysAfterModificationGreaterThan": 90
},
"delete": {
"daysAfterModificationGreaterThan": 365
}
},
"snapshot": {
"delete": {
"daysAfterCreationGreaterThan": 90
}
}
}
}
},
{
"name": "backup-archive",
"enabled": true,
"type": "Lifecycle",
"definition": {
"filters": {
"blobTypes": ["blockBlob"],
"prefixMatch": ["backups/"]
},
"actions": {
"baseBlob": {
"tierToArchive": {
"daysAfterModificationGreaterThan": 7
},
"delete": {
"daysAfterModificationGreaterThan": 730
}
}
}
}
}
]
}
EOF
# Policy'yi uygula
az storage account management-policy create
--account-name mystorageaccount2024
--resource-group rg-storage-prod
--policy @lifecycle-policy.json
Gerçek Dünya Senaryosu: Otomatik Veritabanı Yedekleme
Birçok ekip hala veritabanı yedeklerini yerel disklerde tutmakta ve bu büyük bir risk oluşturmaktadır. Aşağıdaki script, MySQL veritabanını yedekleyip Azure Blob Storage’a yükler ve eski yedekleri temizler:
#!/bin/bash
# /usr/local/bin/db-backup-azure.sh
set -euo pipefail
# Değişkenler
DB_HOST="localhost"
DB_USER="backup_user"
DB_PASS="guclu-sifre-buraya"
DB_NAME="production_db"
STORAGE_ACCOUNT="mystorageaccount2024"
CONTAINER="backups"
BACKUP_DIR="/tmp/db-backups"
RETENTION_DAYS=30
LOG_FILE="/var/log/db-backup-azure.log"
# Tarih formatı
DATE=$(date +%Y/%m/%d)
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="${BACKUP_DIR}/db_${DB_NAME}_${TIMESTAMP}.sql.gz"
BLOB_PATH="database/${DATE}/db_${DB_NAME}_${TIMESTAMP}.sql.gz"
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a $LOG_FILE
}
# Backup dizini oluştur
mkdir -p $BACKUP_DIR
log "Yedekleme başlıyor: $DB_NAME"
# MySQL dump al ve sıkıştır
mysqldump
--host=$DB_HOST
--user=$DB_USER
--password=$DB_PASS
--single-transaction
--routines
--triggers
$DB_NAME | gzip > $BACKUP_FILE
BACKUP_SIZE=$(du -sh $BACKUP_FILE | cut -f1)
log "Yedek oluşturuldu: $BACKUP_FILE (Boyut: $BACKUP_SIZE)"
# Azure'a yükle
CONN_STR=$(az storage account show-connection-string
--name $STORAGE_ACCOUNT
--resource-group rg-storage-prod
--output tsv)
az storage blob upload
--container-name $CONTAINER
--name "$BLOB_PATH"
--file $BACKUP_FILE
--connection-string "$CONN_STR"
--tier Cool
--no-progress
log "Azure'a yüklendi: $BLOB_PATH"
# Geçici dosyayı temizle
rm -f $BACKUP_FILE
# 30 günden eski blob'ları listele ve sil
# (Bu işlemi lifecycle policy ile otomatik yaptırmak daha iyi bir yaklaşımdır)
CUTOFF_DATE=$(date -d "$RETENTION_DAYS days ago" +%Y-%m-%dT%H:%M:%SZ)
DELETED_COUNT=$(az storage blob list
--container-name $CONTAINER
--prefix "database/"
--connection-string "$CONN_STR"
--query "[?properties.lastModified < '$CUTOFF_DATE'].name"
--output tsv | wc -l)
az storage blob list
--container-name $CONTAINER
--prefix "database/"
--connection-string "$CONN_STR"
--query "[?properties.lastModified < '$CUTOFF_DATE'].name"
--output tsv | while read blob_name; do
az storage blob delete
--container-name $CONTAINER
--name "$blob_name"
--connection-string "$CONN_STR"
log "Eski yedek silindi: $blob_name"
done
log "Tamamlandı. $DELETED_COUNT eski yedek temizlendi."
# Cron'a ekle: 0 2 * * * /usr/local/bin/db-backup-azure.sh
Bu scripti cron’a eklediğinizde her gece saat 02:00’de otomatik olarak çalışır.
Monitoring ve Alerting
Storage account’unuzun sağlığını izlemek için Azure Monitor entegrasyonunu aktif edin:
# Diagnostic settings - tüm logları Log Analytics'e gönder
az monitor diagnostic-settings create
--name storage-diagnostics
--resource $(az storage account show
--name mystorageaccount2024
--resource-group rg-storage-prod
--query id --output tsv)
--workspace $(az monitor log-analytics workspace show
--resource-group rg-monitoring
--workspace-name myWorkspace
--query id --output tsv)
--logs '[{"category": "StorageRead", "enabled": true}, {"category": "StorageWrite", "enabled": true}, {"category": "StorageDelete", "enabled": true}]'
--metrics '[{"category": "Transaction", "enabled": true}]'
# Kapasite uyarısı oluştur (10TB üzerinde uyar)
az monitor metrics alert create
--name "Blob Storage Kapasite Uyarisi"
--resource-group rg-storage-prod
--scopes $(az storage account show
--name mystorageaccount2024
--resource-group rg-storage-prod
--query id --output tsv)
--condition "avg BlobCapacity > 10995116277760"
--window-size 1h
--evaluation-frequency 1h
--action $(az monitor action-group show
--resource-group rg-monitoring
--name ops-team
--query id --output tsv)
Soft Delete ve Versioning
Yanlışlıkla silinen veya üzerine yazılan dosyaları kurtarmak için bu özellikleri mutlaka aktif edin:
# Blob soft delete'i aktif et (30 gün saklama)
az storage blob service-properties delete-policy update
--account-name mystorageaccount2024
--resource-group rg-storage-prod
--enable true
--days-retained 30
# Versioning'i aktif et
az storage account blob-service-properties update
--account-name mystorageaccount2024
--resource-group rg-storage-prod
--enable-versioning true
--enable-delete-retention true
--delete-retention-days 30
# Silinmiş blob'ları listele
az storage blob list
--container-name backups
--connection-string $CONN_STR
--include d
--query "[?deleted==true].{Name:name, DeletedTime:properties.deletedTime}"
--output table
# Silinmiş blob'u geri yükle
az storage blob undelete
--container-name backups
--name "database/2024/01/15/db_production_20240115_020001.sql.gz"
--connection-string $CONN_STR
Maliyet Optimizasyonu İpuçları
Blob Storage faturaları sürpriz yapabilir. Birkaç pratik önlem:
- Lifecycle policy zorunlu: Her container için mutlaka bir lifecycle kuralı tanımlayın. Yıllarca birikmiş gereksiz dosyalar faturayı patlatır.
- Doğru replikasyon seçimi: Dev/test ortamları için LRS yeterlidir. Üretim için kritikliğe göre ZRS veya GRS seçin.
- Archive katmanını akıllıca kullanın: Arşivden çıkarma (rehydration) maliyetlidir ve zaman alır. Sık erişilecek eski verileri Cool’da bırakın.
- Snapshot temizliği: Versioning aktifken eski snapshot’lar birikerek maliyet oluşturur. Lifecycle policy ile otomatik temizleyin.
- Boş container kontrolü: Ayda bir boş veya çok az kullanılan container’ları ve storage account’ları gözden geçirin.
- Transfer maliyeti: Azure içinde aynı bölgedeki servisler arası transfer ücretsizdir. Bölgeler arası veya internet üzerinden transfer ücretlidir.
Sonuç
Azure Blob Storage, kurulumu ve temel kullanımı görece basit ama derinlerine indikçe birçok nüansı olan bir hizmettir. Güvenlik tarafında public erişimi kapatmak, SAS token kullanmak ve network rule’ları yapılandırmak temel alınması gereken adımlardır. Maliyet tarafında ise lifecycle management doğru yapılandırılmadan bırakılan her ortam zamanla bir fatura kabusu haline gelebilir.
Soft delete ve versioning gibi koruyucu mekanizmaları baştan aktif etmek, ileride yaşanacak “yanlışlıkla silindim” paniklerini önler. AzCopy ile büyük veri transferlerinde hız ve güvenilirlik kazanırsınız. Otomatik yedekleme scriptleri ise insan hatasını devreden çıkararak operasyonel yükü azaltır.
Üretim ortamına taşımadan önce tüm bu yapılandırmaları bir dev ortamında test etmenizi, lifecycle policy’leri küçük ölçekte denemenizi ve SAS token’larınızın gerçekten beklediğiniz gibi çalıştığını doğrulamanızı tavsiye ederim. Blob Storage’ı doğru kurduğunuzda, yıllarca bakım gerektirmeden sizi destekleyen güçlü bir altyapı bileşeni haline gelir.
