Amazon Web Services (AWS)’e GitHub taki Node.js’i AWS Pipeline ile Deploy edelim -1

Bu proje de Amazon Elastic Beanstalk’a AWS Pipeline (CI/CD) kullanarak GitHub taki Node.js kodumuzu deploy edeceğiz. Amazon Web Services’den 12 aylık ücretsiz kullanabileceğiniz bir hesap oluştura biliyorsunuz. Bu makalede üyelik oluşturmayı anlatmayacağım ama aws.amazon.com/free adresinden de 12 aylık ücretsiz kullanım özelliklerine bakabilirsiniz. O yüzden bu projeye başlamadan önce amazon web services’inden bir üyelik oluşturun. Oluştururken kredi kartınızı tanımlamanızı isteyecek ve girdiğiniz kredi kartı bilgilerinin geçerliliğini öğrenmek için geri ödemeli 1 dolar‘lık veya 1 euro‘luk çekim yapacaktır. Ayrıca projeye başlamadan önce kullanılan teknolojiler hakkında kısa özet bilgiler vereyim. Böylelikle sistemin çalışma şekli ve niçin kullandığımız daha rahat anlaşılacaktır.

AWS Elastic Beanstalk : Web, WebService ve API gibi hizmetleri Apache, Nginx, Passenger ve IIS gibi bilindik sunucular üzerinde dağıtmak ve ölçeklendirmek için kullanılan bir sunucu hizmetidir. Bunun üzerinde Java, .NET, PHP, Node.js, Python, Ruby, Go ve Docker ile geliştirilmiş web uygulamalarını ve hizmetleri yayımlaya biliyoruz. Kapasite tedariği, yük dengeleme ve otomatik ölçeklendirmeden uygulama durumunu izlemeye kadar dağıtımın her aşaması Elastic Beanstalk tarafından otomatik olarak gerçekleştirilir.

AWS Pipeline (CI/CD) : AWS’de “Continuous Integration” sürekli entegrasyon ve “Continuous Deployment” sürekli teslim (CI/CD) işlemi, otomatik derlemeleri başlatıp ardından Amazon bulut sunucularında dağıtma gibi yazılım teslim sürecimizdeki adımları otomatikleştirmemize yardımcı olur. Tanımladığınız yayın süreci modellerine bağlı olarak, tüm kod değişikliklerinde kodunuzu derleyen, test eden ve dağıtan bir hizmettir.

Pipeline için aşağıdaki Source Provider lar kullanılabiliyor.

  • AWS CodeCommit
  • Amazon ECR
  • Amazon S3
  • Bitbucket Cloud
  • GitHub

Biz bu projede GitHub daki Repository mizi kullanacağız.

Build Provider olarak ta aşağıdakiler kullanılabiliyor.

  • AWS Code Build
  • Jenkins 
görsel : https://onema.io/blog/testing-and-deploying-apps-with-github-codepipeline-elasticbeanstalk/

Yukarıdaki görsel çok güzel sistemin çalışmasını özetlemiş. onema.io dan bu görseli aldım. Tabi, bizim örneğimizde Build adımı olmayacak.

Kısa bilgilerden sonra projemize başlayalım.

Her adımı en ayrıntısına kadar anlatmaya çalıştım. Bu kadar detaylı anlatmam sıkıcı gelebilir, fakat eksik yapılan bir adımdan dolayı projeniz deploy olmaya bilir veya sonrasında projenizi update ederken problemler yaşayabilirsiniz. Bu problemleri yaşamamanız için detaylı anlatmaya çalıştım.

1) Öncelikli olarak account’umuz yok ise bir GitHub account’u oluşturalım ve login olalım.

2) GitHup account’umuz da yeni bir repository oluşturalım. Unutmamamız gereken nokta Public erişim vermeliyiz.(Bu ilk 2 adım la ilgili olarak Google da bolca örnek ve anlatım bulabilirsiniz.)

3) Bilgisayarımızda yüklü olması lazım. https://git-scm.com/ adresinden bilgisayarımızda git yok ise, git ‘i kuralım.

4) Bilgisayarınıza bu adresten https://nodejs.org/ yükleyin.

5) Command Prompt’u administrator olarak çalıştırın. (Windows çubuğundan cmd yazarak Command Prompt’u aratın farenizin sağ tuşu ile yönetici olarak çalıştırı seçin.)

6) Şimdi projemiz için bir folder oluşturacağız o yüzden Command Prompt içinde istediğiniz path’e gelin, daha sonra mkdir nodejs_v1 komutu ile nodejs_v1 adında bir klasör oluşturalım.

7) Sonra cd nodejs_v1 komutu ile klasörün içerisine girelim

8) npm init –yes ile projemiz hakkında bilgi içerecek olan package.json dosyasını oluşturalım. (Npm: Node Package Manager yani 3 parti yazılımları yüklemek için kullanır ve node.js içerisinde de yüklü olarak gelir. Komutun sonundaki yes ile dosya oluşturum aşamasındaki tüm soruları geçmek için kullanıyoruz)

9) npm install express komutu ile express i kuralım ve package.json dosyamızın içerisine dependencies (bağımlılıklarımızı) ekleyelim. (express kullanım amacımız webserver da requestlerimizi dinleme yapacağız)

10) npm install mongodb komutu ile de mongodb ‘imizi bağımlılığınıda tanımlayalım. mongodb database’ine connection yaparken kullanacağız. Bu makalede mongodb ye bağlanmayacağız bir sonraki makalede hazırlık olmuş olacak. 🙂

11) npm install nodemon komutu çalıştıralım. nodemon ile de otomatik komut değişikliğinde lokalimiz deki webserver’i otomatik refreshlemek için kolaylıklar sağlıyor.

Bu adımdan sonra package.json‘ımızın görünümü aşağıdaki gibi olacaktır.

12) Şimdi nodejs_v1 klasörümüzü Visual Studio Code ile açabiliriz. Başka editör ve IDE programları da kullanabilirsiniz.

13) Ana dizine app.js javascript dosyamızı create edelim ve aşağıdaki komutları ekleyelim.

8081 portunu dinleme yapacağımız listen ve get methodlarını eklemiş olalım. process.env.port methodu aws üzerinde enviroment’a tanımlayacağımız port değişkeninden değeri alır.

var http = require('http');

/**
 * Dinleyeceğimiz port numarasını aws içindeki environment larda PORT değişkeninden alalım. 
* Eğer Port değişkeni yok ise default olarak 8081 portunu i dinleyelim.
 */
var port = normalizePort(process.env.port || '8081');

const express = require('express');
const app = express();

/**
 * bir get apisi ile ekrana mesajımızı yazdıralım
 */
app.get('/',(req,res) => {
    res.send("Uygulama başarılı ayağa kalktı");
})

/**
 * Şimdi portumuzu dinleyelim.
 */
app.listen(port, () =>{
    console.log("port dinlemek super oldu");
});

/**
 * Port numarası yok ise false, var ise number formatında döndürmek için.
 */
function normalizePort(val) {
    var port = parseInt(val, 10);
  
    if (isNaN(port)) {
      // named pipe
      return val;
    }
  
    if (port >= 0) {
      // port number
      return port;
    }
  
    return false;
  }

14) Command Prompt ta nodemon node_v1.js komutu ile local webserver ayağa kaldırıp servis’in başarılı çalıştığını görebiliriz.

localhost:8081 adresini explorer dan kontrol ettiğimizde get methodumuzdaki “Uygulama başarılı ayağa kalktı” mesajı ekran sayfamızda görmeliyiz.

Yukarıdaki ekran görselinde olduğu gibi localhost’umuz da başarılı olarak service’in çalıştığını gördükten sonra.

15) AWS içerisinde Elastic Beanstalk oluşturalım.

AWS ye login olduk. AWS services lerinden Elastic Beanstalk‘u seçtik Create new a environment butonu ile oluşturmaya başlayalım.

a) Web server environment’i seçelim.

b) Application name olarak nodejs_v1 ismini girdik.

c) Environment ismini otomatik NodejsV1-env tanımladı. İsterseniz değiştirebilirsiniz.

d) Platform olarak Managed platform altından Node.js‘i seçtik.

e) Sample application‘ını seçelim, ilk başta örnek bir uygulama yüklensin. Application’ımızın başarılı şekilde ayağa kalktığını test etmiş oluruz. Sonra kendi geliştirdiğimiz kod ile güncelleyeceğiz zaten.

f) Create Environment butonuna bastıktan sonra 3-5 dk sonra web Server’ımız ayağa kalkacaktır.

Şimdi AWS deki Application’ınımızın altındaki Environment penceremize gidebiliriz.

Şimdi servisimizi kontrol için yukarıda ki görseli inceleyelim Upload and deploy butonu ile buradan kod güncellemesini manuel yapılabilir. Fakat buradan yapacağınız yüklemelerde servis’imiz de versiyonlamada sıkıntılar yaşamamız mümkün. Biz repository’imizdeki branch’imize push yaparak Continuous Deployment’ı zaten yapacağız. Environment actions ile servisimizin restart, rebuild veya terminate gibi farklı aksiyonlarını da gerçekleştirebiliyoruz.

1. numara ile de belirttiğim kısımdaki Health ile servisimizin sağlıklı OK aldığını da gördükten sonra 2. kısımda belirttiğim NodeV1-env altındaki environment ismine göre oluşmuş olan url’imize http://nodejsv1-env.eba-iv7ar4xf.eu-west-1.elasticbeanstalk.com/ tıkladığımızda ilk başta yüklediğimiz sample application web sayfamızın da aşağıdaki gibi sağlıklı çalıştığını gördük.

f) Environment altındaki Configuration segmesinin altında Software kısmındaki Edit butonu tıklayalım. Bu kısmın en altında Environment properties lere Name kısmında : port ve Value değerine de 8081 i yazıp Apply edelim.

16) Şimdi bilgisayarımızdaki işlemlerimize devam etmek için Command Prompt’umuz da nodejs_v1 path’imizin içinde iken

git init komutuzu çalıştıralım. (git init komutu ile .git adında bir dizin oluşturur ve bir folder’ımızı Git repository’si haline getirir)

17) npx gitignore nodejs_v1 komutunu çalıştıralım ve git reposundan hariç tutulacak dosyaların listesini, repo ana dizinde bulunan ayar dosyasını oluşturmuş olalım.

18) GitHub da repomuzu oluşturduktan sonra bize Command Prompt ta yeni repomuz için verilen kırmızı ile işaretlediğim komutları sıra ile çalıştıracağız. Sizin dolayısı ile repo url’iniz git remote add origin https://github.com/cihankarsak/nodejs_v1.git bundan farklı olacaktır.

Kendi repo url’inizi yazın.

19) GitHub da master Branch’inin altında dosyalarımızın push edildiğini kontrol edelim.

20) Artık herşey hazır şimdi Pipeline’nımızı oluşturabiliriz. Pipeline ile de GitHup a push ettiğimizi kodun webhooks ile otomatik Elastic Beanstalk deploy olmasını sağlayacağız. Amazon Web Services te Developer Tools altında CodePipeline ‘i seçtik ve Create Pipeline butonuna tıklayalım. Ve 5 adımda Pipeline’i tanımlayalım.

a) Choose pipeline settings

Pipeline name: nodejs_pipeline olarak belirledik ve New service role seçtik, Role name’ini değiştirmedik ve Next butonu ile ilerleyelim.

b) Add source stage

Source Provider olarak GitHub ‘ı seçtik. Altındaki Connection butonuna tıklayıp açılan popup ekranından GitHub account’una login olduk. Artık Repositorylerimiz listelenebilir ve oluşturmuş olduğumuz Repo yu ve Brach’i seçelim. Pipeline’i otomatik tetiklemesi için GitHub webhooks‘u seçtik ve Next butonuna tıklayalım.

c) Add build stage

Bu adımda bir build işlemi yapmacağımız için Skip build stage butonu ile bu adımı geçelim.

d) Add deploy stage

Deploy provider olarak AWS Elastic Beanstalk ‘ı seçtik, Region için Ireland‘dayı seçtim siz farklı konumlar seçebilirsiniz. Application name’de önceden oluşturduğumuz nodejs_v1 ‘i ve Environment name olarakta NodejsV1-env yi seçip Next butonundan sonra.

Özet ekranında tüm seçimlerimizi kontrol edebiliriz. Artık Create pipeline tıkladıktan sonra Source ve Deploy işleminin tamamlanmasını bekleyelim.

Source ve Deploy işlemi tamamlandı, GitHub taki kodumuz Elastic Beanstalk’a Deploy oldu.

Servisimiz sağlıklı çalışıyor. URL’e tıklayıp test edelim.

Başarılı sonucu da gördük. Artık kod değişikliğimizi yapıp push yaptığımızda otomatik olarak geliştirmemiz Deploy olacak. Pipeline farklı özellikler ve TestCase leri Build Process leri de ekleyebiliyorsunuz.

Son olarak package.json a aşağıdaki bazı eklemeler yapacağız.

  • “private”: true, tag ve değerini ekleyin
  • “scripts” tag’inin altına “start”: “node app.js”, da ekleyin.

Her kod yayımlanmadan önce aşağıdaki adımları yaparsanız. Sıkıntı yaşamadan Deploy işleminiz gerçekleşecektir.

  • package.json içerisindeki “version”: “1.0.0” ı güncelle
  • npm install
  • git add .
  • git commit -m “comment’i gir”
  • git push origin master

Eğer versiyon artırımları yapmazsanız, versiyonlama ile ilgili hatalar almanız çok mümkün. O yüzden mutlaka versiyon artırımı yapıp npm install komutunu çalıştırmayı unutmayın.

Bir not daha 502 Bad GateWay hatası alıyorsanız.
Environment altındaki Configuration segmesinin altında Software kısmındaki Edit butonu tıklayıp, Environment properties’e tanımadığımız port tanımını mutlaka kontrol edin veya app.js içerisindeki port tanımlarınızı mutlaka kontrol edin.

Uzun bir makale oldu ama sonucu görünce mutlu olacaksınız. Bir sonraki makale de ExpressJs‘i de implemente edip, oluşturduğumuz API yi AWS’ye Deploy edeceğiz. MongoDB database’ine bağlantı sağlayacağız.

Leave a Comment

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir