AWS Fargate & ECS İle Ölçeklenebilir Uygulamalar

İbrahim Hızlıoğlu
6 min readMay 10, 2020

--

Uygulamanın kullanıcı sayısı artığında, anlık yüksek trafikleri karşılayabilmek için, sistem altyapınızın ölçeklemeye uygun tasarlanmış olması gerekiyor.

Bu noktada; Docker ve Container teknolojisi son yıllarda işimizi oldukça kolaylaştırdı. Docker Swarm veya Kubernetes ile container’ları kolayca yönetebiliyoruz.

Öncelikle Amazon ekosistemindeki ürünlerden/terimlerden kısaca bahsederek başlayalım.

AMAZON ECR (Elastic Container Registry)

Docker Registry’nin Amazon’da karşılığı diyebiliriz. Docker image’larını depolamanızı, dağıtmanızı ve paylaşmanızı sağlıyor.

Continuous Integration için oluşturduğunuz pipeline’a göre burayı istediğiniz gibi yönetebiliyorsunuz.

Ben CI / CD süreçlerimi GitHub Actions üzerinden yönetmiştim. Release branch’i master’a merge edildiğinde, image ECR’a yükleniyor. Ardından Continuous Delivery aşaması otomatik olarak başlıyor. Yeni image’larla container’lar ayağa kalkıyor, health check’ler ok ise load balancer yeni container’lara trafiği yönlendirip, eski container’ları siliyor.

Bu senaryoyu Jenkins gibi farklı tool’lar üzerinden yönetmekte mümkün. Ya da Amazon’un CodePipeline hizmeti kullanılabilir.

AMAZON ECS (Elastic Container Service)

Dockerize ettiğiniz uygulamalar, ECS servisleri üzerinde çalışır. Task Definition’lar ile container’larınızı yönetebilirsiniz. Yazının devamında uygulamalı örnek paylaşırken detaylara değineceğim.

AMAZON EKS (Elastic Kubernetes Service)

Eğer container’larınızı Kubernetes ortamında koşturmak istiyorsanız, EKS’yi tercih edebilirsiniz. Ben bu yazıda Amazon’un container servisi olan ECS ile örnekler paylaşacağım.

AMAZON FARGATE

Container uygulamalarınızı EC2 sunucu üzerinde çalıştırdığınızda, ölçeklendirmeyi yine bu sunucuların kapasitesi oranında yapabiliyorsunuz. (16 GB ram, 4 CPU gibi) Ayrıca bu sunucuların bakımı ve yönetimi sizin sorumluluğunuzda bulunuyor.

Burada EC2 makineleri scale edebileceğiniz bir kurgu planlanabilir. Ama zaten container haline getirdiğiniz bir uygulama varsa, bunu ECS veya EKS servislerinde konumlandırmak çok daha verimli olacaktır.

Fargate ise bize “sunucusuz” olarak servislerimizi çalıştırma imkanı veriyor. Ölçekleme ve yönetim anlamında ciddi bir kolaylık sağlıyor. Siz her uygulamanın container limitlerini belirliyorsunuz. (8 GB ram, 2 CPU gibi) Sonrasında container sayısı, kaynak ihtiyacına göre n adete kadar çok hızlı bir şekilde ve otomatik olarak çıkabiliyor. Kaynak ihtiyacı azaldığında bu container’lar otomatik olarak kapatılıyor.

Bunu şöyle örnekleyebiliriz;
Bir haber uygulaması geliştirdiğinizi ve kullanıcılara “Son Dakika” bildirimi gönderdiğinizi düşünün. Bildirime n kişi tıklasada 20n kişi tıklasada sistemi stabil/çalışır tutmanız gerekiyor. Amazon Fargate ile herhangi bir kaynak kısıtlaması bulunmadan bu ölçeklemeyi sağlayabiliyorsunuz. Bildirime n kişi tıkladığında 1 container ile response veriyor, 20n kişi tıkladığında sistem container sayısını 20'ye çıkarıyor. X dakika sonra anlık yoğunluk azaldığında ekstradan oluşturduğu container’ları otomatik olarak kapatıyor ve kullanmadığımız kaynak için ücret ödemiyoruz. Kullanıcılar sistemi stabil şekilde kullanmaya devam ediyorlar.

Tabi bu noktaya kritik bir not düşmek gerekiyor. Fargate sadece sizin container’ınızı ölçekler. Container içerisinde çalışan uygulamanızın bağımlı olduğu database, cache, queue ya da başka bir mikroservis ölçeklenmiyorsa, sistem bir noktada kilitlenecektir.

FARGATE/ECS İLE ÖLÇEKLENEBİLİR UYGULAMALAR

Buraya kadar ölçeklenebilir mimari tasarlamak için kullanılabilecek Amazon servislerini özetlemeye çalıştım. Yazının devamında Fargate ve ECS kullanarak nasıl ölçeklenebilir bir yapı ortaya çıkarabileceğimizi paylaşacağım.

DOCKER REGISTRY OLUŞTURALIM

İlk olarak uygulamamızın versiyonlarını yükleyeceğimiz ECR repository oluşturacağız. Ben bu örnek için “demo-service” isimli yeni bir repository oluşturdum.

Dilerseniz Amazon ekosistemi dışında farklı registry servisleride kullanabilirsiniz. (Docker Hub, Google Cloud Registry vb)

AWS — Elastic Container Repository (ECR)

Artık Continuous Integration süreçlerinizi bu repository’e image gönderecek şekilde konfigure etmeniz gerekiyor.

Authentication için AWS’nin IAM servisinden user oluşturabilirsiniz. Eğer GitHub Actions kullanıyorsanız “aws-actions/configure-aws-credentials” ve “aws-actions/amazon-ecr-login” isimli Amazon’un official paketlerini kullanabilirsiniz.

CLUSTER OLUŞTURALIM

Container’larınızı bir cluster içerisinde çalıştıracaksınız. Biz Fargate ile sunucusuz bir cluster oluşturacağız. Böylece yönetmek zorunda olduğumuz EC2 instance bulunmayacak.

AWS — Cluster

İkinci adımda container’ımızın adını yazıyoruz. Yeni bir VPC ve Subnet oluşturarak, network ayarlarınızı özelleştirebilirsiniz. Metrikleri ve log’ları takip etmek için CloudWatch Container Insights‘ı aktif etmenizi öneririm.

AWS — Cluster

Ve artık cluster’ımız kullanıma hazır.

AWS — Cluster

Burada network’le ilgili kritik bir noktaya değinmek istiyorum. Cluster’ı yeni bir VPC’de aktif ettik. Container’larınızdan farklı VPC’de bulunan uygulamalarınıza private network’ten erişmek isteyebilirsiniz. Bu durumda “Route Table” konfigürasyonundan, vpc’ler arası erişim kurallarını belirlemeniz gerekiyor.

TASK DEFINITON OLUŞTURALIM

Container’lar, task definition’ların belirlediği kurallar çerçevesinde yönetiliyor. Bizde yeni container çalıştırılırken uyulması gereken kuralları belirleyeceğiz.

Fargate türünde çalışacak bir task oluşturuyoruz.

AWS — Fargate Task Definition

İkinci adımda task definition adını yazmamız gerekiyor. Ben burada genellikle task-{serviceName}-service-{environment} şablonunu kullanıyorum.

task-device-service-production
task-device-service-staging
vb.

AWS — Fargate Task Definition

Task Size bölümünde, container’ınızın limitlerini belirliyorsunuz. Eğer test etmek için demo uygulama yapıyorsanız, burada özellikleri düşük tutmanızı ve akabinde cluster’ı silmenizi öneririm. Burada seçtiğiniz özellikler AWS faturanıza yansıyacaktır.

AWS — Fargate Task Definition

Ve sıra container oluşturmaya geldi. “Add Container” butonuna tıklıyoruz ve container ayarlarımızı yapmaya başlıyoruz.

AWS — Container

Ben container adı için;
{serviceName}-container-{environment}
şablonunda isimlendirme yapmayı tercih ediyorum.

İlk adımda ECR üzerinde image repository oluşturmuştuk. Bu repository’nin adresini “image” alanına yazmanız gerekiyor. Böylece container bu image’ı çekerek ayağa kalkacak.

Eğer image için authentication gerekiyorsa, “private repository authentication” ile ilgili tanımları yapabilirsiniz.

“Port Mapping” kısmında container’ınızda bulunan uygulamanın çalıştığı portu yazmalısınız. Örneğin; 8080'den çalışan bir java uygulamanız varsa, buraya bu portu girmelisiniz.

AWS — Container

Gelişmiş ayarlar bölümünde başlangıç için bir şey değiştirmeniz gerekmiyor. Ancak burada “health check” ayarlarında değinilmesi gereken kritik bir nokta var.

Uygulamanızın base url’i http response code olarak “200” dönmüyorsa, container kendisini “problemli” olarak işaretler. Hemen akabinde yeni bir container ayağa kaldırır ve kendisini kapatır. Bu durumda container’larınızı sürekli open/closed döngüsü içerisine dahil etmiş olursunuz.

Eğer uygulamanızın health check url’i varsa, bu alanı değiştirebilirsiniz. Herhangi bir problem durumunda sistem otomatik olarak yeni container hazırlayıp load balancer’a ekleyecektir.

AWS — Container

CLUSTER SERVICE OLUŞTURALIM

Ve artık son aşamaya geldik. Cluster servisimizi hazırlayarak uygulamamızı kullanılabilir duruma getireceğiz.

Yine Fargate türünde bir servis oluşturacağımızı belirtiyoruz. Az önce oluşturduğumuz task-definition’ı seçiyoruz. Yine daha önce oluşturduğumuz cluster altında aktif olması gerektiğini belirtiyoruz. Son olarak service name’i yazıyoruz.

Number of tasks bölümünde replica sayısını ve limitleri belirleyebilirsiniz.

AWS — Fargate Cluster

Eğer Amazon’un CodeDeploy servislerini kullanıyorsanız blue/green deployment seçeneğiyle ilerleyebilirsiniz. Biz şimdilik “Rolling Update” ile devam edelim.

AWS — Fargate Cluster

Network ayarlarımızı belirliyoruz.

AWS — Fargate Cluster

Eğer yeni bir VPC oluşturduysanız, bu network’te olan load balancer tanımlamanız gerekiyor. “Application” türünde yeni bir load balancer yanımlayarak, container’ınız ile linkleyebilirsiniz.

Burada dikkat etmemiz gereken 2 durum var.

  1. container’ınız hangi porttan çalışıyorsa, load balancer’ın port mapping’i de aynı şekilde düzenlemelisiniz.
  2. Health check url’ini doğru tanımlamalısınız. Aksi durumda load balancer container’ın çalışmadığını / fail ettiğini görecek, container’a trafik yönlendirmeyecektir.
AWS - Cluster (Load Balancer)

Son olarak eğer auto scaling ayarlarınızı yapmak isterseniz limitlerinizi belirliyorsunuz. Test için uygulama oluşturuyorsanız auto scaling konfigürasyonu yapmadan devam edebilirsiniz.

AWS - Cluster (Auto Scale)

Ve işlemlerimiz tamamlandı.

AWS - Cluster

Artık container üzerinde çalışan uygulamalarımıza load balancer ile erişim sağlayabiliriz.

Umarım faydalı olmuştur. :)

İbrahim Hızlıoğlu

web: https://www.ibrahimhizlioglu.com
linkedin: https://www.linkedin.com/in/ibo/
github: https://github.com/ibo
twitter: https://twitter.com/ibrahimhizliogl

--

--