Azure VM Snapshot Alma ve Geri Yükleme Rehberi

Üretim ortamında bir şeyler ters gittiğinde, o anlık paniği yaşamamış sysadmin yoktur. Disk patlar, uygulama güncellemesi her şeyi mahveder, yanlış bir komut çalışır ve birden bire saatler öncesine dönmek istersiniz. İşte tam bu noktada Azure VM snapshot’ları hayat kurtarıcı oluyor. Bu yazıda snapshot alma ve geri yükleme süreçlerini, gerçek senaryolarla birlikte baştan sona anlatacağım.

Snapshot Nedir, Disk Snapshot’ı Neden Önemli?

Azure’da snapshot, bir managed disk’in belirli bir andaki tam kopyasıdır. VM’in anlık fotoğrafını çekiyorsunuz aslında. Bu fotoğrafı isterseniz saklıyorsunuz, isterseniz yeni bir disk oluşturmak için kullanıyorsunuz.

Backup çözümleriyle karıştırmamak gerekiyor. Azure Backup daha kapsamlı, policy tabanlı ve uzun vadeli saklama için ideal. Snapshot ise daha operasyonel, “şu an bir şey yapacağım, öncesini saklayayım” mantığıyla çalışıyor. Kısa vadeli güvenlik ağı diyebiliriz.

Gerçek bir senaryo düşünelim: Production’daki bir Linux VM üzerinde kernel güncellemesi yapacaksınız. Her şeyin düzgün çalıştığından eminsiniz ama “ya çalışmazsa?” sorusu aklınızı kemiriyor. İşte bu durumda snapshot alıyorsunuz, güncellemeyi yapıyorsunuz, sorun çıkarsa birkaç dakika içinde eski haline dönüyorsunuz.

Azure CLI ile Snapshot Alma

Ortamı Hazırlamak

Öncelikle Azure CLI’nın kurulu ve login olduğunuzdan emin olun:

# Azure CLI versiyonunu kontrol et
az --version

# Login ol
az login

# Eğer birden fazla subscription varsa doğrusunu seç
az account list --output table
az account set --subscription "SubscriptionAdınız"

VM’in Disk Bilgilerini Almak

Snapshot almadan önce hangi diskten snapshot alacağınızı bilmeniz gerekiyor. VM’e bağlı diskleri listeleyelim:

# VM'in OS disk ve data disk bilgilerini al
az vm show 
  --resource-group MyResourceGroup 
  --name MyVM 
  --query "storageProfile" 
  --output json

# Sadece OS disk ID'sini almak için
OS_DISK_ID=$(az vm show 
  --resource-group MyResourceGroup 
  --name MyVM 
  --query "storageProfile.osDisk.managedDisk.id" 
  --output tsv)

echo "OS Disk ID: $OS_DISK_ID"

OS Disk’ten Snapshot Almak

# Snapshot al - VM çalışırken bile alabilirsiniz
az snapshot create 
  --resource-group MyResourceGroup 
  --name MyVM-OS-Snapshot-$(date +%Y%m%d-%H%M) 
  --source $OS_DISK_ID 
  --location eastus 
  --sku Standard_LRS 
  --tags Environment=Production Purpose=PreUpdate CreatedBy=Admin

# Snapshot'ın oluşturulduğunu doğrula
az snapshot show 
  --resource-group MyResourceGroup 
  --name MyVM-OS-Snapshot-20240115-1430 
  --query "{Name:name, Size:diskSizeGb, State:provisioningState}" 
  --output table

Burada --sku parametresi önemli. Standard_LRS ucuz ve çoğu senaryo için yeterli. Premium_LRS seçerseniz daha hızlı ama daha pahalı. Snapshot’ı başka bir bölgeye kopyalamak istiyorsanız Standard_ZRS veya Premium_ZRS kullanabilirsiniz.

Data Disk Snapshot’ı

Çoğu zaman sadece OS disk değil, data disklerden de snapshot almak gerekiyor. Özellikle veritabanı sunucularında:

# Data disk ID'sini al (lun numarasına göre)
DATA_DISK_ID=$(az vm show 
  --resource-group MyResourceGroup 
  --name MyVM 
  --query "storageProfile.dataDisks[0].managedDisk.id" 
  --output tsv)

# Data disk snapshot'ı al
az snapshot create 
  --resource-group MyResourceGroup 
  --name MyVM-Data-Snapshot-$(date +%Y%m%d-%H%M) 
  --source $DATA_DISK_ID 
  --location eastus 
  --sku Standard_LRS 
  --tags DiskType=Data

Snapshot’tan Disk Oluşturma ve Geri Yükleme

Snapshot’tan Yeni Disk Oluşturmak

Snapshot’ı direkt VM’e bağlayamazsınız. Önce snapshot’tan bir managed disk oluşturmanız gerekiyor:

# Snapshot ID'sini al
SNAPSHOT_ID=$(az snapshot show 
  --resource-group MyResourceGroup 
  --name MyVM-OS-Snapshot-20240115-1430 
  --query "id" 
  --output tsv)

# Snapshot'tan yeni bir managed disk oluştur
az disk create 
  --resource-group MyResourceGroup 
  --name MyVM-Restored-Disk 
  --source $SNAPSHOT_ID 
  --location eastus 
  --sku Premium_LRS 
  --tags RestoredFrom=MyVM-OS-Snapshot-20240115-1430

VM’in OS Diskini Değiştirmek

İşte kritik nokta burası. OS diskini değiştirirken VM’in durdurulması gerekiyor:

# VM'i durdur (deallocate)
az vm deallocate 
  --resource-group MyResourceGroup 
  --name MyVM

# Yeni disk ID'sini al
NEW_DISK_ID=$(az disk show 
  --resource-group MyResourceGroup 
  --name MyVM-Restored-Disk 
  --query "id" 
  --output tsv)

# OS diski değiştir
az vm update 
  --resource-group MyResourceGroup 
  --name MyVM 
  --os-disk $NEW_DISK_ID

# VM'i yeniden başlat
az vm start 
  --resource-group MyResourceGroup 
  --name MyVM

Bu işlemden sonra VM, snapshot alındığı andaki durumuna geri dönüyor. Muhteşem, değil mi?

PowerShell ile Snapshot İşlemleri

Azure CLI’yı seviyorum ama Windows ortamında çalışan ya da PowerShell’i tercih eden yöneticiler için aynı işlemleri PowerShell ile de gösterelim:

# Azure'a bağlan
Connect-AzAccount
Set-AzContext -SubscriptionId "SubscriptionId"

# VM bilgilerini al
$vm = Get-AzVM -ResourceGroupName "MyResourceGroup" -Name "MyVM"
$osDisk = $vm.StorageProfile.OsDisk

# Snapshot konfigürasyonu hazırla
$snapshotConfig = New-AzSnapshotConfig `
  -SourceUri $osDisk.ManagedDisk.Id `
  -Location "eastus" `
  -CreateOption "Copy" `
  -SkuName "Standard_LRS"

# Snapshot al
$snapshotName = "MyVM-OS-Snap-" + (Get-Date -Format "yyyyMMdd-HHmm")
$snapshot = New-AzSnapshot `
  -ResourceGroupName "MyResourceGroup" `
  -SnapshotName $snapshotName `
  -Snapshot $snapshotConfig

Write-Host "Snapshot oluşturuldu: $($snapshot.Name)"
Write-Host "Provisioning State: $($snapshot.ProvisioningState)"

# Snapshot'tan disk oluştur
$diskConfig = New-AzDiskConfig `
  -Location "eastus" `
  -SourceResourceId $snapshot.Id `
  -CreateOption "Copy" `
  -SkuName "Premium_LRS"

$restoredDisk = New-AzDisk `
  -ResourceGroupName "MyResourceGroup" `
  -DiskName "MyVM-Restored-OS-Disk" `
  -Disk $diskConfig

# VM'i durdur ve diski değiştir
Stop-AzVM -ResourceGroupName "MyResourceGroup" -Name "MyVM" -Force

Set-AzVMOSDisk -VM $vm -ManagedDiskId $restoredDisk.Id -Name $restoredDisk.Name

Update-AzVM -ResourceGroupName "MyResourceGroup" -VM $vm

Start-AzVM -ResourceGroupName "MyResourceGroup" -Name "MyVM"

Otomatik Snapshot Script’i

Gerçek production ortamlarında bu işlemleri her seferinde elle yapmak istemezsiniz. İşte günlük snapshot alan ve eski snapshot’ları temizleyen bir bash script’i:

#!/bin/bash
# azure-snapshot-manager.sh
# Kullanim: ./azure-snapshot-manager.sh <ResourceGroup> <VMName> <SaklananGunSayisi>

RESOURCE_GROUP=${1:-"MyResourceGroup"}
VM_NAME=${2:-"MyVM"}
RETENTION_DAYS=${3:-7}
DATE_TAG=$(date +%Y%m%d-%H%M)
LOG_FILE="/var/log/azure-snapshot-manager.log"

log() {
  echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a $LOG_FILE
}

# OS disk ID'sini al
log "VM disk bilgileri aliniyor: $VM_NAME"
OS_DISK_ID=$(az vm show 
  --resource-group "$RESOURCE_GROUP" 
  --name "$VM_NAME" 
  --query "storageProfile.osDisk.managedDisk.id" 
  --output tsv 2>/dev/null)

if [ -z "$OS_DISK_ID" ]; then
  log "HATA: Disk ID alinamadi. VM mevcut mu?"
  exit 1
fi

# Snapshot al
SNAPSHOT_NAME="${VM_NAME}-auto-${DATE_TAG}"
log "Snapshot aliniyor: $SNAPSHOT_NAME"

az snapshot create 
  --resource-group "$RESOURCE_GROUP" 
  --name "$SNAPSHOT_NAME" 
  --source "$OS_DISK_ID" 
  --sku Standard_LRS 
  --tags AutoSnapshot=true RetentionDays=$RETENTION_DAYS VMName=$VM_NAME 
  --output none

if [ $? -eq 0 ]; then
  log "Snapshot basariyla alindi: $SNAPSHOT_NAME"
else
  log "HATA: Snapshot alinamadi!"
  exit 1
fi

# Eski snapshot'lari temizle
log "Eski snapshot'lar temizleniyor (${RETENTION_DAYS} gunden eskiler)..."
CUTOFF_DATE=$(date -d "$RETENTION_DAYS days ago" +%Y-%m-%dT%H:%M:%S)

az snapshot list 
  --resource-group "$RESOURCE_GROUP" 
  --query "[?tags.AutoSnapshot=='true' && tags.VMName=='$VM_NAME' && timeCreated<'$CUTOFF_DATE'].name" 
  --output tsv | while read OLD_SNAPSHOT; do
    log "Siliniyor: $OLD_SNAPSHOT"
    az snapshot delete 
      --resource-group "$RESOURCE_GROUP" 
      --name "$OLD_SNAPSHOT" 
      --output none
    log "Silindi: $OLD_SNAPSHOT"
done

log "Snapshot yonetimi tamamlandi."

Bu script’i crontab’a ekleyerek otomatik hale getirebilirsiniz:

# Her gece saat 02:00'de snapshot al, 7 gun sakla
0 2 * * * /opt/scripts/azure-snapshot-manager.sh MyResourceGroup MyVM 7

Cross-Region Snapshot Kopyalama

Disaster recovery senaryolarında snapshot’ı farklı bir bölgeye kopyalamanız gerekebilir. Örneğin, East US’daki bir VM’in snapshot’ını West US’a kopyalamak:

# Kaynak snapshot ID'sini al
SOURCE_SNAPSHOT_ID=$(az snapshot show 
  --resource-group MyResourceGroup 
  --name MyVM-OS-Snapshot-20240115-1430 
  --query "id" 
  --output tsv)

# Hedef bölgede snapshot kopyası oluştur
az snapshot create 
  --resource-group MyDRResourceGroup 
  --name MyVM-OS-Snapshot-DR-20240115 
  --source $SOURCE_SNAPSHOT_ID 
  --location westus 
  --sku Standard_LRS 
  --copy-start 
  --tags SourceRegion=eastus SnapshotType=DR

# Kopyalama durumunu takip et
az snapshot show 
  --resource-group MyDRResourceGroup 
  --name MyVM-OS-Snapshot-DR-20240115 
  --query "{Name:name, State:provisioningState, CompletionPercent:completionPercent}" 
  --output json

--copy-start parametresi kopyalamayı arka planda başlatır, komut hemen geri döner. Büyük diskler için bu önemli, yoksa terminal saatler boyunca bekleyebilir.

Snapshot Maliyetlerini Optimize Etmek

Snapshot’lar para ister. Kötü yönetilirse fatura sizi şaşırtabilir. Bütün snapshot’larınızı ve boyutlarını listeleyerek bir kontrol yapın:

# Resource group'taki tum snapshot'lari listele
az snapshot list 
  --resource-group MyResourceGroup 
  --query "[].{Name:name, SizeGB:diskSizeGb, Created:timeCreated, Sku:sku.name}" 
  --output table

# Eski ve gereksiz snapshot'lari bul (30 gunden eski)
THIRTY_DAYS_AGO=$(date -d "30 days ago" --utc +%Y-%m-%dT%H:%M:%SZ)

az snapshot list 
  --resource-group MyResourceGroup 
  --query "[?timeCreated<'$THIRTY_DAYS_AGO'].{Name:name, Created:timeCreated, SizeGB:diskSizeGb}" 
  --output table

Maliyeti düşürmek için birkaç pratik öneri:

  • Standard_LRS kullanın: Premium gerekmediği sürece Standard_LRS yeterli ve çok daha ucuz.
  • Retention policy uygulayın: Yukarıdaki script gibi otomatik temizleme mutlaka olsun.
  • Gereksiz snapshot’ları silin: Test ortamından kalan snapshot’lar birikiyor ve fatura sürpriz yapıyor.
  • Incremental snapshot kullanın: Azure, incremental snapshot özelliği sunuyor. İlk snapshot tam kopyayken sonrakiler sadece değişen blokları alıyor. Hem maliyet hem de süre açısından avantajlı.

Incremental snapshot için:

az snapshot create 
  --resource-group MyResourceGroup 
  --name MyVM-Incremental-Snap-$(date +%Y%m%d) 
  --source $OS_DISK_ID 
  --incremental true 
  --sku Standard_LRS

Gerçek Dünya Senaryosu: Kernel Güncelleme Geri Alma

Başta bahsettiğim kernel güncelleme senaryosunu uçtan uca yaşayalım. Production Linux VM’inizde kernel güncelleme yapacaksınız.

Adım 1: Snapshot al

# Güncelleme öncesi snapshot
VM="prod-web-01"
RG="prod-rg"

OS_DISK=$(az vm show -g $RG -n $VM 
  --query "storageProfile.osDisk.managedDisk.id" -o tsv)

az snapshot create 
  --resource-group $RG 
  --name "${VM}-pre-kernel-update-$(date +%Y%m%d)" 
  --source $OS_DISK 
  --sku Standard_LRS 
  --tags Reason=KernelUpdate ApprovedBy=SeniorAdmin
  
echo "Snapshot hazir. Guncellemeye geciliyor..."

Adım 2: Güncellemeyi yap, test et

Güncelleme yapıyorsunuz, VM yeniden başlıyor ama uygulama ayağa kalkmıyor. Kernel uyumsuzluğu var. Panik yok, snapshot’ımız var.

Adım 3: Geri al

SNAPSHOT_NAME="${VM}-pre-kernel-update-$(date +%Y%m%d)"

# Snapshot'tan yeni disk olustur
SNAPSHOT_ID=$(az snapshot show -g $RG -n $SNAPSHOT_NAME --query id -o tsv)

az disk create 
  --resource-group $RG 
  --name "${VM}-rollback-disk" 
  --source $SNAPSHOT_ID 
  --sku Premium_LRS

# VM'i durdur
az vm deallocate -g $RG -n $VM

# Diski degistir
NEW_DISK_ID=$(az disk show -g $RG -n "${VM}-rollback-disk" --query id -o tsv)
az vm update -g $RG -n $VM --os-disk $NEW_DISK_ID

# Yeniden baslat
az vm start -g $RG -n $VM

echo "Rollback tamamlandi! VM eski haline dondu."

Yaklaşık 10-15 dakika içinde VM eski haline dönüyor. Bir kernel güncelleme felaketini bu kadar hızlı atlattığınızda, snapshot almanın neden operasyonel bir zorunluluk olduğunu çok daha iyi anlıyorsunuz.

Azure Portal Üzerinden Snapshot Alma

Her zaman CLI tercih etmeyebilirsiniz. Portal üzerinden de hızlıca snapshot alabilirsiniz:

  • Azure Portal’a gidin, arama kutusuna “Disks” yazın.
  • İlgili VM’in OS diskine tıklayın.
  • Üst menüden “Create snapshot” seçin.
  • Resource group, isim ve depolama tipi seçin.
  • “Review + create” ile tamamlayın.

Geri yükleme için portal üzerinden:

  • “Snapshots” bölümüne gidin, ilgili snapshot’ı bulun.
  • “Create disk” ile yeni disk oluşturun.
  • VM’in “Disks” ayarlarına gidin, OS diskini değiştirin.

Portal işlemleri öğrenmek için güzel ama otomasyonda her zaman CLI veya PowerShell tercih edin.

Snapshot ile İlgili Sık Yapılan Hatalar

VM’i durdurmadan diski değiştirmeye çalışmak: Bu doğrudan hata veriyor. OS diskini değiştirmek için VM’in deallocated durumda olması şart. Sadece data diskleri sıcak takıp çıkarabilirsiniz.

Snapshot’ı yanlış bölgede oluşturmak: Snapshot oluşturduğunuz bölge, disk oluşturmak istediğiniz bölgeyle uyuşmalı. Cross-region kullanımda kopyalama adımını atlamayın.

Retention policy olmadan snapshot biriktirmek: İki ay sonra faturaya bakıp şaşırıyorsunuz. Başından retention policy koyun.

Application-consistent snapshot için VM’i durdurmamak: Veritabanı sunucularında çalışan VM’den snapshot aldığınızda, belleğe yazılmamış veri kaybolabilir. Kritik veritabanları için ya VM’i durdurun ya da uygulama bazlı flush yapın, ya da Azure Backup’ın application-consistent backup özelliğini kullanın.

Sonuç

Azure VM snapshot alma ve geri yükleme, her Azure yöneticisinin refleks seviyesinde bilmesi gereken bir beceri. Karmaşık görünüyor ama birkaç kez yaptıktan sonra her adım oturuyor. En önemli mesaj şu: güncelleme, migration veya riskli bir değişiklik öncesinde snapshot almak bir seçenek değil, zorunluluktur.

Otomatik snapshot script’ini production VM’lerinize mutlaka ekleyin. Retention policy belirleyin ve maliyeti gözden kaçırmayın. Cross-region kopyalama ile DR senaryonuzu güçlendirin. Ve her şeyden önemlisi, geri yükleme prosedürünü gerçekten bir sorun yaşanmadan önce test edin. Felaket anında ilk kez denediğiniz prosedür asla güven vermez.

Snapshot aldım ama hiç geri yükleme testi yapmadım diyorsanız, bu yazıyı okuduktan sonra dev ortamınızda bir tatbikat yapın. İleride sizi kurtaracak olan tam da o tatbikat olacak.

Bir yanıt yazın

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