hayal et, tasarla, hayata geçir



Windows Azure Blob Servisi

Microsoft’un bulut mimarisi Windows Azure platformu üzerinde veri altyapısı alışıla gelmiş yöntemlerden ziyade bize hazır sunulan veri saklama servisleri (Cloud Storage Services) üzerinden yapılmaktadır. Bu servisler bize limitsiz veri alanı, devamlı ve hızlı ulaşılabilirlik, güvenlik, internet üzerinden OS bağımsız erişim gibi önemli faydalar sağlamaktadır. Yazımızda ise bu servislerden BLOB alt yapısını beraber inceleyeceğiz.

BLOB Servisi Nedir?

BLOB (Binary Large OBject) servisi fotoğraf, video, doküman, rar dosyaları gibi herhangi bir binary verinin tutulmasını ve internet üzerinden erişilebilmesini sağlayan veri saklama alt yapısıdır. Başka bir şekilde ifade etmek gerekirse bulut üzerindeki dosya sistemi (file system) olarak da tanımlanabilir. Dolayısıyla da Türkçe’deki karşılığı damla olan blob terimi de bulut üzerindeki herhangi bir tipteki ve boyuttaki bir dosyayı temsil etmektedir. Blob servisi;

  • - Dosyaları HTTP/HTTPS üzerinden tarayıcı ile erişilebilir kılmak,
  • - CDN (Content Delivery Network) altyapısı sağlamak,
  • - Dosya tiplerinin URL ile erişimini kontrol altına almak ve yetkilendirme yapabilmek,
  • - Ses ve video streaming,
  • - Content URL rewriting,
  • - Çok yüksek boyuttaki arşivleri saklayabilmek gibi çeşitli sebeplerden ötürü tercih edilebilir.

Blob servisinin ne olduğuna kısaca değindiğimize göre bir dosyanın nasıl saklanabileceğine gelin beraber bakalım.

Blob Servisinin Kullanımı

Blob servisini kullanmaya başlamadan önce öncelikle bazı kavramlara değinmekte fayda görüyorum.

Storage Account: Tüm veri saklama servisleri için bir account bilgisine ihtiyaç duyulmaktadır. Blob dosyalarına erişim için de uygun account ile erişim sağlanmalıdır.

Container: Blob dosyalarının saklandığı ve kategorilendiği katmandır. Her bir Blob dosyasının bir Container’ı olmak zorundadır. Bir Storage Account altında sınırsız sayıda Container, bir Container altında da sınırsız sayıda Blob yer alabilir.

Blob: Yukarıda da bahsettiğimiz üzere bulut üzerinde saklanan her bir dosya blob objesidir.

Gelin basit bir dosyanın blob servisi üzerinde nasıl yönetildiğini Windows Azure Emulator ile beraber inceleyelim.

Blob Servisine Dosya Kaydedilmesi

Öncelikle projenize Microsoft.WindowsAzure.StorageClient dll’inin eklendiğinden emin olun.

Bir dosyanın blob servisine kaydedilmesi için öncelikle storage account ile bağlanılarak, eğer yoksa ilgili container yaratılmalı ve bu container’ın altına dosya yüklenmelidir.

protected void Page_Load(object sender, EventArgs e)
{
    CloudStorageAccount account = CloudStorageAccount.DevelopmentStorageAccount;
    CloudBlobClient client = account.CreateCloudBlobClient();
    CloudBlobContainer container = client.GetContainerReference("images");

    container.CreateIfNotExist();
}

Yukarıdaki kod örneğinde görüldüğü üzere emülator için gerekli olan DevelopmentStorageAccount ile bağlanılarak images adı altında bir container yaratılmıştır. Kodu çalıştırırsanız eğer bilgisayarımızda kurulu olan SQL sunucusu üzerindeki DevelopmentStorage veritabanında yer alan BlobContainer tablosunda değişikliği görebilirsiniz.

Sıra geldi blob dosyasını kaydetme kısmına. Bunun için CloudBlobContainer üzerinden bir CloudBlob nesnesi oluşturmamız gerekmektedir. Örnek kodumuzu bu duruma göre biraz daha geliştirmek gerekirse;

protected void Page_Load(object sender, EventArgs e)
{
    CloudStorageAccount account = CloudStorageAccount.DevelopmentStorageAccount;
    CloudBlobClient client = account.CreateCloudBlobClient();
    CloudBlobContainer container = client.GetContainerReference("images");

    container.CreateIfNotExist();

    CloudBlob blob = container.GetBlobReference("teamwork.jpg");
    blob.UploadFile(Server.MapPath("~/teamwork.jpg"));
}

CloudBlobContainer sınıfındaki CreateIfNotExist metodunu çağırmamızdan ötürü kodu tekrar çalıştırsanız dahi aynı isimdeki container yeniden yaratılmayacaktır. Daha sonrasında ise CloudBlob sınıfı kullanılarak sunucudaki bir görsel blob servisine yüklenmiştir. Gene Azure için yaratılmış olan veritabanına baktığımızda Blob tablosunda ilgili dosyanın kaydının atandığını görebilirsiniz. Dosyanın kendisi ise binary halinde BlockData tablosunda yer almaktadır.

Blob Servisindeki Dosyalara Erişim

Blob servisindeki bir dosyaya tarayıcı üzerinden URL ile erişlebildiği gibi kod tarafından da Blob nesnesini bularak ihtiyacımız olan URL bilgisini alabiliriz. Kod tarafında erişebilmek için dosyanın container adı ve blob adı bilinmelidir. Blob nesnelerinin URL bilgisi ise belirli bi standarda göre oluşturulur. Bu URL emülatör kullandığımız için aşağıdaki formatta olmaktadır.

http://127.0.0.1:10000 / storage account / container / blob

Dolayısıyla da az önce yüklediğimiz görselin blob servisindeki adresi aşağıdaki gibidir;

http://127.0.0.1:10000/devstoreaccount1/images/teamwork.jpg

Buradaki localhost üzerindeki 10000 portu üzerinden dinleyen uygulama Storage Emulator tarafından başlatılmış olan Blob servisidir. Storage Emulator arayüzünü tray üzerindeki Windows Azure ikonuna tıklayarak açabilirsiniz. Storage Emulator açıldığında servislerin portları görülebilir ve arzu edildediği taktirde servisler buradan açılıp kapatılabilir.

Şimdi tekrar kod tarafına geri dönelim ve aşağıdaki örnek kod üzerinde daha önceden yüklediğimiz blob dosyasına tarayıcı tarafından erişmeyi deneyelim. Burada ihtiyacımız olan bilgiler container ve blob isimleridir;

protected void Page_Load(object sender, EventArgs e)
{
     CloudStorageAccount account = CloudStorageAccount.DevelopmentStorageAccount;
     CloudBlobClient client = account.CreateCloudBlobClient();
     CloudBlobContainer container = client.GetContainerReference("images");

     container.CreateIfNotExist();

     CloudBlob blob = container.GetBlobReference("teamwork.jpg");

     Response.Redirect(blob.Uri.ToString());
}

Fakat bu kod çalıştırıldığında “ResourceNotFound” şeklinde bir hata alınmaktadır. Bu hatanın sebebi ise container üzerinde gerekli yetkilendirilmenin yapılmamasından kaynaklanmıştır.

Bu işlem için Container üzerindeki izinler gözden geçirilmelidir. Bu aşamada yetkilerden Blob yetkisini vermemiz şimdilik yeterli olacaktır.

protected void Page_Load(object sender, EventArgs e)
{
    CloudStorageAccount account = CloudStorageAccount.DevelopmentStorageAccount;
    CloudBlobClient client = account.CreateCloudBlobClient();
    CloudBlobContainer container = client.GetContainerReference("images");

    container.CreateIfNotExist();

    BlobContainerPermissions permissions = container.GetPermissions();
    permissions.PublicAccess = BlobContainerPublicAccessType.Blob;
    container.SetPermissions(permissions);

    CloudBlob blob = container.GetBlobReference("teamwork.jpg");

    Response.Redirect(blob.Uri.ToString());
}

Uygulamaızı bu şekilde çalıştırdığımız taktirde görselin tarayıcı üzerinden erişilebilir olduğunu görebiliriz. Bir Container altındaki tüm blob dosyalarına erişmek istersek ise CloudBlobContainer sınıfının ListBlobs metodu imdadımıza yetişmektedir.

protected void Page_Load(object sender, EventArgs e)
{
    CloudStorageAccount account = CloudStorageAccount.DevelopmentStorageAccount;
    CloudBlobClient client = account.CreateCloudBlobClient();
    CloudBlobContainer container = client.GetContainerReference("images");

    container.CreateIfNotExist();

    CloudBlob blob = container.GetBlobReference("teamwork.jpg");
    blob.UploadFile(Server.MapPath("~/teamwork.jpg"));

    BlobContainerPermissions permissions = container.GetPermissions();
    permissions.PublicAccess = BlobContainerPublicAccessType.Blob;
    container.SetPermissions(permissions);

    ImagesRepeater.DataSource = container.ListBlobs();
    ImagesRepeater.DataBind();
}
<asp:Repeater ID="ImagesRepeater" runat="server">
    <ItemTemplate>
        <asp:Image runat="server" ImageUrl='<%# Eval("Uri") %>' />
    </ItemTemplate>
</asp:Repeater>

Eğer bir blob dosyasını silmek istersek CloudBlob sınıfındaki Delete veya DeleteIfExists metotlarını kullanabiliriz.

CloudStorageAccount account = CloudStorageAccount.DevelopmentStorageAccount;
CloudBlobClient client = account.CreateCloudBlobClient();
CloudBlobContainer container = client.GetContainerReference("images");

CloudBlob blob = container.GetBlobReference("teamwork.jpg");

blob.Delete();
//veya
blob.DeleteIfExists();

Şimdilik bu yazımızın sonuna geldik. İlerleyen yazılarda Blob servisini daha detaylı inceleyip diğer storage servislerini de bir göz atacağız. Herkese bol bulutlu günler…



1 Yorum


  1. Serkan Yazıcıoğlu | Windows Azure Blob Arayüzü

    [...] Bir önceki yazımızda Blob servisine kısa bir giriş yapmıştık. Bu yazıyı okumak isterseniz tıklayınız. [...]

    Oca 06, 2012 @ 09:20

Yanıtla



SON YAZILARIM

genel
Bulut Bilişim (Cloud Computing) Nedir

Burada anlatılan hikayedeki kişi ve kurumlar tamamen hayal ürünüdür.

Sene 1995'de ilk...

genel
Microsoft Türkiye Açık Akademi

Microsoft tarafından Türkiye'deki ilk ücretsiz online yazılım okulu Açık Akademi açıldı....

genel
Windows Azure Blob Arayüzü

Bir önceki yazımızda Blob servisine kısa bir giriş yapmıştık. Yazıyı okumak isterseniz