Windows Azure Blob Storage

Blob storage

DropBox, Skydrive gibi uygulamaları büyük bir ihtimalle herkes biliyordur. İnternet üzerinden dosyalarınıza depolama ve bu dosyalara istediğiniz zaman istediğiniz yerden ulaşabilme imkanı sunuyorlar. Microsoft’un bulut teknolojisi Windows Azure’da bu gibi dosya depolama aracı olarak BLOB servisini Azure Platformu üzerinden hizmete sunmaktadır. BLOB, Binary Large Object kelimelerinden türetildiği söylensede benimde yeni öğrendiğim bir efsanesi bulunmaktaymış. Efsane şudur ki, Blob fikri ilk olarak Jim Starkey tarafından ortaya atıldıktan sonra ismini Basic Large Object olarak anılmasını sağlamış ancak Apollo Bilgisayar firmasında pazarlamacı olarak görev yapan Terry McKiever tarafından geliştirilerek Binary Large Object ismine kavuşan BLOB kelimesi 1988 yapımı olan ve yönetmenliğini Chuck Russel’ın üstlendiği  “The Blob” filminden almaktaymış.

Blob hakkında tarihsel bilginin ardından biraz daha teknik bilgiyle devam edebiliriz. Web üzerinden File System hizmeti sağlayan blob storage alt yapı olarak bize çeşitli imkanlar sunmaktadır. Resim, Video, Müzik hatta .Rar dosyalarınızın Blob servisi aracılığı ile Bulut üzerinde depolanmasını sağlayabilirsiniz. Bunun yanında depoladığınız Binary dosyalarınız üzerinden URL belirleyebilir bu URL’i yetkilendirebilir ve yönetebilirsiniz. Dosyalarınıza HTTP/HTTPS üzerinden erişimi sağlayacağınız gibi varsa CDN altyapınız için gerçekten işlevsel bir özelliğe sahip olursunuz.  Verilerinizin güvenliği olarak Windows azure storage hesabınızda oluşturduğunuz her dosyadan 3 adet kopya oluşturmakta. bu dosyalardan 1 tanesi Data Center’dan bağımsız bir noktada tutulmakta. Böylece verilerinizin kaybı ihtimali sıfıra indirgenmeye çalışılmış.

WindowsAzureBlobStorageConcepts

Blob yapısına göz attığımız zaman. Size Windows azure üzerinden bir storage hesabı oluşturmanız istenmekte. Bu hesaba bağlı olarak oluşturduğunuz storage yapısı içerisinde bir Container bulunması gerekmekte ve bu Container içerisinde sizin yükleyeceğiniz verileriniz barınacaktır. Yüklediğiniz ver data Block halinde 3’er kopya şeklinde güvenli bir biçimde dağıtılmaktadır. Yukarıdaki resimde daha detaylı gözükmektedir.

Konuya ilişkin kısa bir demo gerçekleştirebiliriz. Bunun için Visual Studio üzerinden yeni bir Cloud Project oluşturarak ve Web Role seçeneğini işaretleyerek devam ediyoruz.

Capture

Projemizi oluşturduktan sonra Management Portal üzerinden yeni bir Storage Oluşturmamız gerekmekte ve bu Storage ile Cloud Projemiz arasında ufak Config ayarları gerçekleştireceğiz. Management Portal üzerinden storage oluşturduktan sonra Projemizin içerisinde bulunan Cloud projesinin içerisinde bulunan Roles dosyası içerisindeki WebRole1 sağ tık ve properties diyerek açılan pencereden Settings kısmına giriş yapıyoruz.

Açılan Settings Sayfasında Configuration ayarlarını göreceksiniz. İlk olarak herhangi bir Connection String eklenmediği için sadece UseDevelopmentStorage kısmını göreceksiniz.

Capture

Add Setting kısmına tıklayarak Yeni bir Connection String ekliyoruz. Value kısmındaki textbox kısmına tıklayarak Hali hazırdaki Windows Azure hesabımıza bağlı olan Storage’ı tanımlıyoruz.

Capture

Mavi ile yazılmış olan Download Publish Settings kısmına tıklayarak Azure hesabınıza ait ayarların içerildiği dosyayı indirerek import kısmından tanımlayabilirsiniz. Account Name kısmına bağladığınız hesabın içerisinde oluşturduğunuz storage ismini seçiyoruz. Böylece Preview Connection String kısmında bize oluşturduğu Connection String’i görebiliriz. Bu işlemleri tamamladıktan sonra sayfayı kaydederek kapatıyoruz.

Peki bu işlem ile tam olarak ne yaptık. Solution Explorer kısmındaki cloud projesi içerisinde 2 adet dosya göreceksiniz bu dosyalar .csdef ve .cscfg uzantılı dosyalar. Oluşturduğumuz Web Role projemizin içerisinde Azure hesabımıza ait Connection String aracılığı ile Azure’da bulunan Storage ile bağlantı kurulmasını sağladık. Dosya içerisine girdiğiniz zaman Key ve Value değerleri içerisinde connection string kodlarını görebilirsiniz.

Asp.projemiz içerisindek Default.aspx sayfasına aşağıdaki şekilde basit bir tasarım giydiriyoruz. Bunun için dosyalarımızı yüklememiz için gerekli olan fileUpload kontrolü ve bunu upload butonu. Ayrıca Oluşturduğumuz klasörü (Container) silmek amacıyla bir delete butonu ve son olarak yüklediğimiz Blob’ların listesini görmek amacıyla bir grid view oluşturarak mükemmel tasarımcılığımızı sonlandırıyoruz.

Capture

Tasarım aşamasından sonra yukarıda daha önce oluşturduğumuz Connection kısmının codebehind kısmını tamamlayalım. Web Role 1 Projesi altında bulunan WebRole.cs dosyası içerisinde projemiz çalışmaya başladığında tetiklenecek olan onStart metodunu görebilirsiniz. Burada Connectionstring ile Account bağlantısını gerçekleştiriyoruz ve daha sonrasında yeni bir BlobClient oluşturduktan sonra bu blob içerisine Container açıyoruz. Ancak proje her seferinde çalışınca sürekli container oluşturmaması için ufak bir kontrol metodu yardımıyla eğer bu container yoksa oluştur diyerek bu kısmı tamamlıyoruz.

public override bool OnStart()
        {
            CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
            CloudConfigurationManager.GetSetting("ConnectionString"));

            CloudBlobClient objClient = storageAccount.CreateCloudBlobClient();

            CloudBlobContainer objContainer = objClient.GetContainerReference("mycontainer");

            objContainer.CreateIfNotExists();

            objContainer.SetPermissions(new BlobContainerPermissions
            { PublicAccess = BlobContainerPublicAccessType.Blob });

            return base.OnStart();
        }

Account ile bağlantıyı gerçekleştirdikten sonra Default.Aspx kısmında oluşturduğumuz tasarımın codebehind tarafını yazabiliriz. İlk olarak dosyalarımızı upload etmek için upload butonunun click event’i içerisine ilerliyoruz. Burada CloudStorageAccount ile tekrar bir ilişkilendirme sağladıktan sonra CloudBlobClient oluşturuyoruz. Böylece Blob için oluşturduğumuz Account içerisinde Blob için bir yer ayrılması gerektiğini ifade ediyoruz. blob içerisinde verilerimizin barınacağı CloudBlobContainer ile oluşturduktan sonra bu blobların daha öncede bahsettiğim gibi 3er adet kopyalarının tutulacağı Block’lar haline getiriyoruz.

Dosyayı kaydederken ben biraz farklı bir yol ilerliyorum path olarak vereceğim yol yerine dosyayı upload etmeden önce ilk olarak C:/ içerisinde bir kopyasını alıyorum. Daha sonra C:/ içerisinde bulunan dosyanın path’i ile kaydediyorum. Eğer bu işlem sırasında herhangi bir sıkıntı yaşanmadan upload işlemi gerçekleşirse C:/ içerisinde oluşturduğum kopyaya artık ihtiyacım kalmıyor ve bunuda kod ile kaldırıyorum.

protected void Button1_Click(object sender, EventArgs e)
        {
            CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
            CloudConfigurationManager.GetSetting("ConnectionString"));

            CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

            CloudBlobContainer container = blobClient.GetContainerReference("mycontainer");

            CloudBlockBlob blockBlob = container.GetBlockBlobReference(FileUpload1.FileName);

            FileUpload1.SaveAs(@"C:/" + FileUpload1.FileName);

            using (var fileStream = System.IO.File.OpenRead(@"C:/" + FileUpload1.FileName))
            {
                blockBlob.UploadFromStream(fileStream);
            }

            FileInfo myfileinf = new FileInfo(@"C:/" + FileUpload1.FileName);
            myfileinf.Delete();
        }

Upload işlemi tamamlandıktan sonra gridview içerisine yüklediğimiz Blobların listesiniz çekebiliriz. Bu işlem için Azure tarafından, yüklediğimiz her blob için bir URL tanımlanmakta ve bize

https://%5BAccount Name].blob.core.windows.net/[Container Name]/[Blob Name]

Şeklinde bir URL döndürmektedir. Bizde Listelediğimiz zaman bu url şeklinde bir listeyi gridview içerisine bastırıyor olacağız. Bu işlem için bir metod oluşturuyoruz ve upload işleminde yaptığımız gibi StorageAccount, BlobClient, BlobContainer işlemlerini tekrarlıyoruz. Daha sonra bir foreach yardımıyla containeri çerisinde bulunan blobları döndürerek BlockBlob içerisinden çekiyoruz. Çektiğimiz her bir blob’a ait olan url’li oluşturduğumuz List içerisine doldurduktan sonra bu list’i gridview’in datasource’una tanımlıyoruz.

public void ListBlobs()
        {
            CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
            CloudConfigurationManager.GetSetting("ConnectionString"));

            CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

            CloudBlobContainer container = blobClient.GetContainerReference("mycontainer");

            var list = new List<string>();

            foreach (IListBlobItem item in container.ListBlobs(null, false))
            {
                if (item.GetType() == typeof(CloudBlockBlob))
                {
                    CloudBlockBlob blob = (CloudBlockBlob)item;

                    var blobUrl1 =blob.Uri.ToString();

                    list.Add(blobUrl1);
                }
            }
            gdvContainer.DataSource = list;
            gdvContainer.DataBind();
        }

Listeleme işlemi tamamlandıktan sonra projenin load event’i esnasında postback kontrolü içerisinde metodumuzu çağrıyoruz ve proje açıldığı anda liste içerisinde daha önceden yüklediğimiz Blobları görebiliriz.

protected void Page_Load(object sender, EventArgs e)
        {
            if (this.IsPostBack == false)
            { ListBlobs(); }
        }

Ufak bir not olarak gridview column name olarak bize “Item” olarak döndürülecektir. bunu değiştirmek için gridview’ın event’leri arasından RowDataBound’u seçerek column adını değiştirebiliriz.

protected void gdvContainer_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.Header)
            {
                for (int i = 0; i < e.Row.Cells.Count; i++)
                {
                    e.Row.Cells[i].Text = e.Row.Cells[i].Text.Replace("Item", "Blob URL Adress List");
                }
            }
        }

Ve sonuç olarak projemizi çalıştırdığımızda listemizi aşağıdaki gibi görebiliriz.

Dip Not : Yüklediğiniz her blob nesnesini Management Portal üzerinden Storage sekmesi altındaki Storage Accountlarınızın altında bulunan Container kısmında bulabilirsiniz ve portal üzerinden de bloblarınızı yönetebilirsiniz.

CaptureSon olarak yüklediğimiz blobları içeren container’ı kaldırmak istediğimiz zaman aşağıdaki gibi bir kod bloğuyla kolayca halledebiliriz. Delete All Blobs butonunun click eventi altına ;

protected void Button3_Click(object sender, EventArgs e)
        {
            CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
            CloudConfigurationManager.GetSetting("ConnectionString"));

            CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

            CloudBlobContainer container =
            blobClient.GetContainerReference("mycontainer");
            container.Delete();
        }

Böylece daha önceki yazılarımda bulunan Table Storage ve Queue Storage örnekleri ile beraber Blob storage kavramıylada bu başlığı tamamlamış bulunuyorum. Herkese kolay gelsin …


Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Google fotoğrafı

Google hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Connecting to %s