AWS ECS Fargate ile Multi Container Deployment

Şimdi docker containerlarımızı deploy edebilmek için 2 seçeneği karşılaştıralım ve daha sonrasında ECS Fargate ile deploy etmeyi görelim. Bu konuda ECS Fargate üzerinde nodejs + react containerlarını çalıştırıp yayına alacağız. İki tane basitçe yazılmış nodejs + react uygulamalarıdır.

Seçenek 1 – EC2 Üzerinde Deploy

  • Docker’ı kendin kurarsın
  • Uygulamayı docker run / docker compose ile çalıştırırsın

Bu adım şunları kapsar:

  • AWS’de bir EC2 instance oluşturmak
  • OS seçmek (genelde Ubuntu)
  • Instance type seçmek (CPU/RAM)
  • Disk boyutunu ayarlamak
  • SSH key oluşturmak

Yani ham bir Linux sunucu ayağa kaldırırsın.

Eğer:

  • Sunucuya tam hakim olmak istiyorsan
  • OS seviyesinde kontrol istiyorsan
  • Network, güvenlik, maliyet, performans üzerinde söz sahibi olmak istiyorsan

Ne zaman zorlayıcı olur?

Otomatik scaling istiyorsan
Çok sayıda servis varsa
DevOps yükünü azaltmak istiyorsan

Bu noktada ECS/EKS(Kubernetes) gibi yönetilen hizmetlerde tercih edilebilir.

EC2 seçmiş olsak yapacağımız genel adımlar:

  1. EC2 aç
  2. Docker + Docker Compose kur
  3. Repo’yu klonla
  4. docker compose up -d –build

Uygulama yayında. Ama buna ek olarak trafik dalgalı olacaksa load balancer, auto scaling group kurulumlarını da yapmak zorundayız.

Seçenek 2 AWS ECS Fargate

ECS nedir?

Amazon ECS (Elastic Container Service):

  • AWS’in tam yönetilen (fully managed) bir container orchestration servisidir.
  • Sen Docker image’larını verirsin,
  • AWS container’ları senin yerine çalıştırır, izler ve ölçekler.

Yani:

“Ben Docker ile uğraşmak istiyorum ama sunucu yönetmek istemiyorum.

AWS ECS — Ne zaman seçilir?

  • AWS kullanıyorsun
  • Docker biliyorsun ama Kubernetes öğrenmek istemiyorsun
  • Küçük–orta ölçekli prod
  • Az DevOps kaynağı
  • Hızlıca canlıya çıkmak

ECS + Fargate = “sunucusuz container”

  • EC2 yok
  • Node yok
  • Cluster yönetimi yok
  • CPU/RAM seç → deploy et

Yani kısaca tercihleri özetlersek:

1- EC2 + Docker Compose (Gerekirse ALB + ASG) yani load balancer ve auto scaling group

2- Sunucu, load balancer, asg ayarlamakla uğraşmak istemiyorum containerlar üzerinden hızlıca yayına çıkmak istiyorum ve auto scaling istiyorum dersek de ECS + Fargate tercih edilebilir.

3- Çok daha büyük servislerimiz, mikroservislerimiz varsa kubernetes ile AWS EKS de tercih edilebilir.

Ama bizim buradaki amacımız ECS + Fargate ile birden fazla docker containerımızı nodejs, mongodb, react uygulamamızı yayına almak.

ECS Cluster

Cluster = container’ların çalıştığı ortam

  • ECS Cluster, container’ların çalışabileceği mantıksal alan
  • Fargate kullanıyorsan:
  • Arkada sunucu yok
  • Cluster sadece bir “organizasyon sınırı”
  • EC2 mode’da:
  • Cluster = EC2 instance’larının grubu

Task Definition = Dockerfile + docker-compose.yml karışımı

Bu ECS’nin en önemli parçası.

Task Definition içinde şunlar tanımlanır:

  • Hangi image’lar çalışacak
  • Kaç container var
  • Environment variables
  • Port’lar
  • Volume mount’ları
  • Container start order
  • CPU / RAM
  • Logging
  • Secrets

Task = Task Definition’ın çalışan bir instance’ı

  • Her TASK içinde:
  • Client Container
  • Backend API Container
  • Bir Task içinde birden fazla container olabilir
  • Ama genelde microservice mimaride 1 container = 1 task tercih edilir

Service = Task’ları yöneten şey

Service şunları yapar:

  • “Kaç task çalışsın?” (desired count)
  • Task ölürse yeniden başlatır
  • Load Balancer’a bağlar
  • Auto-scaling uygular
  • Arkada birden fazla Task varsa
  • Trafiği eşit dağıtır

En kritik fark (Compose vs ECS)

  • Compose:
  • “Çalıştır ve unut”
  • ECS: “Kaç tane çalışsın, ölürse kaldır, trafiği dağıt, ölçekle”

Kısaca ECS mimarisinin özeti:

Task Definition = ne çalışacak
Task = çalışan kopya
Service = kaç tane + nasıl çalışacak
Cluster = nerede çalışacak

Şimdi nodejs backend için docker hub da bir repo oluşturuyorum.

Neden ECS cluster oluştururken Fargate only seçtik?

Çünkü:

• ECS cluster = “container’ların koşacağı yer”

Fargate = “o yerin serverless olması”

Bu şu anlama geliyor:

  • Bundan sonra:
  • Task Definition
  • Service
  • Load Balancer ayarlarına odaklanacaksın

• Sunucu diye bir şey düşünmeyeceksin

Docker imageımız larm64 mimarisinde olduğu için linux/arm64 seçtim.

Tüm ayarlamaları yaptım ve şu an task loglarında mongodb bağlantısı ve serverın 5000 portunda çalıştığını görüyoruz. Yukarıda sırayla yaptığımız adımları açıklamak gerekirse

1- port mapping ile 5000 portunu ayarladık nodejs uygulamamız 5000 portunda çalışıyor.

2- Environment key olarak MONGO_URI adresimizi verdik.

3- Healthcheck yapması için içerde /health route’una gitmesini istedik bu şekilde uygulamanın çalışır olup olmadığını denetleyen bir adet endpointimiz var ve bunun sonucuna göre containerın healthy olup olmadığını anlayacak. Interval, retries gibi ayarları değiştirerek healthy adımını özelleştirebilirsiniz. Yani kaç kere denesin, kaç denemeden sonra karar versin vs.

4- Launch type: Fargate seçerek serverless yönetilmesini istedim.

5- ALB (Application Load Balancer) ile trafiğin oluşturulan sunuculara eşit dağıtılmasını sağladım. Bu load balancer L7 katmanında yani HTTP’de çalışır. Oluşturduğumuz target group ise load balancer’ın nasıl çalışacağını belirler 5000 portundaki nodejs uygulamasını HTTP 80 üzerinden erişilebilir hale getirir.

Şimdi eğer çalışan görev kapatılır ve yeni bir görev başlatılırsa ip değişecektir. Buna erişmenin en iyi yolu load balancer dns kullanmaktır.

Load balancer üzerinden erişebiliyoruz.

Burada herhangi bir güncelleme yaptıktan sonra yeniden deploy tetikletebiliriz manuel olarak.

Şimdi react container’ını yayına alalım. Öncelikle image’ı docker hub repoma gönderiyorum. Burada dikkat edersek ortam değişkenini de load balancer url adresi olarak güncelliyorum.

Şimdi yeni bir revision oluşturalım. Yani ikinci containerımızı ekliyoruz.

Şimdi bu revizyonu kaydettik ve servisi deploy edeceğiz.

En son 4.revizsyon oluştu ve onu kullanarak deploy ediyorum. Task’i de 2 olarak ayarladım.

Tüm bu ayarlarla da react uygulamasını da load balancer üzerinden erişilebilir hale getirdim. Burada Load balancer HTTP 3000 portu üzerinden gidiyor.

Bu konuda adım adım nodejs ve react containerlarımızdan oluşan bir uygulamamızı AWS ECS hizmeti üzerinden yayına aldık. Bu konuda kullandığımız load balancer, target group vb. kavramları ayrı bir konu üzerinde detaylıca göreceğiz.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir