“Kah bugdan dökülür, kah para yazar en hazin sözler ‘server’ diye başlar. AWS ECS & Chalice ile serverless“ Ortaya Karışık Yazılım Serisi — 5
Previously on Ortaya Karışık Yazılım Serisi (Docker & AWS ECS ile kim bilir neredeyim) => LINK

- Serverless : “Serverless bir mimariye geçmemiz kodunuzu yazıp upload ettikten sonra uygulamanın scale etmesi (ölçeklenmesi), deployment, işletim sistemi veya programlama dili güncellemeleri gibi daha birçok konuyu ya tamamen bizim sorunumuz olmaktan çıkıyor yada oldukça kolaylaştırıyor.” [3]
- AWS Chalice : Python ile sunucusuz uygulamalar yazmak için bir framework.[2]
- AWS ECS : Amazon Elastic Container Service (Amazon ECS), tam olarak yönetilen bir container düzenleme hizmetidir.[1]
- Decorator pattern : Nesne yönelimli programlamada, decorator deseni, aynı sınıftaki diğer nesnelerin davranışını etkilemeden, tek bir nesneye davranışın dinamik olarak eklenmesine izin veren bir tasarım modelidir.
Geçtiğimiz serilerde kullandığımız docker-compose dosyasını kullanmaya devam ediyoruz. Linux türevleri kullanan arkadaşlar eğer root olarak çalıştırmazsa genelde şöyle bir hata ile karşılaşıyorlar:
ERROR: Couldn’t connect to Docker daemon at http+docker://localhost — is it running?
sudo chown $USER /var/run/docker.sock
Chown ile bunu çözebiliyoruz nedir bu chown(change owner) Chown komutu, Linux dosya sistemlerindeki dosya ve dizinlerin sahipliğini değiştirmek için kullanılır süper izin verir [4].
Şimdi chalice kısmına geçelim aslında yukarıda ayrıntılı bir şekilde chalice ve serverless mevzularını açıklamasak da basit bir şekilde ne olduklarına dair bahsettik ayrıntılı bilgiler için referanslara bakabilirsiniz.
PatKut Girişme zamanı
pip install chalice
Not: Adım bir olarak ilk chalice yükledik, adım iki olarak terminal üzerinde chalice komutunu kullanarak yeni bir proje oluşturmak olacak.
Şimdi süper önemli küçük bir ayrıntıya geliyoruz bu tabi ki “Credentials” kısmı. Deploy etmeden önce buranın varlığından emin oluyoruz.
tail -100 ~/.aws/config

Eğer yukarıdaki gibi bir sonuç çıkmadıysa oluşturabilirsiniz veya aws-cli yükleyip konfigürasyonu yapabilirsiniz.
chalice new-project ChaliceBosOrnek
Yapı olarak genel hatları ile aşağıdaki gibi oluyor tabi bu aşırı basit bir örnek. AWS servislerine ulaşmak isterseniz policy-base.json kısmına göz gezdirmeniz gerekmektedir.

Projenin olduğu konuma gidip terminalden “chalice deploy” dediğinizde serverless dünyasına ilk adımı atmış oluyorsunuz.
Localhost’da test etmek isterseniz;
chalice local
Amazon’a deploy etmek isterseniz;
chalice deploy# eğer timeout hatası alırsanız --connection-timeout parametresi kullanabilirsiniz.örnek: chalice deploy --connection-timeout 120
deploy dediğimiz anda aws bizim için arka tarafta bir sürü işlem yapacak kodumuz gittiği anda server tarafından artık aws sorumlu biz ise kodumuzdan sorumluyuz.


chalice delete
Eğer silmek istiyorsan “chalice delete” dememiz yeterli. Akıllara gelebilecek bir diğer soru kodu güncelledim şimdi ne yapacam? Bir şey yapmana gerek yok silmediğin müddetçe aws senin için bunu versiyonluyor yine bununla birlikte proje ağacında deployments klasöründe bunları görebilirsin. Bununla birlikte eğer bir kütüphane kullanıyorsan bunu “requirements.txt” dosyasına yazmayı unutma.

Diğer önemli bir konu multifile support. “app.py” dosyası, tüm görünüm işlevlerinizi ve route bilgilerinizi içerir, ancak tüm uygulama kodunuzu app.py dosyanızda tutmak zorunda değilsiniz.
Uygulamanız büyüdükçe, uygulamanızı birden çok dosyada yapılandırmayı tercih ettiğiniz bir noktaya ulaşabilirsiniz. Bunun için chalicelib/ dizini oluşturabilirsiniz. [5]

Geçtiğimiz yazı dizilerinde kullandığımız redis kısmını decorator’e çevirip bir tık daha düzgün gözükmesini sağlayacağız nedir bu decorator. Nesne yönelimli programlamada, decorator deseni, aynı sınıftaki diğer nesnelerin davranışını etkilemeden, tek bir nesneye davranışın dinamik olarak eklenmesine izin veren bir tasarım modelidir. Basitce;
def decorator(func):
def wrapper():
print("Something is happening before the function is called.")
func()
print("Something is happening after the function is called.")
return wrapper
chalice app.py tarafında ise
Yukarıda hakanTV isimli redis kanalına post ettiğimiz verileri gönderiyoruz. GET kısmında ise Redis canlı mı değil mi diye ping atıyoruz.
chalice local
dediğimiz anda chalice local de çalışmaya başladı. Sıra Postman ile test etmeye geldi;

Chalice hazır! sıra geldi docker tarafına hatırlarsanız bundan önceki örnekte logstash için ufak bir conf dosyası hazırlamıştık şimdi hem onu hemde docker-compose dosyasında aws’nin kabul etmediği parametreleri değiştirip serverless bir şekilde aws fargate’e deploy edeceğiz.
hakanTV için logstash.conf dosyasını düzenledim.
input {
redis {
host => "redis"
password =>"123sifre"
data_type => "channel"
key => "hakanTV"
}
}
output {
elasticsearch {
hosts => ["elasticsearch:9200"]
index => "hakantv"
}
}
Docker işlemlerine geçiyoruz.
sudo docker context create ecs beybiliboi
sudo docker context use beybiliboi
sudo docker context list # kontrol ediyoruz beybiliboi’de miyiz
sudo docker compose up
sudo docker compose up dediğimiz zaman “ECS Fargate does not support bind mounts from host: incompatible attribute” hata almazsak aws bizim için deploy işlemlerine başlıyor eğer bu hatayı alırsak attribute kısımlarına dikkat etmemiz gerekli bunun listesini bir önceki yazı serisinde paylaşmıştım LINK
Şimdi süreçten bahsetmem gerekli burada deploy işlemi inanılmaz uzun sürüyor deploy kısmında hata olursa bir de remove işlemi için tekrar başlıyor temiz 20 dakika harcar tek hata ile. Bununla birlikte ES deploy ettiğim zaman ben bir türlü servise ulaşamadım hatta timeout’a çok sık düştüm tam emin olmamak ile birlikte büyük docker-compose dosyalarında belli ki bu tarz mimari sorun çıkartıyor olabilir.
Bir diğer durum ise cold start. Sunucusuz bir işlevi çalıştırırken, siz çalıştırdığınız sürece etkin kalır (diğer adıyla, sıcak). Bir süre etkinlik dışı kaldıktan sonra, bulut sağlayıcınız kapsayıcıyı bırakır ve işleviniz etkiğini pasife alır (diğer bir deyişle, soğuk).
Etkin olmayan bir işlev yürüttüğünüzde soğuk bir başlangıç olur özetle “gecikme”. [7]
En temiz senaryo ise direk amazonun servislerini kullanıp kod kısmını chalice ile çözmek olabilir.

Yine klasik kapanışımız ile kapatalım. Ortaya Karışık Yazılım Serisi’ne kendinizi yakın hissediyorsanız paylaşarak destek olabilirsiniz yaptığım hata ve öneriler için Twitter üzerinden ulaşabilirsiniz.

Referanslar
- https://aws.amazon.com/tr/ecs/?whats-new-cards.sort-by=item.additionalFields.postDateTime&whats-new-cards.sort-order=desc&ecs-blogs.sort-by=item.additionalFields.createdDate&ecs-blogs.sort-order=desc
- https://aws.github.io/chalice/
- https://medium.com/cloud-turkey/nedir-bu-serverless-637a59a44e81
- http://www.linfo.org/chown.html
- https://aws.github.io/chalice/topics/multifile.html
- https://github.com/kemalcanbora/serverless-example
- https://www.serverless.com/blog/keep-your-lambdas-warm