Azure Functions Nedir?
Merhaba,
Bu yazıda Microsoft Azure Functions yazı dizisinin ilki olan Azure Functions nedir ve nasıl oluşturulur konularını ele alacağız. Yazı dizisine ait tüm yazılar için Azure Functions – Index ‘e göz atabilirsiniz.
Azure Functions, Function as a Service (FaaS) olarak adlandırılan ve serverless mimaride çalışan bir Azure hizmetidir. Diğer cloud-provider ‘lar da farklı isimler ile benzer çözümler bulunmaktadır.
Bir trigger (tetikleyici) tarafından tetiklenen ve event-based olarak çalışan kod parçalarıdır. Her bir iş için ufak kod blokları geliştirip, bunları birbirine bağlayabiliriz. Başta .NET C# olmak üzere, F#, Java, Python, JavaScript gibi temel dilleri desteklemektedir. Bu sayede farklı uzmanlık alanlarında olan kişiler bu hizmeti kullanabilir, ayrıca farklı ekiplerde birbirinden bağımsız stack ‘ler ve farklı diller kullanarak aynı proje için kod geliştirebilir.
Azure Functions Oluşturma
Başta Azure Portal olmak üzere Microsoft Visual Studio ve Microsoft Visual Studio Code üzerinden de gerekli add-on ‘lar sayesinde Azure Functions oluşturabilir, bunları deploy edebiliriz. Bu yazıda Azure Portal üzerinden ilerleyeceğiz, diğer yöntemler için farklı yazılar hazırlamayı düşünüyorum.
Azure Portal ‘e girdiğinizde ana ekranda arama kutusunu kullanarak ya da Create a resource butonu ile oluşturma işlemine başlayabilirsiniz. Burada Compute başlığı altında Function App seçerek ilerliyoruz.
Basic
İlk aşamada Azure Functions ‘ı oluşturacağımız Azure Subscription (Abonelik), Resource Group bilgilerini seçmemiz gerekiyor, eğer herhangi bir Resource Group kaydınız yoksa yönlendirmeleri izleyerek yeni oluşturabilirsiniz.
Function App name, Azure Functions ‘a erişim sağlayacağımız url bilgisidir, benzersiz / tekil bir değer olmalı. İsimlendirme konusu elbette size kalmış bir durum, fakat Microsoft ‘un Azure Resource ‘lar için genel olarak yayınladığı isimlendirme kurallarına göz atmanızı tavsiye ederim, https://docs.microsoft.com/en-us/azure/cloud-adoption-framework/ready/azure-best-practices/resource-naming adresinden ulaşabilirsiniz.
Publish bölümünde yer alan Code ve Docker Container ise uygulamamızın nasıl deploy edileceği ile ilgili ayarlar.
Runtime Stack ve Version ayarları geliştirme yapacağımız dil / teknoloji belirlememizi sağlıyor.
Region ise Azure Functions ‘ın deploy edileceği bölgeyi belirtmekte, projenizin kapsamına göre bunu istediğiniz gibi seçebilirsiniz. Eğer sadece Türkiye ‘de hizmet vermeyi düşünüyorsanız West Europe en iyi tercih olacaktır.
Hosting
Hosting sekmesinde, Azure Functions için bir Storage Account, Operating System ve Plan seçimlerini yapmamız gerekiyor.
Azure Functions ‘lar hem deployment kodlarının saklanması hem de operasyonel işlemler için kullanılmak üzere bir Storage Account ‘a ihtiyaç duyarlar. Bu sayede BLOB Storage, Table Storage ve Queue gibi çeşitli hizmetleri Azure Functions içinden direkt olarak kullanabilirsiniz. Microsoft ‘un performans açısından önerisi her bir Azure Functions için bağımsız bir Storage Account kullanmamız yönünde.
Aynı zamanda Azure Functions içinde farklı Storage Account ‘lar ile işlemler yapabilirsiniz ya da bu Storage Account ‘ları trigger olarak kullanabilirsiniz. Detaylı bilgi için https://docs.microsoft.com/en-us/azure/azure-functions/storage-considerations adresini inceleyebilirsiniz.
Operating System, Azure Functions ‘ın host edileceği sunucuların işletim sistemi. İhtiyacınıza uygun olarak Linux ya da Windows seçebilirsiniz.
Plan ise Azure Functions ‘ın çalışma zamanında kullanacağı hosting plan bilgisidir. Bu yazıyı hazırladığım tarihte 3 farklı hosting plan seçeneği bulunmakta. Fiyatlandırma detayları için https://azure.microsoft.com/en-us/pricing/details/functions adresine bakabilirsiniz.
Consumption Plan : Azure Functions için default hosting plan seçeneği Consumption Plan ‘dır. Bu plan sayesinde sadece kullandığımız kadar ödeme yaparız (Pay As You Go) ve kullanım sırasında oluşan yüke göre Azure Functions otomatik olarak scale olur, başka bir değişle anlık olarak ihtiyaç duyulan sunucu kaynaklarına göre otomatik olarak arttırım sağlanır. Bu sayede beklediğimizin üzerinde bir yük geldiğinde endişelenmemize gerek kalmaz, Azure bunu otomatik olarak yeni bir sunucuda yayına alır ve gelen request yükünü otomatik olarak dağıtır.
Consumption Plan ‘da çalışan Azure Functions ‘lar ilk istek yapıldıktan 20 dakika boyunca aktif durumda (warm) kalıyor, bu süre içinde başka bir istek gelmezse kendini kapatıyor ve idle moda geçiyor. Bu nedenle uzun bir zaman sonra ilk istek oluştuğuna yanıt süresi biraz zaman alıyor, çünkü Azure arka planda Azure Functions ‘ı yeniden çalıştırıyor ve bu aşamada biraz zaman kaybediyor. Bu işlem cold-start olarak isimlendirilmekte, konu hakkında teknik analiz ve öneriler içeren yazılar için aşağıdaki bağlantılara göz atmanızı öneririm.
- https://azure.microsoft.com/en-us/blog/understanding-serverless-cold-start
- https://markheath.net/post/avoiding-azure-functions-cold-starts
- https://mikhail.io/serverless/coldstarts/azure
- https://microsoft.github.io/AzureTipsAndTricks/blog/tip260.html
Elbette serverless / consumption bazlı bir mimaride sürekli olarak uptime gerektiren bir uygulamanız varsa Consumption Plan doğru bir seçenek olmayacaktır.
Consumption Plan kapsamında aylık olarak 1 milyon request için ücret ödemiyorsunuz. Yani bireysel ya da ufak çaplı PoC projeler için kullandığınızda neredeyse tamamen ücretsiz bir hizmet kullanmış oluyorsunuz. Sadece Storage Account için bir ücret oluşuyor, bu da kullanım yoğunluğuna göre aylık 5-10 TL civarında olacaktır.
Bir diğer seçenek Premium Plan, Microsoft ‘un tabiriyle “pre-warmed workers” ve “always ready instances” kullanarak bizi cold-start sorunundan kurtarmakta. Bunun dışında Virtual Network gibi gelişmiş özellikleri desteklemekte. Sürekli çalışan ve yüksek CPU kullanımı gerektiren Azure Functions ‘lar bu planı tercih edebilirsiniz. Daha detaylı bilgi için https://docs.microsoft.com/en-us/azure/azure-functions/functions-premium-plan adresine bakabilirsiniz.
Son seçenek ise Dedicated Plan olarakta adlandırılan App Service Plan ‘dır. Bu plan kapsamında Azure Functions ‘lar dedicated bir sanal sunucuda host edilirler. Aynı Azure AppService / WebApp ‘lerde olduğu için bir App Service Plan dahilinde çalışmakta ve bu planın tüm özelliklerinden yararlanmaktadır. Hem manuel hem de auto-scale özelliği ile scaling işlemi yapabilirsiniz. Daha detaylı bilgi için https://docs.microsoft.com/en-us/azure/azure-functions/dedicated-plan adresine bakabilrisiniz.
Monitoring
Bu bölümde Application Insights ‘ı aktif hale getirip Azure Functions ‘ın detaylı bir şekilde izlenmesini sağlayabiliriz. İlk aşamada oluşturmanız zorunlu değildir, daha sonra Azure Functions ‘ın özelliklerinden aktif hale getirebilirsiniz.
Tags
Bu bölüm zorunlu olmamakta birlikte, Azure hizmetlerinizi profesyonel olarak gruplamak – izlemek istediğinizde etiketleri kullanabilirsiniz.
Review + Create
Son aşamada ise önceki adımlarda girmiş olduğumuz tüm bilgileri özet olarak görebiliri ve hepsinin doğru olduğunu teyit ettikten sonra Create butonuna basarak Azure Functions ‘ı oluşturabiliriz. Birkaç dakika içinde hazır oluşturulacaktır, Go to Resource butonu ile Azure Functions ‘ın detayına gidebiliriz.
Azure Functions Detayları
Azure Functions ekranında menüler ile istediğiniz / ihtiyacınız olan işlemleri yapabilirsiniz. Ben genel olarak en çok ihtiyacımız olanları açıklayacağım.
Overview sekmesinde Azure Functions ile ilgili genel detaylara ulaşabiliriz. Bu ekranda yer alan URL bilgisini kullanarak Http Trigger olarak yazılmış bir Azure Functions ‘ı tetikleyebiliriz.
Functions
Bu aşamaya kadar oluşturduğumuz Azure Functions aslında bir container olarak düşünülebilir. Bunun içine bir ya da birden fazla Function ekleyebiliriz. Mevcut Function ‘lar aşağıdaki gibi listelenmektedir.
Bu aşamada Add butonu ile Azure Portal üzerinden bir Function ekleyebilir ya da Visual Studio, Visual Studio Code gibi IDE ‘lerde hazırladığımız kodları deploy edebiliriz.
Development environment seçeneklerinden istediğimizi seçerek ilerleyebiliriz. Seçilen environment bilgisine göre farklı yönlendirmeler sağlanmakta. Bu yazının konusu IDE development olmadığı için ben “Develop in portal” seçeneği ile ilerleyeceğim, amaç sadece yeni bir Function oluşturmak.
Bir Functions oluşturmak için öncelikli olarak bir trigger seçmemiz gerekiyor, bu sayede yazmış olduğumuz Functions tetiklenecek ve kodlarımız çalışacaktır.
Basit olması için HTTP Trigger örneği ile ilerleyeceğim, bu sayede Azure Functions ‘a HTTP üzerinden GET / POST işlemleri ile ulaşabilir ve Function içinde yer alan kodların çalışmasını sağlayabilirim. Trigger ‘lar hakkında detaylı bilgi için https://docs.microsoft.com/en-us/azure/azure-functions/functions-triggers-bindings adresine bakabilirsiniz.
Template Details bölümüne yer alan New Function bilgisi yazacağımız Function ‘ın adı. URL ‘de endpoint olarak bu isim kullanılıyor. Authorization Level ise Function ‘ın güvenlik seviyesi ile ilgili ayarları içermekte. 3 seçenekten istediğimizi seçebiliriz;
- Function level : “Function Key” olarak adlandırılan “host key” bilgisini kullanarak güvenlik sağlamaktadır. İstediğiniz kadar key / secret oluşturup, farklı client ‘lar için güvenlik yapısı kurgulayabilirsiniz.
- Admin level : “_master” key kullanarak güvenlik sağlamaktadır.
- Anonymous ise herhangi bir güvenlik önlemi olmadan direkt olarak public erişime açık olan Function ‘lar için tercih edilebilir.
App Keys
Bu bölümde Function ‘a erişim için kullanılacak olan key / secret bilgileri oluşturulmaktadır. Farklı key / secret bilgileri oluşturup, bağmsız client ‘lar için güvenlik sağlayabilirsiniz.
Configuration
Bu bölümde Function ile ilgili tüm config bilgileri yer almaktadır.
Application Settings bölümünde yer alan bilgileri web uygulamanızın web.config gibi düşünebilirsiniz. Buraya ekleyeceğimiz her bir key – value, Function kodları içinde istediğimiz gibi kullanılabilir.
Function runtime settings ve General settings ise Azure Function ile ilgili genel config bilgilerini içermektedir.
Custom Domains
Bir Azure Function ‘ın url bilgisi default olarak https://function-adi.azurewebsites.net olarak tanımlanıyor ve erişim için bu kullanılıyor. Bu bölümde ise mevcut bir alan adını (domainname) bir Azure Function ile eşleştirebiliriz. Bunun için A Record ya da CNAME ile gerekli düzenlemeleri yapıyoruz.
Kapsamlı bir konu olduğu için başka bir yazıda detaylı olarak anlatacağım.
TLS – SSL Settings
Bu bölümde Azure Functions ‘ın daha güvenli çalışmasını sağlamak için TLS ve SSL ayarlarını yapıyoruz. Benim önerim Https Only ayarlarının On olarak seçilmesi, böylece Azure Function URL bilgisine sadece Https protokolü üzerinden erişim sağlanır.
CORS
CORS, Cross-Origin Resource Sharing ‘in kısaltmasıdır. Basit olarak bir domain üzerinden başka bir domain ‘de yer alan bir servise istek yapabilmek için kullanmaktayız.
Eğer yazmış olduğumuz Azure Functions ‘ı bir Http Trigger olarak konumlandırıp, herhangi bir web sitesinden Ajax request ile erişilmesini sağlamak istiyorsak bu bölümde CORS ayarlarını yapmalıyız.
Genelde kolaylık olması açısından * koyup geçiyoruz, fakat burada önemli olan nokta bu şekilde bir işlemin ilgili servisi tüm sitelerin erişimine açtığını unutmamak. Eğer sadece kendimize ait ya da belirlediğimiz sitelerden istek almasını istiyorsak bu bölümde her bir adresi tek tek tanımlamamız gerekmekte.
CORS hakkında Türkçe olarak yazılmış en iyi yazılardan biri Gökhan ŞENGÜN ‘ün https://medium.com/@gokhansengun/cors-nedir-ve-ne-i%C5%9Fe-yarar-27006d85bf54 adresinde bulunan yazısıdır. Ek olarak http://devnot.com/2019/cors-nedir adresinde yer alan yazıya da göz atmanızı tavsiye ederim.
Umarım faydalı bir yazı olmuştur.
Azure Functions hakkında tüm yazılara tek nokta üzerinden ulaşmak için https://www.emregulcan.com/azure-functions-index adresini ziyaret edebilirsiniz.