Azure Files ile Bulut Dosya Paylaşımı Kurulum ve Yönetim Rehberi
Şirketin büyümesiyle birlikte ortaya çıkan sorunlardan biri de dosya paylaşımıdır. Kim hangi sunucuya bağlanacak, Windows makineler Linux makinelerle nasıl konuşacak, VPN olmadan uzak kullanıcılar nasıl erişecek? Bu soruların cevabı çoğu zaman Azure Files oluyor. Hem SMB hem NFS desteği, hem de tam yönetilen yapısıyla Azure Files, özellikle hibrit ortamlar için ciddi bir çözüm sunuyor. Bu yazıda Azure Files’ı sıfırdan kurarak gerçek dünya senaryolarında nasıl kullanabileceğinizi adım adım anlatacağım.
Azure Files Nedir ve Neden Kullanmalısınız?
Azure Files, Microsoft Azure üzerinde sunulan tam yönetilen bir dosya paylaşım hizmetidir. Klasik bir NAS cihazı ya da Windows File Server kurmanıza gerek kalmadan, SMB 2.1/3.x ve NFS 4.1 protokolleri üzerinden paylaşımlı depolama alanı oluşturabilirsiniz.
Şöyle düşünün: Elinizde 50 kişilik bir ekip var, yarısı ofiste Windows kullanıyor, diğer yarısı uzaktan MacOS ve Linux ile çalışıyor. Geleneksel yöntemde bir File Server kurmanız, VPN yapılandırmanız, yedekleme planlamanız ve donanım bakımını yapmanız gerekir. Azure Files ile tüm bunları atlayıp doğrudan işe odaklanabilirsiniz.
Azure Files’ın öne çıkan özellikleri:
- SMB 3.0 şifrelemesi: Veri aktarımı şifreli gerçekleşir
- Azure AD Kerberos kimlik doğrulama: Domain joined makineler için native entegrasyon
- Snapshot desteği: Dosya bazında geri alma imkanı
- Geo-redundant storage: Veri çoğaltma seçenekleri
- Azure Backup entegrasyonu: Merkezi yedekleme yönetimi
- Soft delete: Kazara silinen paylaşımları 90 güne kadar geri getirme
Storage Account Oluşturma
Azure Files, bir Storage Account altında çalışır. Bu yüzden önce doğru parametrelerle bir Storage Account oluşturmanız gerekiyor.
# Azure CLI ile Storage Account oluşturma
az group create
--name rg-dosyapaylasum
--location westeurope
az storage account create
--name stdosyapaylasum001
--resource-group rg-dosyapaylasum
--location westeurope
--sku Standard_LRS
--kind StorageV2
--enable-large-file-share
--min-tls-version TLS1_2
Burada dikkat etmeniz gereken birkaç parametre var:
- –sku Standard_LRS: Yerel olarak yedekli depolama. Üretim için Standard_ZRS veya Standard_GRS düşünebilirsiniz
- –enable-large-file-share: 5 TB’a kadar paylaşım boyutu için gerekli
- –min-tls-version TLS1_2: Güvenlik baseline’ı için önemli
Storage Account oluşturduktan sonra dosya paylaşımını oluşturuyoruz:
# Dosya paylaşımı oluşturma
az storage share-rm create
--resource-group rg-dosyapaylasum
--storage-account stdosyapaylasum001
--name sirket-dosyalari
--quota 1024
--access-tier Hot
# Paylaşımı doğrula
az storage share-rm list
--resource-group rg-dosyapaylasum
--storage-account stdosyapaylasum001
--output table
Windows Sunucuya Bağlama
Windows tarafında bağlama işlemi oldukça basit. Azure portal üzerinden ilgili paylaşımı seçip “Connect” butonuna tıkladığınızda hazır bir PowerShell scripti alabilirsiniz. Ama bunu CLI ile de yapabilirsiniz:
# Storage Account bilgilerini al
$storageAccountName = "stdosyapaylasum001"
$fileShareName = "sirket-dosyalari"
$resourceGroupName = "rg-dosyapaylasum"
# Storage Account key'ini al
$storageKey = (Get-AzStorageAccountKey `
-ResourceGroupName $resourceGroupName `
-Name $storageAccountName)[0].Value
# Credential oluştur
$credential = [System.Management.Automation.PSCredential]::new(
"Azure$storageAccountName",
(ConvertTo-SecureString -String $storageKey -AsPlainText -Force)
)
# Ağ sürücüsü olarak bağla
New-PSDrive `
-Name "Z" `
-PSProvider FileSystem `
-Root "\stdosyapaylasum001.file.core.windows.netsirket-dosyalari" `
-Credential $credential `
-Persist
# Kalıcı bağlantı için cmdkey kullan
cmdkey /add:"stdosyapaylasum001.file.core.windows.net" `
/user:"Azurestdosyapaylasum001" `
/pass:"$storageKey"
net use Z: \stdosyapaylasum001.file.core.windows.netsirket-dosyalari /persistent:yes
Önemli Not: Port 445’in açık olması gerekiyor. Bazı ISP’ler bu portu bloke edebilir. Test etmek için:
Test-NetConnection -ComputerName stdosyapaylasum001.file.core.windows.net -Port 445
Linux Sunucuya Bağlama
Linux tarafında cifs-utils paketi gerekiyor. Ubuntu/Debian ve RHEL/CentOS için ayrı ayrı göstereyim:
# Ubuntu/Debian
sudo apt-get update
sudo apt-get install cifs-utils -y
# RHEL/CentOS
sudo yum install cifs-utils -y
# Bağlantı noktası oluştur
sudo mkdir -p /mnt/sirket-dosyalari
# Storage Account bilgilerini environment variable olarak ayarla
STORAGE_ACCOUNT="stdosyapaylasum001"
STORAGE_KEY=$(az storage account keys list
--resource-group rg-dosyapaylasum
--account-name stdosyapaylasum001
--query "[0].value" -o tsv)
# Geçici bağlantı
sudo mount -t cifs
//stdosyapaylasum001.file.core.windows.net/sirket-dosyalari
/mnt/sirket-dosyalari
-o username=stdosyapaylasum001,password=$STORAGE_KEY,serverino,nosharesock,actimeo=30,mfsymlinks
# Kalıcı bağlantı için /etc/fstab
echo "//stdosyapaylasum001.file.core.windows.net/sirket-dosyalari /mnt/sirket-dosyalari cifs username=stdosyapaylasum001,password=$STORAGE_KEY,serverino,nosharesock,actimeo=30,mfsymlinks,_netdev 0 0" | sudo tee -a /etc/fstab
Burada dikkat edilmesi gereken konu, Storage Account key’ini /etc/fstab’a düz metin olarak yazmak güvenlik riski oluşturur. Bunun yerine credentials dosyası kullanın:
# Credentials dosyası oluştur
sudo mkdir -p /etc/smbcredentials
sudo bash -c "cat > /etc/smbcredentials/stdosyapaylasum001.cred << EOF
username=stdosyapaylasum001
password=$STORAGE_KEY
EOF"
# İzinleri kısıtla
sudo chmod 600 /etc/smbcredentials/stdosyapaylasum001.cred
# fstab'a credentials dosyasını referans ver
echo "//stdosyapaylasum001.file.core.windows.net/sirket-dosyalari /mnt/sirket-dosyalari cifs credentials=/etc/smbcredentials/stdosyapaylasum001.cred,serverino,nosharesock,actimeo=30,_netdev 0 0" | sudo tee -a /etc/fstab
# Test et
sudo mount -a
df -h /mnt/sirket-dosyalari
Azure AD Kimlik Doğrulama Yapılandırması
Storage Account key kullanmak yönetim açısından sıkıntı yaratabilir. Ekip büyüdükçe kimin erişimi var, kim ne yapabiliyor gibi sorular ortaya çıkıyor. Azure AD Kerberos authentication devreye girdiğinde bu sorunlar ortadan kalkıyor.
# Storage Account'ta Azure AD Kerberos'u etkinleştir
az storage account update
--resource-group rg-dosyapaylasum
--name stdosyapaylasum001
--enable-files-aadkerb true
# Service principal'ı kaydet
az storage account update
--resource-group rg-dosyapaylasum
--name stdosyapaylasum001
--custom-domain ""
--enable-files-aadkerb true
# Share level izin ata (Storage File Data SMB Share Reader)
STORAGE_ACCOUNT_ID=$(az storage account show
--resource-group rg-dosyapaylasum
--name stdosyapaylasum001
--query id -o tsv)
USER_OBJECT_ID=$(az ad user show
--id [email protected]
--query id -o tsv)
az role assignment create
--role "Storage File Data SMB Share Contributor"
--assignee $USER_OBJECT_ID
--scope "$STORAGE_ACCOUNT_ID/fileServices/default/shares/sirket-dosyalari"
Share level izinlerin yanı sıra NTFS izinlerini de ayarlamanız gerekiyor. Bu işlemi bir Windows makinesinden yapabilirsiniz:
# Azure AD ile paylaşımı bağla (key olmadan)
$connectTestResult = Test-NetConnection -ComputerName stdosyapaylasum001.file.core.windows.net -Port 445
# Bağlantıyı Azure AD token ile kur
net use Z: \stdosyapaylasum001.file.core.windows.netsirket-dosyalari
# NTFS izinlerini ayarla
$acl = Get-Acl Z:
$permission = "sirketkullanici_grubu", "Modify", "ContainerInherit,ObjectInherit", "None", "Allow"
$accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule $permission
$acl.SetAccessRule($accessRule)
Set-Acl Z: $acl
Snapshot Yönetimi
Azure Files’ın en değerli özelliklerinden biri snapshot desteği. Bir kullanıcı yanlışlıkla kritik bir dosyayı sildiğinde ya da üzerine yazdığında, snapshot sayesinde geri dönebilirsiniz. Bu işlemi hem manuel hem de otomatik yapabilirsiniz.
# Manuel snapshot oluştur
az storage share snapshot
--name sirket-dosyalari
--account-name stdosyapaylasum001
--account-key $STORAGE_KEY
# Mevcut snapshot'ları listele
az storage share list
--account-name stdosyapaylasum001
--account-key $STORAGE_KEY
--include-snapshot
--output table
# Belirli bir snapshot'tan dosya geri yükle
SNAPSHOT_TIME="2024-01-15T10:30:00.0000000Z"
az storage file download
--share-name sirket-dosyalari
--path "onemli-dokuman.xlsx"
--dest "/tmp/onemli-dokuman-geri.xlsx"
--account-name stdosyapaylasum001
--account-key $STORAGE_KEY
--snapshot $SNAPSHOT_TIME
# Snapshot'ı sil
az storage share delete
--name sirket-dosyalari
--account-name stdosyapaylasum001
--account-key $STORAGE_KEY
--snapshot $SNAPSHOT_TIME
Otomatik snapshot için Azure Backup kullanabilirsiniz, ama basit senaryolar için bir cron job da işinizi görür:
#!/bin/bash
# /usr/local/bin/azure-files-snapshot.sh
STORAGE_ACCOUNT="stdosyapaylasum001"
STORAGE_KEY="your-storage-key"
SHARE_NAME="sirket-dosyalari"
RETENTION_DAYS=7
# Snapshot oluştur
SNAPSHOT_DATETIME=$(az storage share snapshot
--name $SHARE_NAME
--account-name $STORAGE_ACCOUNT
--account-key $STORAGE_KEY
--query snapshot -o tsv)
echo "$(date): Snapshot oluşturuldu: $SNAPSHOT_DATETIME"
# Eski snapshot'ları temizle
CUTOFF_DATE=$(date -d "$RETENTION_DAYS days ago" --utc +%Y-%m-%dT%H:%M:%SZ)
az storage share list
--account-name $STORAGE_ACCOUNT
--account-key $STORAGE_KEY
--include-snapshot
--query "[?name=='$SHARE_NAME' && snapshot!=null && snapshot<'$CUTOFF_DATE'].snapshot"
-o tsv | while read OLD_SNAPSHOT; do
az storage share delete
--name $SHARE_NAME
--account-name $STORAGE_ACCOUNT
--account-key $STORAGE_KEY
--snapshot "$OLD_SNAPSHOT"
echo "$(date): Eski snapshot silindi: $OLD_SNAPSHOT"
done
Bu scripti crontab’a ekleyin:
# Her gece 02:00'de çalıştır
0 2 * * * /usr/local/bin/azure-files-snapshot.sh >> /var/log/azure-files-snapshot.log 2>&1
Private Endpoint ile Güvenli Erişim
Varsayılan olarak Azure Files public internet üzerinden erişilebilir. Üretim ortamında bunu kesinlikle değiştirmeniz gerekiyor. Private Endpoint kullanarak trafiği Azure backbone üzerinden yönlendirin ve public erişimi kapatın.
# Private Endpoint oluştur
VNET_ID=$(az network vnet show
--resource-group rg-network
--name vnet-production
--query id -o tsv)
SUBNET_ID=$(az network vnet subnet show
--resource-group rg-network
--vnet-name vnet-production
--name snet-storage
--query id -o tsv)
STORAGE_ID=$(az storage account show
--resource-group rg-dosyapaylasum
--name stdosyapaylasum001
--query id -o tsv)
# Private endpoint oluştur
az network private-endpoint create
--name pe-stdosyapaylasum001
--resource-group rg-dosyapaylasum
--vnet-name vnet-production
--subnet snet-storage
--private-connection-resource-id $STORAGE_ID
--group-id file
--connection-name conn-stdosyapaylasum001
# Private DNS zone oluştur
az network private-dns zone create
--resource-group rg-dosyapaylasum
--name "privatelink.file.core.windows.net"
# DNS zone'u VNet ile ilişkilendir
az network private-dns link vnet create
--resource-group rg-dosyapaylasum
--zone-name "privatelink.file.core.windows.net"
--name dns-link-vnet-production
--virtual-network vnet-production
--registration-enabled false
# Private endpoint DNS kaydı oluştur
az network private-endpoint dns-zone-group create
--resource-group rg-dosyapaylasum
--endpoint-name pe-stdosyapaylasum001
--name dns-zone-group
--private-dns-zone "privatelink.file.core.windows.net"
--zone-name "privatelink.file.core.windows.net"
# Public erişimi devre dışı bırak
az storage account update
--resource-group rg-dosyapaylasum
--name stdosyapaylasum001
--public-network-access Disabled
Performans İzleme ve Maliyet Optimizasyonu
Azure Monitor ile Azure Files performansını izleyebilirsiniz. Özellikle latency ve throughput metriklerini takip etmek önemli:
# Diagnostic settings oluştur
az monitor diagnostic-settings create
--resource $STORAGE_ID
--resource-type "Microsoft.Storage/storageAccounts"
--name diag-stdosyapaylasum001
--workspace $(az monitor log-analytics workspace show
--resource-group rg-monitoring
--workspace-name law-production
--query id -o tsv)
--logs '[{"category": "StorageRead","enabled": true},{"category": "StorageWrite","enabled": true},{"category": "StorageDelete","enabled": true}]'
--metrics '[{"category": "Transaction","enabled": true},{"category": "Capacity","enabled": true}]'
# Kullanım istatistiklerini çek
az monitor metrics list
--resource $STORAGE_ID
--resource-type "Microsoft.Storage/storageAccounts/fileServices"
--resource-namespace "Microsoft.Storage"
--metric "FileCapacity"
--interval PT1H
--output table
Maliyet açısından dikkat etmeniz gerekenler:
- Hot tier: Sık erişilen dosyalar için uygundur, depolama maliyeti yüksek ama işlem maliyeti düşük
- Cool tier: Az erişilen dosyalar için maliyet açısından avantajlıdır
- Transaction optimized: Yoğun işlem gerektiren workload’lar için
- Premium: Düşük latency gerektiren uygulamalar için SSD tabanlı
Tier değiştirmek için:
az storage share-rm update
--resource-group rg-dosyapaylasum
--storage-account stdosyapaylasum001
--name sirket-dosyalari
--access-tier Cool
Gerçek Dünya Senaryosu: Uygulama Sunucuları Arası Paylaşımlı Depolama
Bir e-ticaret platformu düşünün. Müşteriler ürün görseli yüklüyor, bu görseller birden fazla uygulama sunucusu tarafından okunuyor. Geleneksel yöntemde NFS sunucusu ya da sticky session çözümleri kullanılırdı. Azure Files ile bu problemi şöyle çözebilirsiniz:
# Her uygulama sunucusuna otomatik bağlantı için cloud-init script
cat > /tmp/azure-files-init.sh << 'EOF'
#!/bin/bash
# Paket kurulumu
apt-get update && apt-get install -y cifs-utils
# Credentials dosyası
mkdir -p /etc/smbcredentials
cat > /etc/smbcredentials/storage.cred << CRED
username=stdosyapaylasum001
password=STORAGE_KEY_BURAYA
CRED
chmod 600 /etc/smbcredentials/storage.cred
# Bağlantı noktaları
mkdir -p /var/www/uploads
mkdir -p /var/app/shared-config
# fstab girişleri
cat >> /etc/fstab << FSTAB
//stdosyapaylasum001.file.core.windows.net/uygulama-yuklemeler /var/www/uploads cifs credentials=/etc/smbcredentials/storage.cred,uid=www-data,gid=www-data,serverino,nosharesock,actimeo=30,_netdev 0 0
//stdosyapaylasum001.file.core.windows.net/uygulama-config /var/app/shared-config cifs credentials=/etc/smbcredentials/storage.cred,serverino,nosharesock,actimeo=30,_netdev 0 0
FSTAB
# Bağla
mount -a
echo "Azure Files bağlantısı tamamlandı"
EOF
chmod +x /tmp/azure-files-init.sh
Bu yapıda tüm uygulama sunucuları aynı paylaşımlı depolamayı kullanır. Bir kullanıcı sunucu A’ya dosya yüklese de sunucu B bunu görebilir. Auto Scaling Group ile yeni sunucu eklendiğinde de aynı script çalışır ve bağlantı otomatik kurulur.
Sorun Giderme
Azure Files kullanırken karşılaşılan yaygın sorunlar ve çözümleri:
Port 445 problemi için:
# Port testi
nc -zv stdosyapaylasum001.file.core.windows.net 445
# Alternatif: nmap ile
nmap -p 445 stdosyapaylasum001.file.core.windows.net
Mount hataları için hata kodlarını kontrol edin:
# Detaylı mount logu
sudo mount -t cifs
//stdosyapaylasum001.file.core.windows.net/sirket-dosyalari
/mnt/test
-o credentials=/etc/smbcredentials/storage.cred,vers=3.0,serverino
-v
# Kernel loglarını kontrol et
dmesg | grep -i cifs | tail -20
# Bağlantı durumu
cat /proc/mounts | grep cifs
Performans sorunu yaşıyorsanız actimeo değerini artırabilirsiniz. Varsayılan 1 saniye olan attribute cache timeout’u yüksek tutmak metadata operasyonlarını azaltır.
Sonuç
Azure Files, özellikle hibrit ve çoklu sunucu ortamlarında dosya paylaşımı sorununu gerçekten çözüyor. Windows ile Linux sunucuların aynı paylaşımı kullandığı, uzak kullanıcıların VPN olmadan erişebildiği, snapshot ile dosyaların geri alınabildiği bir yapı kurmak artık saatler değil dakikalar alıyor.
Dikkat etmeniz gereken kritik noktaları özetleyeyim: Private Endpoint kullanmadan production ortama çıkmayın, storage key’leri düz metin olarak bırakmayın, snapshot rotasyonunu mutlaka otomatize edin ve Azure AD authentication’a geçişi planlayın. Key rotation da ayrıca önemli; Storage Account key’lerini periyodik olarak rotate etmek için Azure Key Vault entegrasyonunu değerlendirebilirsiniz.
Maliyet tarafında ise paylaşımlarınızı erişim sıklığına göre tier’lara ayırmak ciddi tasarruf sağlıyor. Eski arşiv dosyaları Hot tier’da beklemesin, bunları Cool’a taşıyın. Büyük ve kritik paylaşımlar için Premium tier’ı da göz önünde bulundurun, özellikle yüksek IOPS gerektiren veritabanı dosyaları ya da yoğun kullanıcı trafiği olan uygulama paylaşımları için farkı net olarak hissedeceksiniz.
