Yazılım Mimarileri ve Tasarım Desenleri Üzerine

Asp.NET Core API Uygulamasını Amazon ESC’ye Deploy Etme – AWS Fargate İle Dockerize Operasyonu

Merhaba,

Bu içeriğimizde, bir Asp.NET Core API uygulamasının Amazon Elastic Container Services(Amazon ECS)‘a nasıl deploy edileceğini ve uygulamayı dockerize etmeyi detaylıca inceleyecek ve bu süreçte Amazon açısından ihtiyaç duyulacak olan servisleri ele alıyor olacağız. O halde buyurun başlayalım…

Amazon Elastic Container Services(Amazon ECS) Nedir?

Amazon Elastic Container Services, Amazon Web Services(AWS) tarafından sunulan, Docker container’larının yönetilmesi ve çalıştırılmasından sorumlu olan bir servistir. ECS, kullanıcılara yüksek ölçeklenebilir ve güvenli bir şekilde uygulamaları çalıştırma ve yönetme için gerekli altyapıyı sağlamaktadır.

ECS, bir docker container’ını özelleştirilmiş bir bilgisayar sunucusuna yerleştirir, ayrıca yüksek performans ve ölçeklenebilirlik sağlamak için otomatik olarak kaynakların yönetimini üstlenir. Bu, uygulamaların daha hızlı başlatılmasını ve kullanıcıların ihtiyaçlarına göre esnek bir şekilde ölçeklendirilmesini sağlar.

ECS, AWS’nin diğer hizmetleriyle de entegre olabilir. Misal olarak; Amazon Elastic Load Balancer(ELB) ile birlikte kullanılarak load balancing operasyonu gerçekleştirilebilir yahut Amazon CloudWatch Logs ile birlikte kullanılarak container log’ları takip edilebilir.

AWS Fargate Nedir?

AWS Fargate, AWS tarafından sunulan bir container servisidir. Amazon Elastic Container Service(Amazon ECS) ve Amazon Elastic Kubernetes Service(Amazon EKS) ile entegre edilebilmektedir. Fargate, container’ların çalıştırması için kullanıcı açısından gerekli olan sunucu yönetimini tamamen ortadan kaldırmakta ve container’ları doğrudan bir sanal özel bulut(VPC) içerisinde çalıştırmaktadır.

Fargate, kullanıcıların ECS veya EKS aracılığıyla yönetilen container servislerini kullanırken, sunucuları yönetme yahut ölçeklendirme gibi konularda endişelenmelerine gerek duyulmaksızın uygulama container’larını çalıştırmalarına olanak sağlamakta ve tüm bunların yanında otomatik bir şekilde ölçeklendirme(automatic scaling), load balancing, service discovery ve güvenlik(security) gibi pek çok özellik sunmaktadır.

Ayrıca Fargate, kullanıcıların uygulamalarını çalıştırmak için sadece gerektiği kadar kaynak kullanmalarına olanak tanıyan bir kaynak yönetimi modeli sunmakta ve böylece uygulama performansını artırmak için gereksiz yere kaynakların boşa harcanması durumunu ortadan kaldırmaktadır.

Amazon ECS İle İlgili Bilinmesi Gereken Bazı Terminolojiler
Task Service Cluster
Bir veya birden fazla container içerebilen uygulama çalıştırma bileşenidir. Task, çalıştıracağı container’a dair image, port, protokol vs. gibi bilgileri barındırmakta ve bu yapılandırmalar doğrultusunda container’ı ayağa kaldırmaktadır. Birden fazla task instance’ını çalıştırmak için kullanılan yapılandırmadır. Task’ların işlemlerini koordine ederek yük dengelemesi, yüksek kullanılabilirlik, ölçeklenebilirlik ve performans sağlar. Bir task başarısız olduğu taktirde diğer task’ların hizmet sağlamaya devam etmesinden, ayrıca otomatik olarak yeni task’ların oluşturulup ölçeklendirilmesinden sorumludur. Böylece kaynak yönetimini oldukça kolaylaştırmaktadır. Ayrıca container’ın sürüm kontrolü servis sayesinde sağlanmaktadır. Bir grup kaynakların(instance’ların) kümesidir. Cluster, container’ların tek bir mantıksal birimde, yüksek performanslı ve ölçeklenebilir bir şekilde yönetilmesine ve koordine edilmesine olanak tanır.
İçerik Rotamız Nasıl Olacak?

Bu içerğimizde temelde bir Asp.NET Core API uygulaması için oluşturulan docker image’inin Amazon Elastic Container Registry(ECR)‘e yüklenmesini ve AWS ECS’de nasıl barındırılabileceğini ele alıyor olacağız. Bu nedenle, öncelikle .NET API uygulamasını oluşturacak ve local’deki MongoDB örneğiyle gerekli test işlemlerini gerçekleştireceğiz. Akabinde bu uygulama için bir Dockerfile dosyası hazırlayacak ve oluşturduğumuz docker image’ini Amazon ECR’ye yükleyeceğiz. ECR’de tanımlanmış olan docker image’ini çekmek(pull) ve çalıştırmak(run) için görev tanımları(task definition) olan bir ECS Cluster oluşturacağız.

ESC’nin temel mantığı, her ECS Cluster’ın “n” task definition’a sahip olacağıdır ve buradaki her bir task definition, uygulama deploy yaklaşımımıza bağlı olarak birden fazla docker container’ı içerebilir. Task definition oluşturulduktan sonra bir servis bu görev tanımına dayalı olarak oluşturulabilmektedir. Haliyle biz, bir cluster oluşturacak ve daha sonra biri MongoDB image’ini diğeri de ECR’den .NET uygulamasını çeken iki task tanımında bulunacak ve sonrasında da bu task’ları çalıştıracak olan servislerin oluşturulmasını gerçekleştirip, uygulamayı deploy etmiş olacağız.

Şimdi gelin tüm bu süreci hep beraber tecrübe edelim…

Örnek Çalışma

Şimdi gelin içeriğimizde hedeflediğimiz konuları adım adım örneklendirmeye başlayalım.

Nihai olarak yaptıklarımızı özetlememiz gerekirse eğer;

  1. ASP.NET Core API uygulaması oluşturarak Docker image’ını oluşturduk.
  2. Oluşturulan Docker image’ını depolamak ve yönetebilmek için AWS Container Registry(ECR)’ye yükledik.
  3. Amazon ECS’de bu uygulamaya ait container’ları yönetip, koordine edeceğimiz cluster tanımında bulunduk.
  4. Veritabanı(MongoDB) container’ı için bir task oluşturduk ve cluster’da ayağa kaldırdık.
  5. Yine veritabanı(MongoDB) container’ını/task’ını çalıştırabilmek için bir servis oluşturduk ve bu servise IP tanımlayabilmek için load balancer ekledik.
  6. Oluşturulan MongoDB servisinin 27017 portuna erişim için trafik izni verdik.
  7. Uygulamayı Amazon ECS’ye deploy edebilmek için uygulamaya dair bir container barındıracak task oluşturduk ve bunu da cluster’da ayağa kaldırdık. Burada uygulamanın image’ını 2. adımda depoladığımız AWS Container Registry’den çektik.
  8. Ve son olarak uygulama task’ını çalıştıracak olan servisi oluşturup yine IP tanımlayabilmek için bu servise de load balancer ekledik.

İşte bu kadar… 🙂

İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…

Kaynaklar;
https://aws.amazon.com/tr/ecs/features/
https://codewithmukesh.com/blog/deploy-aspnet-core-web-api-to-amazon-ecs/

Not : Örnek projeyi aşağıdaki github adresinden edinebilirsiniz.
https://github.com/gncyyldz/Amazon.ESC.AspNETCore.WebAPI.Deploy.Example

Mobil sürümden çık