Azure Functions Serisi #17 – Blob Trigger

Merhaba,

Azure Function yazı serisinin onyedinci makalesinde trigger’lar arasında en çok kullanılanlardan biri olan Blob Trigger üzerine odaklanacak, teorik ve pratik olarak tüm detaylarıyla ele alacağız.

Blob Trigger Nedir?

Blob trigger’ın ne olduğunu anlamak için tabi ki de Blob’un ne olduğunu anlamak gerekmektedir. PDF, Image, MP3 vs. gibi yapılandırılmamış tüm dosyalara blob denmektedir. Azure Storage’lardan Blob Storage makalesini okursanız eğer ilgili konuya dair daha detaylı bilgi edinebilirsiniz.

Blob Trigger Oluşturma

Blob Trigger’ı Visual Studio üzerinden aşağıdaki gibi oluşturabilirsiniz.
Azure Functions Serisi #17 - Blob Trigger
Sağ taraftaki alanları sırasıyla izah edersek eğer;

  • Storage Account(AzureWebJobsStorage)
    Blob Trigger’ın kullanacağı Azure Storage account’unu seçiniz.
  • Connection string setting name
    Kullanılacak Azure Storage’ın connection string değerini giriniz. Eğer boş geçersek default olarak local emulator’de ki storage’a bağlantı sağlanacaktır.
  • Path
    Blob Storage’da oluşturulacak container’ı belirtiniz.

İlgili alanlar doldurulup uygulama oluşturulduğu zaman aşağıdaki gibi bir function’la karşılaşılmaktadır.

    public static class Function1
    {
        [FunctionName("Function1")]
        public static void Run([BlobTrigger("samples-workitems/{name}", Connection = "AzureWebJobsStorage")]Stream myBlob, string name, ILogger log)
        {
            log.LogInformation($"C# Blob trigger function Processed blob\n Name:{name} \n Size: {myBlob.Length} Bytes");
        }
    }

Yukarıdaki function kodlarını incelersek eğer ‘AzureWebJobsStorage’ connection string’i üzerinden bağlantı gerçekleştirilmekte ve ilgili Blob Storage’da olması beklenen ‘samples-workitems’ isimli container bu function tarafından dinlenmektedir. Ne zaman bu container’a bir dosya atılacak o zaman bu function tetiklenecek ve ekrana ilgili log’u basacaktır. Tabi function’ı özelleştirdiğiniz taktirde yaptığınız iş her ne ise o icra edilmiş olacaktır.

Uygulamayı hiç dokunmadan derleyip, ayağa kaldırdığımızda ‘samples-workitems’ isimli container’ı manuel olarak oluşturup test ettiğimiz vakit aşağıdaki gibi çalışma gözlenecektir…
Azure Functions Serisi #17 - Blob Trigger

Blob Trigger’da Belirli Uzantılı Dosyaları Dinlemek

Blog Trigger’da container’a yüklenen her dosyadan ziyade sadece belirli uzantılı dosyaların dinlenilmesini ve sadece o dosyalarda tetiklenmesini istiyorsanız eğer container’ın bildirildiği parametrede ‘name’ parametresinin uzantısını aşağıdaki gibi bildirmeniz gerekmektedir.

"samples-workitems/{name}.{extension}"

Örneğin aşağıdaki fonksiyonu incelerseniz eğer;

    public static class Function1
    {
        [FunctionName("Function1")]
        public static void Run([BlobTrigger("samples-workitems/{name}.jpg", Connection = "AzureWebJobsStorage")]Stream myBlob, string name, ILogger log)
        {
            log.LogInformation($"C# Blob trigger function Processed blob\n Name:{name} \n Size: {myBlob.Length} Bytes");
        }
    }

görüldüğü üzere sadece .jpg uzantılı dosyalarda tetiklenecektir.
Azure Functions Serisi #17 - Blob Trigger

Output Blob Binding İle Resim Resize Edelim

Şimdi Blob Trigger’ı kullanarak Output Blob Binding ile resim resize edecek örnek bir uygulama geliştirelim. Senaryo olarak, x container’a yüklenen herhangi bir resim dosyasının resize edilmiş halini farklı bir y container’ına depolayan ve böylece ana uygulamanın işlem maliyetini arttırmamak için bu işlemi blob trigger ile sağlayan bir function geliştireceğiz.

Resim resize işlemi için Six Labors kütüphanesini kullanabilirsiniz. Bknz : Github
Azure Functions Serisi #17 - Blob Trigger

    public static class Function1
    {
        [FunctionName("Function1")]
        public async static Task Run([BlobTrigger("images/{name}", Connection = "AzureWebJobsStorage")] Stream myBlob, string name, ILogger log,
            [Blob("resize-images/{name}", FileAccess.Write, Connection = "AzureWebJobsStorage")] Stream outputBlob)
        {
            //Gelen blob'un formatı algılanıyor.
            IImageFormat format = await Image.DetectFormatAsync(myBlob);
            //Blob resize ediliyor.
            Image resizeImage = await Image.LoadAsync(myBlob);
            resizeImage.Mutate(i => i.Resize(200, 200));
            //Ve Output Blob Storage'a önceden tespit edilen formatıyla birlikte kaydediliyor.
            resizeImage.Save(outputBlob, format);
            log.LogInformation("Resim başarıyla resize edilmiştir.");
        }
    }

Yukarıda geliştirilen function’ı incelerseniz eğer ‘images’ container’ının içerisine herhangi bir image dosyası yüklendiğinde ilgili blob trigger tetiklenecek ve ‘resize-images’ isimli bir başka container içerisine ilgili dosyanın 200×200 px’lik boyutlandırılmış hali eklenecektir.
Azure Functions Serisi #17 - Blob Trigger

Container’a Bind Olma

Yukarıdaki örneğimizde Output Blob Binding ile bir Stream alarak tek bir blob üzerinden çalışma sergiledik. İstersek bir container alabilir ve hatta o container’ın var olup olmadığını doğrulayabilir ve kullanabiliriz. Şöyle ki;

    public static class Function1
    {
        [FunctionName("Function1")]
        public async static Task Run([BlobTrigger("images/{name}", Connection = "AzureWebJobsStorage")] Stream myBlob, string name, ILogger log,
            [Blob("resize-images", Connection = "AzureWebJobsStorage")] CloudBlobContainer cloudBlobContainer)
        {
            IImageFormat format = await Image.DetectFormatAsync(myBlob);
            CloudBlockBlob cloudBlockBlob = cloudBlobContainer.GetBlockBlobReference($"{Guid.NewGuid()}.{format.FileExtensions.First()}");
            Image resizeImage = await Image.LoadAsync(myBlob);
            resizeImage.Mutate(i => i.Resize(200, 200));
            using MemoryStream memoryStream = new MemoryStream();
            resizeImage.Save(memoryStream, format);
            memoryStream.Position = 0;
            await cloudBlockBlob.UploadFromStreamAsync(memoryStream);
            log.LogInformation("Resim başarıyla resize edilmiştir.");
        }
    }

Yukarıdaki kod bloğunu incelerseniz eğer; ‘Blob’ attribute’unun ‘blobPath’ parametresinden ‘name’ parametresi kaldırılmıştır. Ayrıca container’a bağlantı sağlanacağından dolayı ‘FileAccess.Write’ komutuda kaldırılmıştır. İlgili attribute tarafından Stream yerine ‘CloudBlobContainer’ türünden bir değer işaretlenmekte ve böylece ‘resize-images’ container’ına bind olunmaktadır. 8. satırda random bir isimde block blob oluşturulmaktadır. 11. satırda ise gelen ve resize edilen blob’u memory’e atacak olan bir ‘MemoryStream’ oluşturulmuştur. En nihayetinde 14. satırda memory’de ki resize edilmiş data upload edilmektedir.

Böylece Stream’e nazaran container üzerinden birden fazla blob oluşturularak işlenebilme şansı elde edilmektedir.

İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…

Bunlar da hoşunuza gidebilir...

1 Cevap

  1. 27 Ağustos 2020

    […] Azure Functions Serisi #17 – Blob Trigger […]

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

*