Bu yazıda;

  • Azure Functions Nedir,
  • Trigger nedir?
  • Binding nedir?
  • Azure Function fiyatlandırma
  • Azure Functions Cold Start problemi
  • Visual Studio’da Azure Function oluşturma
  • Projenin Azure App’de yayınlanması konularından bahsedeceğim.

Azure Functions Nedir?

Azure Functions, küçük kod parçalarını kolayca çalıştırmamızı sağlayan, uygulama geliştirmeyi hızlandırmak ve kolaylaştırmak için oluşturulmuş ve altyapı ihtiyaçlarının tamamen Azure tarafından yönetildiği serverless bir yaklaşımdır.

Azure Functions Microsoft Azure’un sunduğu FaaS (Function as a Service) hizmetidir. Bulut altyapısı ile uygulamalarınızın yük altında ölçeklendirilmesi otomatik olarak yapılır.

Azure Funtions, tüm altyapının azure tarafından yönetildiği, geliştiricilerin sadece yazdığı kod’a odaklandığı serverless bir yaklaşımdır.

Bu yaklaşımda fonksiyonlar küçük kod parçalarından oluşur ve çalışmaları için bir tetiklemeye (Trigger) ihtiyaç duyarlar. (Örneğin: Http Endpoint, Timer, Azure Storage ve Azure Event Hub vs.) Bu tetikleyiciler bir http çağrısı olabilir, timer olabilir, Azure Storage Queue veya Servis Bus’a gelen bir queue mesajı olabilir.

State tutmayan (Stateless) bir yapıdadır. Fonkisyonların çalışması süresi kısadır (en fazla 10dk). Yalnızca Azure’un fonksiyonumuzu çalıştırdığımaya harcadığı süre için ödeme yapılır. Bu nedenle uzun sürecek işlerden ve performans’a etki edebilecek etkenlerden mümkün oldukça kaçınılmalıdır. Eğer fonsiyonunuz bekleme konumunda ise boşyere ödeme yapmazsınız. Nuget ve NPM desteği mevcuttur. İster Azure Portal üzerinden, istersek Visual Studio Code ya da Visual Studio IDE’si üzerinden fonksiyon oluşturubiliriz. Azure Function’ın güçlü özelliklerinden bir tanesi farklı dilleri destekliyor olmasıdır. Alttaki listede desteklediği dilleri ve runtime versiyonlarını inceleyebilirsiniz.

Source: https://docs.microsoft.com/en-us/azure/azure-functions/supported-languages

Azure Functions Open Source’dur. Alttaki linkten inceleyebilirsiniz.

source: codeproject.com

Trigger nedir?

Trigger’lar azure functionları çağırmak üzere yapılandırıldığı olaylardır. Function’ımızın çalışması için bir trigger’a ihtiyaç duyar ve her bir fonsiyon için bir trigger tanımlanabilir. Diğer azure servisleri ile entegre bir şekilde geliyor olması az eforla farklı sistemler arası entegrasyon yapabilmemize olanak sağlar.

Aşağıdaki trigger listesini inceleyebilirsiniz.

  • HTTP Trigger
  • Timer Trigger
  • CosmosDB Trigger
  • Blob Trigger
  • Queue Trigger
  • EventGrid Trigger
  • EventHub Trigger
  • ServiceBus Queue Trigger
  • ServiceBus Topic Trigger

Binding Nedir?

Fonksiyon içerisinden farklı Azure servislerindeki verilere bağlanabilmemizi sağlarlar. Birden fazla servise aynı fonksiyon içerisinden bağlanabiliriz. Normalde bir servise bağlabilmek için ilgili servis için kodlama yapmamız gerekir. Binding’ler sayesinde bu servislere bağlanabilmek için sadece attribute tanımlayıp bizden istenilen parametreleri girmemiz yeterli olacaktır. Bu sayede Azure servisine bağlanıp hazır nesneleri kullanarak fonksiyonlarımızda iş mantığını geliştirebiliriz.

İki türlü binding mevcut. Bunlar Input binding ve output binding olarak adlandırılır.

Input Binding’ler bağlanmış olduğumuz servis için data okuyup bunlar üzerinden işlem yapabiliriz.

Output Binding ise data’yı dışarıya ilgili servislere göndererek işlenmesidir. Ayrıca SendGrid ve Twilio gibi sistemler içinde tanımlı binding’leri kullanabilirsiniz.

Bu arada dilerseniz özelleştirilmiş (custom binding) binding extention’lar yazabilirsiniz.

Binding yapabileceğimiz örnek Azure Servisleri

  • Azure Cosmos DB
  • Azure Event Hubs
  • Azure Event Grid
  • Azure Mobile Apps
  • Azure Navigation Hubs
  • Azure Service Bus
  • Azure Storage

Binding’ler ile alakalı daha fazla bilgi için alttaki linkten inceleyebilirsiniz.

Azure Function fiyatlandırma.

Azure Function için üç tür fiyatlandırma modeli mevcuttur. Bunlar;

Consumption plan(Tüketim Plan): Bu planda kaynakların yönetimi ve hesaplanması Azure tarafından yapılır. Sadece kodun çalıştığı süre için ödeme yapılır. Kullandığımız kadar öderiz. Fonksiyon Idle durumunda iken ödeme yapılmaz.

App Service planı: Function’larınız web uygulamaları gibi sürekli çalışır. Otomatik ya da manuel ölçeklendirme yapılabilir.

Premium plan: Bu planda soğuk başlangıç problemi önlenerek sürekli yanıt veren uygulamalar geliştirmenizi sağlar. Sınırsız fonksiyonun yüretme süresi tanımlanır. (60 dakika garantili). Sanal ağ bağlantısı oluşturulmasına olanak tanır. Bu plana göre fonksiyonlarınız kullanılmasada faturalandırılma devam edecektir.

Hosting planları hakkında daha detaylı bilgi için;

Consumption plan ve Premium Plan karşılaştırılması.

Azure Function Premium Plan ile kolayca ölçeklendirme yapabilir ve Application Insights ile birlikte maliyet/performans analizi yaparak uygulamalarımızı optimize edebiliriz. Uygulamamız boşta kalsa bile gecikme olmadan tekrar çalıştırabiliriz. Virtual Network’ler oluşturarak bunlara bağlanabilir, dilerseniz erişim kısıtlaması gibi özellikleri kullanabilirsiniz.

Azure Functions Cold Start Problemi.

Uygulamalarımızın çalışması bir altyapı ihtiyacımız vardır. Azure Functions’da tüm altyapı ihtiyacı Azure tarafından sağlanır. Geliştiriciler altyapı gereksinimleri ve problemler ile ilgilenmezler. Eğer Function’larımızı Consumption plan altında çalışıyorsa ilk çalışmada birkaç saniyelik bir gecikme ile başlayacaktır. (Cold Start) Bunun sebebi Function’lar paylaşımlı bir ortamda çalışır. İlk çağrıdan sonda 20dk boyunca diğer çağrıyı beklerler. Bu süre zarfında eğer yeni bir çağrı gelmezse boşta beklemeye başlar. İlk çağrıda tekrar Cold Start durumu oluşacaktır. Eğer uygulamaya çağrı gelmiyorsa kendini offline moda’a çeker taki yeni bir çağrı gelene kadar bekler ve tekrar aktifleşir.

Soğuk bağlamanın önüne geçmek için App Service Plan ya da Premium Planı seçebilirsiniz. Unutmamalıdır ki bu planları seçtiğimizde 24 saat için seçili kaynaklarda çalışır daha fazla ödeme yapmak durumunda kalırız.

Dilerseniz Azure Function’ı dockerize ederek docker container olarakta kullanabilirsiniz.

Soğuk başlatmanın ne kadar uzun olabileceğinin ayrıntılı bir analizini bu makalede bulabilirsiniz

Visual Studio’da Azure Function oluşturma

Azure function’lar ile ilgili genel bilgilerden sonra şimdi Visual Studio’da bir function oluşturalım. Visual Studio 2019 kullanarak örneğimi oluşturacağım.

  1. Visual Studio da Azure functions projesi seçelim.

2. Bu aşamada sol bölümden fonksiyonumuzun tetikleneceği bir trigger seçmemiz gerekiyor. Seçimimize göre sağ bölümde bizden istenen bilgiler değişecektir. Bu örnekte Http Trigger’ı seçiyoruz.

3. HttpTrigger seçtikten sonra bizden bir storage account seçmemiz istenir. Örnekte local’ime kurduğum Storage Emulator’ü seçtim. Bu aşamada dilesek Browse diyerek Azure hesabızdan bir Storage Account seçebiliriz. Bunu istemesinin nedeni Fonsiyonların çalışma verileri bir storage Account’a ihtiyaç duyulur. Fonksiyon bilgileri storage account altında saklanır. Dilerseniz storage account detaylarını “Azure Storage Explorer” ile görebilirsiniz.

Aynı zamanda bizden yetki seviyesini seçmemizi ister. Bunlar Anonymous, Functions ve Admin yetki seviyeledir.

Anonymous: Fonksiyonumuzu anonim erişeme açık hale getirmek için kullanılır.

Function: Fonksiyon seviyesinde bir yetkilendirme yapmak istediğimizde kullanabiliriz. Portal üzerinden bir “Function Key” tanımlayarak fonksiyon çağrılarında bu key’i göndermemiz gerekir.

Admin: Bu seviye için “Master Key” tanımlamamız gerekir. Function yetki seviyesinden farklı olarak uygulamadaki tüm fonksiyonlara erişim sağlanır.

Örnekte Anonim yetki seviyesini seçerek ilerliyoruz.

Azure Function projesi oluşturduğumuzda yukarıdaki gibi bir yapı ile karşılaşıyoruz. Burada;

Function1.cs dosyasında seçmiş olduğumuz HttpTrigger fonksiyonu bulunmakta.
Host.json dosyasında uygulamanın genel yapılandırma ayarları bulunuyor.
local.settings.json Uygulama ayarları, bağlantı bilgileri burada tanımlanıyor..

Örnek bir Fonksiyonu inceleyecek olursak;

  1. Function Name Fonksiyonun adını tanımladığımız alan.
  2. Trigger Fonksiyonun nasıl tetiklendiğini tanımladığımız kısım. Http Trigger örneği yetkilendirme düzeyini, izin verilen HTTP yöntemlerini ve Routing içerir.
  3. Body QueryString’den gelen veriyi işlediğimiz kısım.
  4. Response Fonksiyonun yanıt döndüğü kısım.

Fonksiyonumuzu çalıştırdığımızda console’da alttaki gibi ekran ile karşılaşacağız.

Console çıktısı

Tarayıcıda ilgi fonksiyon url’ini çağırdığımızda fonksiyon tetiklenerek bize bir response dönecektir. Console’da Fonksiyon tetiklendiği için tetikleme işlemi için bir log çıktısı yükleniyor. Bu şekilde tetiklenme işleminin başarılı gerçekleştiğini buradan da kontrol edebiliriz.

Örnekte görüldüğü gibi fonksiyonumuza bir parametre gönderdik ve kod parçacığımız çalışarak bize bir çıktı üretti.

Projemizi Azure’da yayımlayalım

  1. Solution Explorer’da projeye sağ tıklıyoruz ve Publish’i seçiyoruz.
  2. Target olarak Azure’u seçelim ve devam edelim.

3. Bu ekranda bizden Fonksiyonumuzu nereye publish etmek istediğimizi soracak ve “Azure Function App (Windows)” seçerek devam edelim.

4. “Create a New Function” diyerek yeni bir fonksiyon oluşturalım. Bu aşamada ben “rg-ufuk-functionappdemo” isminde yeni bir resource ve yeni bir storage account oluşturdum. Diğer bilgileride girerek “Create” butonuna tıklıyoruz.

5. Resource oluşturma işlemi tamamlandığında Function Instance sayfasına tekrar geliyoruz ve burada Finish diyerek Publish ekranına geçiyoruz.

6. Publish sayfasında proje dosyalarını içeren paketi Azure’daki yeni Function uygulamamıza yayınlamak için Publish butonuna basarak projemizi Azure’a gönderiyoruz.

Bu ekrandan function app’imizin url’inede ulaşabilirsiniz. URL’e gittiğimizde bizi alttaki gibi sayfa karşılayacaktır.

Şimdi sıra geldi fonksiyonumuzu test etmeye. function app’in sonuna /api/function1?name=ufuk yazarak test edelim.

Evet Azure Function get istemizi gönderdiğimiz name parametresini kullanarak bir response oluşturdu ve fonksiyonumuzun çalıştığını test ettik.

Sonuç

Azure Function uygulama geliştirmeyi basitleştirerek altyapı sorumluluklarını ortadan kaldıran ve bu sayede sadece yazdığımız kod’a odaklandığımız Azure tarafından geliştirilen Serverless bir hizmettir. Bu yaklaşım uygulamalarımızın barınması için ödediğimiz sabit maliyetlerden bizi kurtatırır. Fonksiyonlarımız tetiklendiği ve çalıştığı süre için ödeme yaparız. Azure Portal ya da Visual studio ile kolayca Azure Function oluşturabilir, test edebilir ve uygulamlarımı deploy edebiliriz.

Bir sonraki makalede görüşmek üzere…

--

--

Ufuk Aytaş
Devops Türkiye☁️ 🐧 🐳 ☸️

Software Architect & Developer @CorendonDutchAirlines, Husband, Dad, Fishing, Coffee addict :) #Serverless #Cloud, #Azure, #Dotnet