AWS CodeDeploy ile Maviden Yeşile Kusursuz Bir Geçiş

Arda Batuhan Demir
Cloud Türkiye
Published in
6 min readAug 29, 2022

Selamlar Herkese;

Bu yazıda AWS’in yönetilen servislerinden (managed-service) birisi olan ve günlük hayattaki özellikle de deployment alanındaki yaşadığımız problemleri minimum’a indirgeyen ve günün sonunda dünya standartlarında geliştirdiğimiz rekabetçi ürünlerimizi artık belli başlı standartlara ve prosedürlere göre canlıya çıkarmak zorundayız…

Geçmişte ve günümüzde olduğu gibi gelecekte de her zaman ön planda olması gereken şeylerden birisi günün sonunda ortaya çıkacak olan kurguladığımız üründür.Kurguladığımız veya planladığımız ürünün başarısı ise stabil, kesintisiz ve sürdürülebilir bir şekilde yönetilebiliyor olmasıdır.

Ürünlerimizin başarısını sürdürülebilir kılmak ve kesintisiz deploymentlar (zero-downtime deployment) yapabilmek ve dolayısıyla da yazılım dağıtımlarını otomatik hale getirerek hata toleransını (fault tolerance) yükselten yeni hizmetler ortaya çıkarmaktadır. Bu kapsamda Amazon Web Service (AWS)’in Kasım 2014’de hizmete aldığı ve 2018 yılı itibari ile birden fazla deployment stratejisinin yönetimini de içeren ve AWS’deki bir çok servis ile uyumlu çalışabilen AWS CodeDeploy’un iki farklı versiyon arasında geçişi nasıl yaptığını ve Deployment Stratejileri arasındaki farkları inceliyor olacağız.

İlk olarak AWS CodeDeploy ve CodeDeploy’un sahip olduğu özellikleri tanıyarak başlayabiliriz;

AWS CodeDeploy Nedir ?

AWS CodeDeploy Getting Started

AWS CodeDeploy, Amazon Web Service’in DevTools ailesinde yer alan ve EC2, Fargate, Lambda gibi şirket içinde çalışan servis hizmetlerine paket dağıtımlarını otomatikleştiren ve tam olarak yönetilen bir dağıtım hizmetidir.AWS CodeDeploy, hızlıca yeni feature’ları canlıya almamızı kolaylaştırır ve uygulama dağıtımı sırasında downtime süresinden kaçınmamıza yardımcı olur ve uygulamalarımızın güncellenmesi sırasında gerekli olan tüm karışık argümanları yönetilen hizmetler kapsamında gerçekleştirmektedir.AWS CodeDeploy ile yazılım dağıtımlarını otomatik hale getirerek aslında manuel olarak gerçekleştirilen işlemleri hatalara açık işlemlere duyulan gereksinimi ortadan kaldırır.Burada bizlere sunulan hizmet aslına bakarsanız, dağıtım gereksinimlerini karşılayacak şekilde ölçeklenmektedir.

AWS CodeDeploy’un Sağladığı Avantajlar Neler ?

  • Otomatik dağıtımlar

AWS CodeDeploy’un sağladığı avantajlara değinebilmek gerekirse; AWS CodeDeploy canlıya çıkacak olan paketlerimizi tam otomatik hale getirerek güvenilir, hızlı ve sürdürülebilir bir şekilde dağıtımı gerçekleştirmemize olanak sağlar.

  • Minimum Downtime

AWS CodeDeploy ile yazılım dağıtım süresi boyunca canlıya çıkacak olan paketimizin erişilebilirliğinin en üst düzeyde kalmasına yardımcı olur.Değişiklikleri adım adım olarak uygular ve uygulama durumunu yapılandırılabilen kurallara göre izler.Herhangi bir hata olması durumunda yazılım dağıtımlarını kolayca durdurulup geri alınabilir (Rollback).

NOT: AWS CodeDeploy default’da bir önceki versiyonu yaklaşık olarak 1 saat gibi bir süre ayakta tutmakta ve canlıda karşılaştığınız bir problemde bir önceki versiyona geri dönmek istediğinizde sadece ‘Stop and Rollback Deployment’a basarak aslında bir önceki versiyona trafiğimiz aktarabiliyoruz.

  • Sürdürülebilir Entegrasyon

AWS CodeDeploy platformdan ve dilden bağımsız olarak tüm uygulamalarla çalışabilecek bir şekilde tasarlanmıştır ve Amazon EC2, AWS Fargate veya AWS Lambda’ya dağıtım yapıyor olmanızdan bağımsız olarak her serviste aynı tutarlılığı sağlamaktadır. AWS CodeDeploy, mevcut yazılım yayınlama süreciniz veya pipeline süreciniz ile entegre çalışabilir (Örneğin: AWS CodePipeline, Github Action, Jenkins, Bamboo, Gitlab gibi…)

AWS CodeDeploy Argümanları

AWS CodeDeploy’un sahip olduğu Deployment Stratejilerine geçmeden önce, CodeDeploy’un içerisinde yer alan argümanlara ve özelliklerine kısa değinelim.İlk olarak Developer Tools kategorisinde tab bölümünde CodeDeploy karşımıza çıkmakta.

Eğer ilk defa bir CodeDeploy uygulaması yaratılmak isteniyorsa, ‘Create Application’ seçeneği ile yaratılacak olan uygulamamıza belirlenen ismi verdikten sonra, beraber çalışacağı servisi yine aşağıdaki gibi seçebiliriz.

Eğer ki Elastic Compute Service (ECS) gibi bir ‘container orchestration’ aracı kullanıyorsak ilgili ECS Cluster’ının Servisi yaratılırken, ‘deployments’ bölümünde yer alan deployment tipinde Blue/Green Deployment seçeneğini seçecek olursak, AWS sizin için CodeDeploy tarafında hem ilgili application’ı yaratmış oluyor hem de ilgili application’a ait olan Deployment Group’unu yaratmış oluyor.Aşağıda yer alan resimde de görüldüğü üzere Blue/Green Deployment seçeneğini seçtikten sonra, deployment ile ilgili yer alan AWS CodeDeploy tarafındaki hazır template’lerden birisini seçebiliyorsunuz.

NOT: Deployment Configuration’lardan birisi seçildikten sonra, AWS CodeDeploy tarafında bu konfigürasyonu override edebilirsiniz.

AWS CodeDeploy Deployment Stratejileri

Bu kısımda AWS CodeDeploy içerisinde yer alan Deployment Stratejilerinden bahsediyor olacağız ve örnekte Elastic Container Service (ECS)’i baz alarak ilerlediğimiz için ECS tarafındaki konfigürasyonları ele alacağız, fakat dilerseniz Working with deployment configurations in CodeDeploy sayfasından farklı tipteki servisler içinde yapılandırılan konfigürasyonlara göz atabilirsiniz.

AWS ECS için ön-tanımlı AWS CodeDeploy konfigürasyonları şu şekilde:

  • CodeDeployDefault.ECSLinear10PercentEvery1Minutes : Tüm trafik yeni versiyona aktarılana kadar; her dakikada trafiğin yüzde 10'unu değiştir.
  • CodeDeployDefault.ECSLinear10PercentEvery3Minutes: Tüm trafik yeni versiyona aktarılana kadar; her üç dakikada bir trafiğin yüzde 10'unu değiştir.
  • CodeDeployDefault.ECSCanary10Percent5Minutes: İlk fazda trafiğin yüzde 10'unu yeni versiyona aktar; kalan yüzde 90'nı beş dakika sonra aktar.
  • CodeDeployDefault.ECSCanary10Percent15Minutes: İlk fazda trafiğin yüzde 10'unu yeni versiyona aktar; kalan yüzde 90'nı on beş dakika sonra aktar.
  • CodeDeployDefault.ECSAllAtOnce: Tüm trafiği yeni versiyona geçir.

AWS CodeDeploy PoC

İlk etapta aktif olarak çalışan bir backend servisimizin olduğunu varsayalım ve hali hazırdaki servisimiz canlıda çalışmakta ve AWS Application Load Balancer ile de trafiği karşıladığını varsayımda bulunalım…

Backend Service V1

Yeni versiyon için image’ınızı oluşturdunuz ve hali hazırda taglenmiş halde Elastic Container Registry’de (ECR) olduğunu da varsayabiliriz..

Ve artık AWS CodeDeploy tarafında Applications bölümünden ECS tarafında yaratılan ilgili Deployment Group’una gelerek yeni bir deployment yaratmaya hazırız.

Deployment Group Info

Bu kısımda bizi ‘Revision Type’ olarak nitelendirilen deployment ile ilgili yer alan tüm argümanların tutulduğu dosyaya verdiğimiz isimdir.AWS CodeDeploy tarafında iki seçeneğimiz bulunmakta; ilki bu revision type’ının Amazon S3 üzerinde tutulması ve ikinci bir seçenek olarakta AppSpec editör kullanarak bu revision type’ının düzenlenebilmesidir.

NOT: Pratikte bu deployment’ın yine AWS’in yönetilen hizmetleri kapsamında CodePipeline kullanılarak yapılıyor olması veya diğer CI/CD araçları kullanılarak da tetiklenmesi ideal çözümlerden birisidir…Bu seçenek aslında günün sonunda ürününüzün çıktısına ve ekibinizin yapısına bağlı olarak değişecektir.

Bu bölümde AppSpec editörü kullanarak, Elastic Container Service (ECS)’deki yer alan task definition’nın arn’inini vererek; yeni geçilecek versiyondaki task’ımızın hedef alındığını belirtiyoruz.

Appspec.yaml’ımızı aşağıdaki gibi düzenleyebiliriz.

version: 0.0
Resources:
- TargetService:
Type: AWS::ECS::Service
Properties:
TaskDefinition: "arn:aws:ecs:eu-central-1:XXXXXXXX:task-definition/arda-demo:2"
LoadBalancerInfo:
ContainerName: "arda-demo"
ContainerPort: 8080
PlatformVersion: "LATEST"
Revision Types

Hatırlayacağınız üzere; yukarıda Deployment Configuration’nın override edilebileceğinden söz etmiştik.Bu kısımda CodeDeployDefault.ECSCanary10Percent5Minutes seçerek İlk fazda trafiğin yüzde 10'unu yeni versiyona aktarıp sonrasında kalan yüzde 90'nı beş dakika sonra aktar diyebileceğiz.

Deployment Group overrides

Create Deployment’a bastıktan sonra; tüm revision type içerisindeki argümanlar doğru girildiyse, deployment’ımız başlatılmış olacaktır.

Deployment başarılı bir şekilde başlatıldı.

İlk fazda trafiğimizin yüzde 10'unu yeni versiyona aktarmış bulunmaktayız.

Trafiğin yüzde 10'u hali hazırda aktarılmış durumda

Elastic Container Service (ECS)’in önünde bulunan Application Load Balancer’ımız aslında; ELB’deki target group’a ping atmakta ve geriye bir response döndükten sonra Elastic Load Balancer’daki karşılığı olarak ‘healthy’e dönmüş oluyor…Dolayısıyla da yeni versiyondaki backend service’imiz ayakta ve ulaşabilmekteyiz.

Deployment Status

Yeni versiyona geçiş yaptığımızda yine aynı domainden veya ELB kaydından yeni versiyondaki backend service’imize erişebilmekteyiz.

Backend Service V2

BONUS

Canlıya çıktınız ve sistemde herhangi bir hata gözükmemekte.Bir varsayımda daha bulunalım ve canlıya çıktıktan 5 dakika sonra ekibimizden bir arkadaşımızın uyarısı ile production’da end-user’a gösterilmemesi gereken bir info’yu veya backend service’imizde bir bug’ımızın olduğunu varsayalım.

Bu durumda AWS CodeDeploy bir önceki versiyonu by-default’da yaklaşık olarak 1 saat boyunca ayakta tutmakta ve aşağıdaki resimde de görüldüğü üzere ‘Stop and roll back deployment’a bastığınızda sizin için bir önceki versiyona hemen geçiş yapıyor olacaktır.

Stop and rollback deployment
Rollback deployment status

Keyifli olabilmesi dileğiyle!

Github : https://github.com/arbade/aws-demo-day

--

--

Arda Batuhan Demir
Cloud Türkiye

5x AWS Cert* | Senior DevOps Engineer | Cloud Architect | AWS Community Builder