.NET 7 – AWS Lambda İle Serverless Computing
Merhaba,
Bu içeriğimizde .NET 7’de AWS Lambda ile serverless bir fonksiyonalite inşa etmeyi ve deploy işlemlerini inceliyor olacağız.
Serverless Applications Nedir?
Günümüz yazılım geliştirme süreçlerindeki en çağdaş yaklaşımlardan birisi uygulamaların serverless mimariler üzerinden tasarlanmasıdır. Serverless; bir uygulamayı doğru parçalara bölerek, cloud üzerinde çalıştırma yaklaşımını ifade eden terminolojik bir terimdir. Serverless mimarisi, küçük ölçekli ve iş yükü pek fazla dış sistemlere dayalı olmayan operasyon süreçlerinde direkt ilgili işle ilgilenebilecek küçük fonksiyonaliteleri tarif etmektedir.
Serverless kelimesi Türkçe’ye -sunucusuz- olarak tercüme edildiği için yanıltıcı bir isme sahip olabilir. Esasında bir sunucu makinanın olmamasından ziyade sunucunun ve sunucu ihtiyaçlarının geliştirici ekibinden soyutlandığını, tüm sorumluluğunda cloud provider’lar tarafından üstlenildiğini ve geliştirici ekibin sadece işe ve o işi gerçekleştirilecek kodun inşasına odaklanması gerektiğini ifade etmektedir. Böylece uygulama açısından geliştiricileri; infrastructure(altyapı) olsun, scaling(ölçeklendirme) olsun veyahut configuring(yapılandırma) gibi konular olsun endişelerden kurtarmaktadır.
Serverless mimarisi, peşin bir ödemeden ziyade kullandıkça ödeme modeliyle çalışmaktadır. Yani uygulamanız hizmetine devam ederken uygun maliyet açısından yalnızca ilgili kod fiilen kullanıldığı anlarda faturalandırılacaktır.
Uygulama Süreçlerinde Serverless Bir Yaklaşım Neden Düşünülmelidir?
Uygulama süreçlerinde serverless teknolojilerinden destek almamızın tabi ki de birçok nedeni olabilir. Bu nedenlerden bazılarını birkaç cümleyle sıralarsak eğer;
- Hazır Kullanılabilirlik
Serverless yaklaşımında uygulama için gerekli olan hizmetler built-in olarak bulunacağından dolayı bu yetenekler için ekstradan kaynak ayrılmasına ve enerji tasarrufunda bulunulmasına gerek bulunmamaktadır. - Otomatik Ölçeklenebilirlik
Uygulamalar gerektiği taktirde otomatik olarak ölçeklendirilebilecek bir altyapıda yapılandırılmaktadır. - Minimize Edilmiş Maliyet
Kullandıkça öde yöntemi sayesinde yazılım sürecindeki maliyetler oldukça törpülemektedir.
Bu nedenler ister istemez ihtiyaç noktalarında serverless yaklaşımın düşünülmesi için haklı gerekçeler olabilmektedir.
AWS Lambda Nedir?
AWS Lambda, AWS tarafından sağlanan serverless bir bilgi işlem hizmetidir. Herhangi bir sunucu gereksinimine ihtiyaç duymaksızın fonksiyonel kodlarınızı yürütmenize olanak tanımaktadır. Bunun için tek yapılması gereken AWS tarafından desteklenen dillerden biriyle ilgili fonksiyonu kodlamaktır.
AWS Lambda üzerinde yazdığınız fonksiyonlar biryandan da Lambda Functions olarak nitelendirilmektedir.
AWS Lambda esas olarak geliştirilen fonksiyon çağrıldığında çalıştırma ve gerektiği taktirde otomatik olarak ölçeklendirme sorumluluklarını üstlenmektedir. Tabi ki de Lambda Function’lar da farklı AWS Service’leriyle olan entegrasyonlar sayesinde de istifade edilebilmektedir. Yani isterseniz DynamoDB ile bağlantı kurup veritabanı işlemleri gerçekleştirebilir yahut AWS S3 üzerinden dosya işlemleri yürütebilirsiniz.
Genellikle event-driven operasyonlar için Lambda Function’lar tercih edilebilmektedir.
AWS IAM Aracılığıyla Kullanıcı Oluşturma ve Access Key Generate Etme
AWS Lambda’yı örneklendirebilmek için geliştireceğimiz uygulamaya başlamadan önce, local makinemizde ilgili servise erişim anahtarı olan access key’i içerecek bir AWS Profile oluşturulması gerekmektedir. Bu işlem için tabi ki de AWS CLI‘a ihtiyacımız olacaktır.
Öncelikle AWS IAM aracılığıyla gerekli yetkilendirmelere sahip olan bir kullanıcı oluşturarak başlayalım. Bunun için AWS Console üzerinden aşağıdaki ekran görüntüsünde olduğu gibi IAM servisine gidelim ve gerekli kullanıcı oluşturma sürecini başlatalım.Misal olarak bu işlem için ‘lambda.example’ adında bir kullanıcı oluşturalım.
Burada Access key – Programmatic access kutucuğunu işaretlemeyi unutmayınız.
Ardından bu kullanıcıya aşağıdaki ekran görüntüsünde olduğu gibi Attach existing policies directly sekmesi üzerinden ‘AdministratorAccess’ politikasını verelim.Sonrasında ise klasik Türk yardırmasıyla ‘Next, Next la he Next’ diyerek ‘Create User’ butonuna kadar gelelim ve kullanıcı oluşturalım.
Netice olarak bu kullanıcıya dair bizlere sunulan access ve secret key’leri bir yere not ederek sayfayı kapatalım.
Profil Yapılandırmasını Sağlama
Edindiğimiz access ve secret key’leri uygulama yapılandırma sürecinde rahatlıkla kullanabilmek için AWS Local Configuration Profile aracılığıyla local bilgisayarımıza kaydedelim.
.NET 7 İle AWS Lambda Entegrasyonu – AWS Toolkit Extension
Artık .NET 7 ile AWS Lambda operasyonları için gerekli olan tüm altyapı çalışmasını tamamlandığımıza göre AWS Toolkit Extension ile AWS Lambda entegrasyonunu gerçekleştirebiliriz.
AWS Toolkit Extension, Visual Studio’da AWS Project Template’lerini yüklememizi sağlayan bir eklentidir. Bu eklentiyi Manage Extensions üzerinden aşağıdaki gibi aratarak kurabilirsiniz.İlgili toolkit’i yükledikten sonra Visual Studio’da AWS Project Template’lerini aşağıdaki gibi görebilirsiniz.
.NET CLI Üzerinden AWS Project Template’lerini Yükleme
Ayrıca, AWS Project Template’lerini .NET CLI üzerinden de aşağıdaki talimat eşliğinde yükleyebilirsiniz.
dotnet new -i Amazon.Lambda.Templates
AWS tarafı için bunca tantana yeter 🙂 Artık programatik olarak AWS Lambda oluşturmaya ve kodlama sürecindeki mimarisini incelemeye başlayalım derim.
.NET 7 İle AWS Lambda Projesi Oluşturma
.NET 7 ile AWS Lambda uygulaması geliştirebilmek için Visual Studio üzerinden AWS Lambda Project (.NET Core – C#) template’in de bir proje oluşturulması gerekmektedir.Tabi bu projeyi oluştururken Visual Studio bizlerden yapılacak işin uygunluğuna göre bir taslak seçmemizi isteyecektir. Kafaları çok bulandırmamak için boş taslak(Empty Function) üzerinden ilerleyelim.
.NET CLI İle AWS Lambda Projesi Oluşturma
Tüm bunların dışında .NET CLI’yı kullanarak aşağıdaki talimat eşliğinde ‘Empty Function’ projesi oluşturulabilmektedir.
dotnet new lambda.EmptyFunction --name AWS.Lambda.Example --profile lambda-example-profile
AWS Lambda Proje Yapısını İnceleyelim
Bir AWS Lambda projesinin yapılandırma(aws-lambda-tools-defaults.json) ve function(Function.cs) dosyası olmak üzere iki ana bileşeni bulunmaktadır.
Yapılandırma(aws-lambda-tools-defaults.json) dosyasında; profil ayrıntıları, bölge(region) vs. gibi bilgiler bulunmaktadır.
{ "Information": [ "This file provides default values for the deployment wizard inside Visual Studio and the AWS Lambda commands added to the .NET Core CLI.", "To learn more about the Lambda commands with the .NET Core CLI execute the following command at the command line in the project root directory.", "dotnet lambda help", "All the command line options for the Lambda command can be specified in this file." ], "profile": "lambda-example-profile", "region": "ap-south-1", "configuration": "Release", "function-architecture": "x86_64", "function-runtime": "dotnet6", "function-memory-size": 256, "function-timeout": 30, "function-handler": "AWS.Lambda.Example::AWS.Lambda.Example.Function::FunctionHandler" }
Burada tabi ki de ‘profile’ alanının önceki satırlarda oluşturduğumuz AWS Profile ile eşleşecek şekilde değiştirildiğinden emin olmalısınız.
Function(Function.cs) dosyasında ise;
using Amazon.Lambda.Core; // Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class. [assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))] namespace AWS.Lambda.Example; public class Function { /// <summary> /// A simple function that takes a string and does a ToUpper /// </summary> /// <param name="input"></param> /// <param name="context"></param> /// <returns></returns> public string FunctionHandler(string input, ILambdaContext context) { return input.ToUpper(); } }
‘Function’ class’ı içerisinde ‘FunctionHandler’ isimli basit bir metot görmekteyiz. Bu metot adının yapılandırma dosyasındaki “function-handler” alanında belirtildiğine dikkatinizi çekerim.
Şimdi gelin, Visual Studio 2022 üzerinden local makine üzerinden bu function’ın nasıl debug edileceğini inceleyelim.
AWS Lambda Projesi Nasıl Debug Edilir?
‘AWS Lambda Project’ template’in de oluşturulan projenin içeriğine dikkat ederseniz ‘Properties’ içerisinde ‘launchSettings.json’ dosyası mevcuttur. Bu dosya detayına göz atarsanız eğer içerisinde Mock Lambda Test Tool adında bir profil oluşturulmuştur.
{ "profiles": { "Mock Lambda Test Tool": { "commandName": "Executable", "commandLineArgs": "--port 5050", "workingDirectory": ".\\bin\\$(Configuration)\\net6.0", "executablePath": "%USERPROFILE%\\.dotnet\\tools\\dotnet-lambda-test-tool-6.0.exe" } } }
Bu profil, geliştirilen function kodunun AWS’ye deploy edilmesinden önce local olarak debug edilmesine yardımcı olmaktadır.
Debug işlemini başlatabilmek için Visual Studio üzerinden ilgili profilde uygulamanın ayağa kaldırılması yeterli olacaktır. Bu işlemden sonra http://localhost:5050 adresinde test aracının açıldığını görebileceğiz.
Yukarıdaki ekran görüntüsünden test aracının aldığı parametreleri incelerseniz eğer ‘Config File’, ‘Function’, ‘AWS Credential Profile’ ve ‘AWS Region’ bilgilerini talep etmektedir.
Bu bilgileri doğru bir şekilde girdikten sonra function’ın alacağı parametre değerini de yandaki görseldeki gibi ‘Function Input’ kısmına girmeniz ve ardından ‘Execute Function’ butonuna tıklamanız yeterlidir. Bu işlem neticesinde test aracının aşağısındaki ‘Response’ alanında girilen değerin büyük harflerle yazıldığını görebilirsiniz.
Şimdilik, bu Lambda Funciton’ı herhangi bir ekstradan işlem yapmaksızın en sade haliyle AWS’ye deploy etmeyi ele alalım.
AWS Lambda Function’ı AWS’ye Deploy Etme
AWS Lambda Function’ı deploy etmek oldukça basit. Bunun için ‘Solution Explorer’ penceresinden ilgili projeye sağ tıklayarak ‘Publish to AWS Lambda…’ sekmesine tıklamanız yeterlidir.
Bu arada şunu söylemeden geçemeyeceğim ki, farkındaysanız AWS Toolkit Extension AWS süreci için gerekli tüm altyapıyı Visual Studio IDE’sine entegre etmiş bulunmakta ve tüm işlerimizi yürütebileceğimiz yetenekleri kazandırmaktadır.
Sonraki adımda ise açılan pencerede aşağıdaki görseldeki gibi ‘AWS Credentials’ ve ‘Region’ bilgilerini doğru şekilde seçiniz ve ‘Function Name’ bilgisini giriniz.Devamında ise S3 gibi diğer AWS Service’lerine erişim sağlayacak olan bu AWS Lambda fonksiyonunun kimlik bilgilerini sağlamak için AWS Lambda Basic Execution Role‘ünü seçerek IAM rolü belirleyiniz.
Bu adımdan sonra ‘Upload’ butonuna tıklayarak Visual Studio üzerinden AWS Lambda projesinin AWS’de gerekli kaynakları oluşturmasını başlatabilirsiniz.
Bu işlem saniyeler zarfında oldukça kısa sürecektir. Tabi yükleme sürecinde ekranın altındaki Open Lambda Function view after upload complete. ve Automatically close wizard on successfull completion. kutucuklarının seçili olduğundan emin olmanızda fayda vardır. Böylece upload edilecek fonksiyonun Visual Studio üzerinden test edilmesi mümkün olacaktır.
Test Edelim
Upload işlemi bittikten sonra Visual Studio doğrudan local makinemiz üzerinden AWS Lambda Function’ı test edebilmemiz için bir tool açacaktır. Aşağıdaki ekran görüntüsünü incelerseniz eğer “Merhaba :)” olarak girilen değeri ilgili function büyüterek bizlere response etmektedir.
Bu tool’u manuel açabilmek için ‘View’ menüsünden ‘AWS Explorer’ sekmesine tıklayarak, oradan da ‘AWS Lambda’ kategorisinden ilgili function’a tıklayabilirsiniz.
Aynı şekilde oluşturulmuş ve upload edilmiş Lambda Function’ları AWS Console üzerinden de görmek isterseniz aşağıdaki ekran görüntüsünde olduğu gibi ‘Lambda’ keyword’ü ile ilgili servise giderek listeleyebilir ve oradan da çalıştırabilirsiniz.Ayrıca AWS Console üzerinde ‘Lambda’ servisinin ‘Code’ sekmesinde ilgili function’a dair paket boyutu, çalışma zamanı bilgileri vs. gibi türlü ayrıntıları bulabilirsiniz.
AWS Lambda Function’ı Re-Publishing Etme
Şimdi fonksiyonun yapısı üzerinde aşağıdaki gibi değişiklikler yapalım ve tekrardan yayınlayalım.
using Amazon.Lambda.Core; using System.Net.Http.Headers; // Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class. [assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))] namespace AWS.Lambda.Example; public class Function { public Response FunctionHandler(Person person, ILambdaContext context) { if (person.Age < 18) throw new Exception("The relevant person cannot be under the age of 18!"); return new Response() { Message = "The person has been verified!" }; } } public class Person { public string Name { get; set; } public string Surname { get; set; } public int Age { get; set; } } public class Response { public string Message { get; set; } }
Tekrardan yayınlama sürecinde Solution Explorer üzerinden ‘Publish to AWS Lambda…’ sekmesini kullanabileceğiniz gibi aşağıdaki AWS CLI talimatını da proje dizininde vermeyi tercih edebilirsiniz.
dotnet lambda deploy-function
Tabi bu talimatın çalışabilmesi için Amazon Lambda Tool’larının makinenizde yüklü olduğundan aşağıdaki talimat eşliğinde emin olunuz.
dotnet tool install -g Amazon.Lambda.Tools
Cloudwatch Logging
AWS Lambda servisinin Cloudwatch olarak bilinen özel bir loglama mekanizması mevcuttur.Bu mekanizmaya AWS Console üzerinden yukarıdaki ekran görüntüsündeki gibi direkt ‘Cloudwatch’ kelimesini aratarak erişebilirsiniz.
İlgili mekanizma aşağıdaki ekran görüntüsünde olduğu gibi bir function’a dair tüm detayları loglamakta ve belirli bir zaman aralığına dair süreci net bir şekilde yorumlayabilmemizi sağlayacak verileri bizlere sunmaktadır.
AWS Lambda Ne Zaman ve Hangi Durumlarda Kullanılmalıdır?
Son olarak akıllarda kalabilecek suallere cevap niteliğinde bir kaç kelamda bulunup içeriğimizi nihayete erdirelim isterim. AWS Lambda servisinin ne zaman ve hangi durumlarda kullanılacağını sorarsanız eğer daha önce de belirtildiği gibi herhangi bir sunucuyu yönetmenize ihtiyaç duymayacağınız ve yalnızca direkt işlevine odaklanacağınız operasyonlar söz konusu ise Lambda Function’ları düşünebilirsiniz. Genellikle 10-15 dakikadan fazla işlev süresi olmayan operasyonlar için oldukça idealdir diyebiliriz. Ama bu tarz durumların dışındaki operasyonlar için de AWS Lambda’ya tabi ki de başvurabilirsiniz.
AWS Lambda’yı, bahsi geçtiği üzere otomatik olarak ölçeklendirmeyi gerçekleştirdiği, 1 milyon kadar request’i karşıladığı ve 400.000 GB kadar alanı ücretsiz olarak kullanma olanağı tanıdığı için herhangi bir ihtiyaç durumunda güçlü bir alternatif olarak değerlendirebilirsiniz.
AWS Lambda Ne Zaman Kullanılmamalıdır!
Esas mesele bir teknolojinin ne zaman ve hangi durumlarda kullanılmaması gerektiğini bilmektedir. AWS Lambda açısından olayı değerlendirirsek eğer her Lambda Function yalnız 15 dk kadar çalışabileceğinden dolayı daha uzun süreli iş yükü barındıracak operasyonlar için mümkün mertebe kaçınılması gereken bir servistir. Ayrıca aylık fatura işlevsel olarak bir function’ın çalışma süresiyle doğru orantılı olacağı için karmaşık ve uzun işlem gerektiren operasyonlarda da maliyeti düşürebilmek için AWS Lambda’yı kullanmadan önce kodu derleyip toparlamanızı öneririm…
İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…
Not : Örnek çalışmayı aşağıdaki github adresinden inceleyebilirsiniz.
https://github.com/gncyyldz/AWS.Lambda.Example