AWS Lambda'da C# Uygulaması Çalıştırmak

Bu yazımızda AWS'in en popüler servislerinden biri olan Lambda'ya C# ile geliştirilmiş örnek bir projeyi AWS CLI ile deploy ediyoruz.

 

AWS CLI

Yaptığımız geliştirmeleri doğrudan IDE aracılığıyla AWS'e gönderebilmemiz için AWS CLI kullanmaktayız. Hakkında daha detaylı bilgi almak ve yüklemek için bu linke gidebilirsiniz. 

AWS CLI'ın bilgisayarınıza yüklü olup olmadığını aşağıdaki komutu yazarak test edebilirsiniz. Yüklü olması durumunda aşağıdaki gibi versiyon bilgisini görebilirsiniz.

 

AWS Toolkit

AWS hesabımızda kullandığımız kaynakları görebilmek, deploy ettiğimiz uygulamaları tetikleyebilmek ve diğer işlemler için bu eklentiyi kullanabilriiz. Ben jetbrains Rider kullandığım için ekran görüntülerim onun üzerinden olacak fakat büyük bir fark bulunmuyor. Kullandığınız IDE neyse ona uygun toolkit'i indirip devam edebilirsiniz.

(Rider kullananlar için) veya (Visual Studio kullananlar için)

 

 

 AWS'in bize sunduğu çeşitli uygulama şablonları bulunmaktadır. Bu makalemizde de bu şablonlardan birini kullanacağız. Bunun için öncelikle terminali açıp Lambda şablonlarını indirelim;

dotnet new --install "Amazon.Lambda.Templates"

 

Şablonları indirdikten sonra aşağıdaki komutu çalıştırıp içerisinde sadece gelen metini büyük harflere çeviren basit bir kod bulunduran şablon projeyi indirelim.  

 

 dotnet new lambda.EmptyFunction --name LambdaDemo

 

C# Lambda Proje Yapısı

Projeyi açtığınızda bir lambda projesi ve bir test projesi ile geldiğini göreceksiniz.

Bu makalede testleri konu almadığımdan onlara değinmeyeceğim. 

Lambda projemiz ise bize bir adet "Function.cs" ve AWS Lambda ayarlarını yönetebildiğimiz config dosyası ile gelmektedir. 

Yaygın olarak kullanılan pratiklere baktığımızda Lambda'nın tetiklendiği metoda "Handler" veya "FunctionHandler" gibi isimler verilmektedir. Bize gelen şablonda da bu şekilde geldiğini görebilirsiniz. 

    public string FunctionHandler(string input, ILambdaContext context)
    {
        return input.ToUpper();
    }

 

Fakat kesinlikle bu isim olmalıdır diye bir şey yoktur. AWS Lambda tetiklendiğinde hangi fonksiyonu çağıracağını config dosyası içerisindeki "function-handler" değerinden alır. Eğer farklı bir isim vermek isterseniz lambdanıza aşağıdaki gibi önce fonksiyon ismini sonra da config değerini güncelleyebilirsiniz.

 public string UpperFunction(string input, ILambdaContext context)
    {
        return input.ToUpper();
    }
  "function-handler": "LambdaDemo::LambdaDemo.Function::UpperFunction"


Config dosyasında gelen diğer alanlara baktığmızda;

"profile" ile AWS'de kullandığınız veya yetki verdiğiniz farklı bir profiliniz varsa onu atayabilirsiniz.
"region" ile kullanmak istediğiniz belirli bir region varsa onu atayabilirsiniz.
"configuration" ile projenizin hangi modda derleneceğini tanımlayabilirsiniz.
"function-architecture" ile projenizin hangi işlemci mimarisini kullanacağını seçebilirsiniz.
"function-runtime" ile projenizin hangi frameworkü kullandığını belirtmelisiniz. mesela biz .net 6 ile geliştirme yaptığımız için "dotnet6" yazıyoruz.
"function-memory-size" lambda'nızın maksimum ne kadar RAM kullanabileceğini tanımılıyorsunuz
"function-timeout" lambda'nızın timeout süresini tanımlıyorsunuz.
"function-handler" istek geldiğinde hangi fonksiyonun tetikleneceğini belirtiyorsunuz. Genellikle bu formatta olur; "AnaProjeAdı::ProjeAdı.ClassAdı::FonksiyonAdı"

 

AWS Config Dosyanın Güncellenmesi

AWS CLI, kullanmak istediğimiz hesap bilgislerini bilgisayarınızın ana dizinindeki ".aws/config" dosyasından okur. Bu dizin Windows kullanıcıları için genellikle "C:\Users\[kullanıcı adınız]\.aws\config"  olur. 

Kullandığınız hesabın tanımlamalarını yapmak için önce "Security Credentials" sayfasına gidin.

Ardından açılan sayfada "Access Keys" butonuna tıklayıp yeni bir "aws_access_key_id" ve "aws_secret_access_key" oluşturun. Oluşturduğunuz bu iki key bilgisini config dosyasında "default" profili altına karşılık gelen yerlere yapıştırın.

 Bu bilgilere erişimi olan herkes sizin hesabınızı kullanarak AWS kaynaklarını kullanabilir ve eksra ücret yansımasına neden olabilir. O yüzden bu bilgileri saklamanız ve kimseyle paylaşmamanız, github'ta public repo içerisinde yayınlamamanız önemlidir. 
AWS ile işiniz bittiğinde oluşturduğunuz "Access Key" profilini silmenizi tavsiye ederim. 

 

Projenin AWS CLI İle Deploy Edilmesi

Terminalde projenin src klasörü altında bulunan "LambdaDemo" klasörünün içerisine gidilir;

Aşağıdaki deploy komutu çalıştırılır;

 dotnet lambda deploy-function LambdaDemo

 

 CLI sizden projenizi hangi AWS Region'ına deploy etmek istediğinizi soracaktır eğer config içerisinde bir region tanımı yapmadıysanız. Free Tier olarak kullandığımız için "us-east-1" yazıp ilerleyebilirsiniz. Diğer bölgelerde yapacağınız kullanımlar ücrete tabi olabilir.

Bir sonraki aşama olarak hangi yetki grubunda çalıştıracağınız soruluyor. Burada eğer varsa daha önce tanımladığınız bir profili de kullanabilirsiniz. Eğer yoksa da lambda için gereken profili hızlıca otomatik bir şekilde oluşturulmasını sağlayabilirsiniz.

Bunun için 6 numaralı AWSLambdaBasicExecutionRole şablonu işimizi görecektir.

 Ardından lambdamız başarılı bir şekilde deploy edilip konfigurasyonu yapılacaktır. 

 

Lambda'nın Test Edilmesi

 

AWS panelinde Lambda sayfasında kendi lambdamızı bulup içerisine girdiğinizde aşağıdaki Test Event alanından hızlıca tetikleme yapabilirsiniz.

Ben aşağıdaki gibi "Çaylak yazılımcı" mesajı gönderdim.

ve aşağıdaki gibi "ÇAYLAK YAZILIMCI" şeklinde büyük harflerde döndüğünü gördüm. 

 

Lambda ile yapabileceğiniz örneklerin sonu yoktur. Bu makalede ana hatlarıyla bir C# lambda fonksiyonunun neler içermesi gerektiğini, nasıl AWS'e deploy edebileceğinizi ve C# lambda fonksiyonunuzu nasıl çalıştıracağınızı anlattım. 

 

Add comment