Azure Files Nedir? Nasıl Kullanılır?

0 dakikada yazıldı

57136 defa okundu

Düzenle

Bundan yaklaşık iki sene önce Azure Drives ile ilgili bir yazı yazmıştım. Özellikle migration veya on-prem (şirket içi) legacy uygulamalar, sistemlerle cloud ortamındaki yapıları konuşturmak için kullanılabilecek bir alt yapıydı Azure Drive. Neden geçmiş zamanlı konuşuyorum? Çünkü Azure Drive hizmeti 2015 yılı içerisinde sonlandırılacak ve onun yerine şu anda Preview olan Azure Files gelecek. Durum bu olunca ben de erkenden Azure Files ile ilgili bir yazı yazarak hem ne nedir sorusunu biraz cevaplayalım, hem de Azure Drive kullandığınız yerleri nasıl Azure Files'a geçirirsiniz göz atalım istedim.

Azure Drives servisi normal Storage Account'lar üzerinden veriliyor. Hizmet şu anda Preview olduğu için ilk olarak Preview hizmetler sayfasından aktif hale getirmeniz gerekecek. Hizmeti aktif hale getirdikten sonra yeni bir Storage Account yaratmanız gerekiyor. Eski hesaplara şu an için Azure Files otomatik olarak eklenmiyor.

Nasıl kullanılır?

Azure Files esasen SMB 2.1 destekleyen bir Folder Share. Yani bildiğimiz Folder Share. Azure Drive kullananlar hatırlayacaktır; Azure Drive yazma-okuma anlamında sadece bir instance/VM'e ataçlanabiliyordu. Bu durum Azure Files'da böyle değil :) İstediğiniz kadar makineye, instance'a ataçlayabilirsiniz Folder Share'leri. Azure Drive ile en büyük farklılıklarından biri zaten bu SMB 2.1 desteği. Bu protokol desteği Azure Drive'ın ITPro'lar tarafından da rahatlıkla kullanılmasını sağlıyor. Karşılaştıracak olursak Azure Drive aslında sadece developerlara hitap eden bir araç olarak kalmıştı ve özünde çözmeye çalıştığı sorunlar düşünüldüğünde ITPro'lar tarafından kullanılamıyor olması aslında çok da akıllıca değildi. Azure Files ile bu sorun çözülürken bu sefer de aklınıza, "Tamam da ben developer olarak REST isterim!" haykırışı gelebilir :) Merak etmeyin, o da var. Zaten benim de odaklanacağım taraf o olarak. ITPro tarafına bulaşma niyetim yok :)

REST API'lar üzerinden Azure Files'a ulaşmak için Storage Client'ın 4.0 ve üstü sürümlerinden birini kullanmanız gerekiyor. Ben bu yazıyı yazarken Storage Account kütüphanesi zaten 4.2 sürümünde.  Gelin ufak bir proje yaratıp Nuget paketini ekleyelim bakalım neler yapabiliyoruz.

[C#]

CloudStorageAccount account = CloudStorageAccount.Parse(this.connString);
CloudFileClient client = account.CreateCloudFileClient();
CloudFileShare share = client.GetShareReference("birklasor");
share.CreateIfNotExistsAsync().Wait();

Storage Account'larla çalışanlar için yukarıdaki kod süper tanıdık gözükecektir. Her zamanki StorageAccount objesi üzerinden normal Blob, Table, Queue ile çalıştığımız zamanlardaki gibi bu sefer de CloudFileClient alıyoruz. Bu client üzerinden var olan veya olmayan bir ShareFolder'ın ismini verip referansını aldıktan sonra IfNotExist ile Share Folder'ı oluşturuyoruz. Hepsi bu kadar aslında. REST üzerinden Folder Share'i yaratmış olduk.

Azure Files Storage Account Endpoint'lerinden
biri.Azure Files Storage Account Endpoint'lerinden biri.

Şimdi bu noktada birkaç uyarıda bulunmam gerek ve bunlar maalesef can sıkıcı olacak. İlk olarak şu anda maalesef Azure Files desteği local Storage Emülatöründe yok. O nedenle herşeyi Cloud ortamına karşı çalıştırmak zorundasınız. Bir diğer sıkıntı ise SMB desteğinin sadece storage accountun bulunduğu bölgede (region) verilmesi. Yani başka bir datacenterdaki VM'i alıp da storage accounttaki Folder Share'i bağlayamazsınız. Bu durum local bilgisayarınız için de geçerli :( Yani yukarıdaki kod REST üzerinden gittiği için bilgisayarınızdan çalıştırdığınızda sıkıntı olmayacaktır ama gidip de bu Folder Share'i kendi bilgisayarınız map etmeye kalkarsanız maalesef sonuç hüsran olacak. İşin o kısmını test etmek için benim tavsiyem Storage Account ile aynı Region'da Visual Studio yüklü bir VM provision etmeniz. İtiraf etmek gerekirse dev/testing açısından bu durum biraz kötü. En azından local emülatör desteği gelirse süper olacak.

Azure Files Folder Share VM'e
maplendi.Azure Files Folder Share VM'e maplendi.

Kod ile REST üzerinden Folder Share'i oluşturduktan sonra hemen test için bir console açıp "net use" ile yukarıdaki ekran görüntüsünde de görebileceğiniz üzere share'i VM'e mapledim. Böylece Azure Files üzerinde bir Folder Share'imiz var artık. Buraya atılan tüm dosyalar, dosya sistemi artık hem SMB hem de REST üzerinden ulaşılabilir durumda. Test sonrası "net use z: /delete" ile mapi kaldırabilirsiniz.

Web ve Worker Role'dan kullanımı?

Aslında yukarıdaki taktikten yola çıkarsak ne yapacağımı tahmin edebilirsiniz sanırım. Net Use'ü doğrudan process olarak çalıştırarak map işlemini Web veya Worker role içerisinde de yapabiliriz. Burada önemli olan nokta WebRole.cs'teki RoleStart'ta yapmamak. Aslında bu genel bir kural değil. Esas sorun Role'ünüz security context'ini elevated hale getirirseniz ortaya çıkıyor. Malum Folder Share Map'leri söz konusu user context içerisinde çalışıyor. RoleEnvironment ile Application farklı security contextlerde çalışırsa doğal olarak birbirlerinin oluşturduğu mapleri göremeyeceklerdir. Eğer Role'ün security contexti yükseltirseniz Role System hesabı ile çalışırken uygulamanız varsayılan kullanıcı hesap ile çalışır. Unutmayan Role WaIISHost.Exe tarafından host edilirken uygulama w3wp.exe tarafından host ediliyor. Bu gibi durumları engellemek için en iyisi mapleme işlemini uygulama içerisinde yapmak. Eğer her iki tarafta da diske ihtiyacınız varsa hem Role Start hem de App Start'da mapleme yapmanız şart.

[C#]

Process p = new Process();
int exitCode;
p.StartInfo.FileName = "net.exe";
p.StartInfo.Arguments = "use z: \\azurefilesdarontest.file.core.windows.net\birklasor 
                                        /u:azurefilesdarontest HhAItw2Q==";
p.StartInfo.CreateNoWindow = true;
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardError = true;
p.Start();
string error = p.StandardError.ReadToEnd();
p.WaitForExit(20000);
exitCode = p.ExitCode;
p.Close();

using (StreamWriter outfile = new StreamWriter(@"Z:\deneme.txt"))
{
    outfile.Write("Merhaba Dünya!");
}

Map işlemi bittikten sonra gördüğünüz üzere normal System.IO altındaki her şeyi bu diskte kullanabiliyorum. Artık birden çok instance, role tarafından erişilebilecek bir folder share'imiz var :) Süper! Örneğin bu diski IAAS tarafından alınmış bir VM'e mapleyip, PAAS tarafındaki role instancelarınıza da mapleyip IAAS ortamına kurulu stand-alone bir uygulama ile PAAS taki uygulamanızın birbiri ile basit bir folder share üzerinden konuşmasını sağlayabilirsiniz. Bu senaryo özellikle kodu ve mimarisi sizin yönetiminizde olmayan uygulamalarla entegrasyon için çok anlamlı olabiliyor.

REST üzerinden disk erişimi

SMB haricinde REST desteğinin de olduğundan bahsetmiştik fakat bu noktaya kadar REST üzerinden Share Folder yaratmak dışında bir şey yapmadık. REST üzerinden doğrudak diskteki tüm dosya ve klasörlere full erişim hakkınız da var. Bu seçenek özellikle uygulamanız ayrı bölge (region) içerisinde değilse süper işe yarayacaktır. Malum SMB için aynı region içerisinde olmanız şart.

[C#]

CloudStorageAccount account = CloudStorageAccount.Parse(this.connString);
CloudFileClient client = account.CreateCloudFileClient();
CloudFileShare share = client.GetShareReference("birklasor");
CloudFileDirectory rootDirectory = share.GetRootDirectoryReference();
CloudFile aCloudFile = rootDirectory.GetFileReference("deneme.txt");
Response.Write(aCloudFile.DownloadText());

Yukarıdaki kod içerisinde CloudFileShare'den root klasörü istedikten sonra artık iş CloudFileDirectory ve CloudFile objeleri ile çalışmaya kalıyor. Tüm buradaki objeler üzerinde yaptığınız işlemler doğrudan REST API'lar üzerinden gerçekleştiriliyor. O nedenle bu şekilde Azure Files'a erişen bir uygulamanınz SMB protokolüne bağımlılığı yok.

Blob mu File Share mi?

İtiraf etmem gerek eğer bu soruyu soruyorsanız kafanız epey karışmış demektir :) Ama bu çok da normal. Birincisi Azure Files'da SMB var. Bu aslında servisin çözmeye çalıştığı sorun adına çok şey anlatıyor. Buradaki amaç sadece bir storage sistemi sağlamak değil, hatta storage sistemi sağlamak da değil. Buradaki amaç Bloblar gibi inanılmaz ölçeklenebilirliliğe sahip storage yapılarını kullanamayan, migrate edilemeyen senaryolarda bir çözüm sunabilmek. Daha açıkçası, uygulamaların Cloud'a taşınmasını kolaylaştırmak ve (IAAS/PAAS) hybrid uygulama yapılarını kolaylaştırmak. Teknik karşılaştırma isterseniz eğer; bloblarda bir container 500TB olabilirken burada bir Share azami 5TB olabiliyor. Erişim olarak 60MBps storage'da blob başına gelirken Azure Files'da Share başına geliyor. Diğer yandan bloblarda esasen Directory diye bir konsept yokken burada var. Bloblarda isimler büyük, küçük harf duyarlıyken burada değil. Bloblarda snapshow var, burada yok :) Son olarak bloblarda byte başına para ödeniyor burada toplam size için.

Azure Disk ile Azure Files farkı nedir?

Azure Disk'i hatırlamayanlar için hemen ip ucu veriyim; bir VM yarattığınızda ona ataçladığınız disk bir Azure Disk. Azure Disk'ler tek bir VM tarafından kullanılabiliyorlar. Azure Files ile en büyük farklılıkları aslında bu. Diğer yandan REST üzerinden erişim şansınız da yok ama Azure Disk'ler aslında Blob'lar üzerinde yaşadığı için Snapshot özelliği var. Azure Disk'lerde en büyük disk boyutu 1TB, Azure Files'da Share boyutu 5TB. Veri erişimi hızı aynı olsa da 8KB IOps'da Azure Disk 500 verirken Azure Files 1000 veriyor.

Son olarak, yukarıdaki kodları hemen alıp test etmek isterseniz makaleyi yazarken kullandığım test kodlarını Github'a attım.

Görüşmek üzere.