[ ECS — V] ECS Fargate Task Definition Oluşturma

Tahacan Atak
4 min readMay 11, 2021

--

Task definitionlar, ECS’e bir Docker containerın nasıl çalıştıracağını belirten json formatında meta verilerdir. Bizde bu bölümde bir önceki yazıda ECR reposuna göndermiş olduğumuz image ile bir task definition oluşturup detaylarını inceleyeceğiz.

ECS servisinin consolunda sağ tarafta bulunan task definitions sekmesine gidip “Create new Task Definition” dedikten sonra açılan sayfada fargate launch type seçip ilk task definition ı oluşturmaya başlayalım.

Task Definition Name: Herhangi bir isim verebilirsiniz. 255 karaktere kadar büyük ve küçük harf, sayılara,alt çizgi ve tirelere izin verir. AWS’de çalışıyorsanız önemsiz gözükse de en önemli şeylerden birisi isimlendirmeler ve taglemelerdir. Kullandığınız servisler ve kaynaklar arttıkça kötü isimlendirmeler kullandığınızda bir süre sonra bu neydi bu hangisiydi gibi problemleri çok fazla yaşabilirsiniz.

Task Role: Çalıştıracağınız taskınızda sizin adınıza AWS API’lerine istek yapmak için izinler sağlayan roldür.

Network Mode: EC2 instancelarında konumlandırılan ECS tasklarını network modeları yani ağ iletişim davranışları. Biz launch type olarak Fargate kullandığımız için awsvpc network mode’u seçili geliyor. EC2 kullansaydık host, bridge gibi network modeları mevcut. ECS eğer farklı bir ağ moduna gereksinim duymuyorsanız awsvpc kullanmanızı önerir.

awsvpc network mode çalıştıracağınız taska kendi Elastic Network Interface’ı (ENI) ve private IPv4 adresi ayırır. Bir sonraki bölümde bu bölüm oluşturmuş olacağımız task definition’ı kullanarak bir task calıştırdığımızda task’ın detaylarında atanan ENI göreceğiz.

Task Execution Role: ECS containerlarına ve Fargate agentlarına sizin adınıza istekler yapmak için kullanılan bir roldür.Örnek vermek gerekirse ECR servisinde oluşturduğumuz repodaki container imagelarını çekmemiz için gerekli izinlere sahip olan bir roldür.

Task Size: Burda taskımız için ihtiyacımıza göre Memory ve CPU değerlerini ayarlamamız gerekiyor. Bizim çalıştıracağımız container hello world gibi bir uygulama olduğu için en düşük değerler yeterli olacaktır. Biz tek bir container çalıştıracağız birden fazla container calıstırmanız gereken senaryolarda gerekli toplam CPU ve Memory ihtiyacınızı ona göre ayarlamanız gerekir.

CPU ve Memory kombinasyonları

Şimdi Container Defitinions adımına geçelim.

Container Definition

Öncelikle oluşturacağımız containera bir isim veriyoruz.

Image: Bu alan image’ımızın repo Url’ini verdiğimiz kısım. Biz container registry olarak ECR servisini kullandık. Bir önceki yazımızda oluşturduğumuz repoya giderek Image URI kopyalayıp bu alana yapıştırıyoruz.

Bizim Container Repomuzda image’ımızın sadece bir versiyonu var o da latest diye taglediğimiz versiyon. Farklı bir versiyonunuz varsa onu da kullanabilirsiniz.

Eğer ki imagenızı private olarak başka container registry’de tutuyorsanız yine aynı şekilde Image URI verip altta bulunan Private repository authentication* checkboxunu kullanarak kimlik bilgilerini sağlamanız gerekir.

Memory Limits: Burada karşımıza soft limit ve hard limit kavramları çıkıyor.
Soft limit değeri kısacası bana bu container için minumum şu kadar memory gerekli dediğiniz senaryolarda verdiğiniz değerdir.
Hard limit ise container sunulan memory miktarıdır. Eğer container verdiğiniz hard limit değerini aşarsa baybay container ölür. Bu değerlerin girilmesi mecburi değildir. Burda dikkat edilmesi gereken bir diğer noktada girilen değerlerin Task Size’da girdiğiniz değerleri aşmaması gerekir.

Port Mapping: Kısaca uygulamanız hangi portta çalışıyor sorusunun cevabıdır. Containerların trafik göndermek ya da almak için container instance’nızdaki belirttiğiniz porta erişir. Bizim uygulamamıza 80 portundan erişilir.

Environment sekmesinde gördüğünüz Essential checkboxu default olarak işaretli geliyor. Bu tam olarak şuna karşılık geliyor. Eğer bu container herhangi bir sebepten dolayı çalışması durursa taskın diğer tüm containerlarında çalışması durdurulur. Bizim senaryomuzda her taskta tek bir container calışacağı için bir önem arz etmiyor.

Son olarak logging kısmında log configuration açıp containerimizi ekliyoruz.

Task definitionda yapacağımız ayarlar bu kadardı.

Ek olarak eğer task definitionınızın JSON formatına sahipseniz task definition oluşturmak için iki seçeğiniz daha mevcut.

1 - Console ile: Create Task Definions dedikten sonra en altta Tags bölümünün hemen üstünde olan Configure via Json sekmesini açarak JSON dosyasınızı buraya yapıştırıp hızlı bir şekilde oluşturabilirsiniz.

2 - AWS CLI ile:

Dilerseniz bu iki yöntemle aşağıda sizinle paylaştığım JSON dosyası ile bu bölümde oluşturdugumuz task definition’ı hızlı bir şekilde oluşturabilirsiniz.

<account-id> ve <your-region> alanlarını kendi bilgilerinize göre doldurunuz.

Bu bölümde anlatacaklarımız bu kadardı. Bir sonraki yazıda bir cluster oluşturup bu oluşturduğumuz task definiton ile nasıl task çalıştırabilirizi inceleyeceğiz.

[ ECS — II ] Kullanılacak Servislerin Tanıtımı ve IAM Rolleri Oluşturulması (✓)

[ ECS — III] ECS Terminoloji (✓)

[ ECS — IV] Docker Imageları ECR Repositorylerinde Yayınlama (✓)

[ ECS — V] ECS Fargate Task Definition Oluşturma (✓)

[ ECS — VI] ECS Fargate Task Çalıştırma (✓)

[ ECS — VII] ECS Fargate Service Oluşturma (✓)

[ ECS — VIII] Application Load Balancer ile ECS Fargate Service Oluşturma (✓)

[ ECS — IX] Rolling Update vs Blue/Green Deployment (✓)

[ ECS — X] Github Projesini CodeCommit Reposuna Taşıma (Migrate a repo from GitHub to AWS CodeCommit) (✓)

[ ECS — XI] AWS CodeBuild Servisi ile ECS Fargate (✓)

[ ECS — XII] CodePipeline ile ECS Fargate(Rolling Update) (✓)

[ ECS — XIII] CodePipeline ile ECS Fargate(Blue/Green Deployment) (✓)

--

--