Merhaba arkadaşlar bu dersimizde Amazonun popüler servislerinden birisi olan sunucusuz mimariye sahip uygulamalar için kullanılan AWS Lambda servisini inceleyeceğiz.
Sunucusuz mimariyle geliştirilen uygulamalar olay tabanlı olmaktadır. Yani kodumuzun çalışabilmesi için bir olayın meydana gelmesi gerekmektedir.(HTTP isteği, cronjob, S3’ dosya yüklenmesi …) Bu olay sonucunda kodlarımız belirlenen işlemleri gerçekleştirirler.
AWS Lambda, Serverless dediğimizde aklımıza ilk gelen servislerden birisidir. Bu servislerde biz sadece çalışmasını istediğimiz kodu yazıp, gerekli kaynak ayarlarını yapmaktayız. Kodumuzun hangi sunucuda çalıştığı gibi ayarlarla hiç uğraşmak zorunda kalmıyoruz böylece yönetim veya bakım,güvenlik gibi ayarlara ihtiyaç duymuyoruz. Ücretlendirme ise kodumuzun çalışma süresi boyunca gerçekleşmektedir. Lambda servisi her ay 1 milyon ücretsiz istek sunmaktadır. Ücretlendirme ile ilgili detaylı bilgiyi AWS’nin Türkçe hazırladığı bu sayfadan ulaşabilirsiniz.
Lambda servisi kodlarımızı birer containerlarda çalıştırmaktadır. Bizim ise sadece paketlenmiş kodumuzu Lambda servisine yüklememiz yeterlidir. Her türlü servis yoğunluğuna göre çok rahat bir şekilde ölçeklenebilen Lambda servisi, milyonlarca isteği rahat bir şekilde karşılayabilmektedir. Örnek olarak bir mobil uygulamanın isteklerini karşılayan Lambda servisimiz, o gün artan kullanıcı yoğunluğu ile hiç bir sorun çıkarmadan isteklerin hepsini karşılamış olacaktır.
Lambda Java, Go, PowerShell, Node.js, C#, Python, ve Ruby dillerini desteklemektedir. Bu dilleri kullanarak Lambda servisleri yazabiliriz. Servisimizi IAM rolleriyle daha güvenli hale getirerek iletişimde olacağı AWS servislerini tanımlayabiliriz. Bu sayede kullanıcı kayıt işlemlerini yapan bir Lambda fonksiyonu Ödeme veritabanına erişimi kısıtlayabiliriz.
Lambda ile kodumuzun çalışma süresi kadar ödeme yapılmaktadır. Bu sayede milyonlarca istek çok düşük bir ücrete gelebilmektedir.
Örnek
Go ile yazdığımız basit bir Lambda fonksiyonun kodları aşağıda bulunmaktadır. Kullanacağımız çeşitli event türlerine göre HandleRequest adlı fonksiyonumuzu değiştirebiliriz. Kodumuz çalıştığında sadece bir mesaj yazacak şekildedir.
package main import ( "context" "fmt" "github.com/aws/aws-lambda-go/lambda" ) func HandleRequest(ctx context.Context) (string, error) { return fmt.Sprintf("Lambda Ders - Hello World!"), nil } func main() { lambda.Start(HandleRequest) }
Lambda kodun derlenmiş ve paketlenmiş halini bizden istemektedir. Bunun için öncelikle kodumu Linux sistemlerinde çalışacak parametre ile derledim.
$ GOOS=linux go build -o main main.go
main adında binary dosyamız bulunduğumuz dizinde oluşturuldu. Bu dosyayı zipleyip Lambda servisine yüklememiz gerekmektedir. İstersek direkt olarak gönderebiliriz veya S3 üzerinden referans göstererek oradan kullanmasını sağlayabiliriz.
Ben bu örneğimizde direkt göndermeyi tercih ettim.
Burada Handler alanına zip içerisindeki binary dosyanın adını yazmamız gerekiyor.
Main diye oluşturduğumuz için alana main yazmamız gerekiyor.
Resimde görüleceği üzere Runtime olarak Golang seçtiğimiz için binary dosyasının adını girdik.
Eğer Java seçmiş olsaydık Handler kısmına com.DersTest::MetodAdı girmemiz gerekiyordu.
Fonksiyonumuz için ne kadar kaynak kullanımı olacağını ve çalışma süresini ayarlayabiliriz. Burada eğer diğer AWS servislerimizle iletişimde olacaksa bu işlevine uygun IAM rolleri tanımlayarak güvenli bir şekilde çalışmasını sağlayabiliriz.
Şimdi Lambda fonksiyonumuzu test edelim. Bunun için boş bir JSON event’ı oluşturalım. Eğer kodumuz dışarıdan bir input bekleseydi bu JSON içeriği de ona göre değiştirmemiz gerekmektedir.
Şimdi ise fonksiyonumuzu bu event ile test edebiliriz. Aşağıdaki resimde görüldüğü üzere yazdığımız mesajı bize dönmüş oldu. Toplam çalışma süresi ise 0.75Ms.
Bu yazımızda bize sunucu yönetimi yapmadan, hızlı ve çok kolay ölçeklenebilen AWS Lambda servisini inceledik. Lambda ile uygun maliyetli, kolayca ölçeklenebilen uygulamalar yazarak servislerimizin ölçeklendirilmesini kolayca sağlayabiliriz.
44