Django Uygulaması Elastic Beanstalk'ta Nasıl Yayına Alınır?

Bu makalede AWS Elastic Beanstalk servisi üzerinde Django uygulamalarının nasıl deploy edildiği anlatılmaktadır.

İçerik

  1. Ön Koşullar
  2. Python Sanal Ortam Konfigürasyonu
  3. Django Projesi
  4. Django Uygulamasının Elastic Beanstalk için Konfigürasyonu
  5. Uygulamanın EB CLI ile Yayına Alınması
  6. Referanslar

Ön Koşullar

Bu makaleye devam etmeden önce aşağıdakilerin yüklü olması gerekmektedir.

  • Python 3.7 ya da sonrası
  • pip
  • virtualenv
  • awsebcli

Python Sanal Ortam Konfigürasyonu

virtualenv kullanılarak önce bir sanal ortam oluşturacağız. Daha sonra bu ortamı kullanarak django yükleyeceğiz. Sanal ortam kullanarak, uygulamamızın tam olarak hangi paketlere ihtiyaç duyduğu kolayca anlaşılmakta ve böylelikle Amazon EC2 uygulamamızın gerektirdiği paketleri yüklemektedir. Aşağıda sırasıyla unix tabanlı ve windows tabanlı sistemler için sanal ortam oluşturma adımları özetlenmektedir.

  1. eb-virt isimli bir sanal ortam oluşturalım.

    a. Unix Tabanlı

    ~$ virtualenv ~/eb-virt
    

    b. Windows

    C:\> virtualenv %HOMEPATH%\eb-virt
    
  2. Sanal ortamı aktifleştirelim.

    a. Unix Tabanlı

    ~$ source ~/eb-virt/bin/activate
    

    b. Windows

    C:\>%HOMEPATH%\eb-virt\Scripts\activate
    
  3. pip kullanarak Django yükleyelim.

pip install django
  1. Django kütüphanesinin yüklendiğini teyit etmek için aşağıdaki kodu çalıştıralım.
pip freeze

Bu kodu çalıştırdıktan sonra sanal ortamımızda yüklü olan tüm kütüphaneleri göreceğiz ve eğer Django düzgün yüklenmiş ise onu da listede göreceğiz. Daha sonra bu kodun çıktısını Elastic Beanstalk’un konfigürasyonu için kullanacağız.

Django Projesi

Şimdi, Django projemizi sanal ortamımızda oluşturmak için hazırız.

  1. Eğer sanal ortamımız aktif değilse daha önce gösterildiği üzere sanal ortamımızı aktif edelim.

  2. Şimdi aşağıdaki kodu kullanarak ebdjango isimli bir django projesi oluşturalım.

django-admin startproject ebdjango

Bu komut ebdjango isimli standart bir Django projesi oluşturur ve bu projesi dizin yapısı aşağıdaki gibidir.

~/ebdjango
  |-- ebdjango
  |   |-- __init__.py
  |   |-- settings.py
  |   |-- urls.py
  |   `-- wsgi.py
  `-- manage.py
  1. Daha sonra django uygulamamızı aşağıdaki gibi çalıştıralım.
cd django
python manage.py runserver
  1. Şimdi bir web browser’ında http://127.0.0.1:8000/ linkine gidelim.

  2. Sunucuyu çalıştırdıktan sonra çıktısına bakılabilir ve ağ sunucusunu durdurmak için Ctrl+C tuşları kullanılabilir.

Django Uygulamasının Elastic Beanstalk için Konfigürasyonu

Artık, django uygulamamızı lokal makinemizde çalıştırabildiğimize göre Elastic Beanstalk konfigürasyonumuza geçebiliriz. Default olarak, Elastic Beanstalk uygulamamızı başlatmak için application.py isminde bir dosya arar. Bu dosya oluşturduğumyz Django projesi ile hazır olarak gelmediği için bizim bazı düzenlemeler yapmamız gerekir.

Bu konfigürasyon için;

  1. Öncelikle sanal ortamımızı aşağıda belirtilen kod ile aktifleştirelim.

    a. Unix Tabanlı

    ~/ebdjango$ source ~/eb-virt/bin/activate
    

    b. Windows

    C:\Users\USERNAME\ebdjango>%HOMEPATH%\eb-virt\Scripts\activate
    
  2. Şimdi pip freeze komutunu çalıştırıp çıktılarını reqirements.txt isimli dosyaya kaydedelim. Bu çıktılar sanal ortamımıza yüklü olan kütüphanelerin listesi ve versiyonlarını içerecektir. Elastic Beanstalk bu dosyayı EC2 makinesi üzerine hangi paketleri yükleyeceğini belirlemek için kullanıyor.

(eb-virt) ~/ebdjango$ pip freeze > requirements.txt
  1. Şimdi .ebextensions isimli bir klasör yaratalım.
(eb-virt) ~/ebdjango$ mkdir .ebextensions
  1. .ebextensions isimli klasörün içine django.config isimli bir dosya ekleyelim ve bu dosyanın içine aşağıda yer alan kodları kopyalayalım.
option_settings:
  aws:elasticbeanstalk:container:python:
    WSGIPath: ebdjango.wsgi:application

Bu ayar, Elastic Beanstalk için WSGI betiğinin lokasyonunu belirler ve EB bunu uygulamamızı başlatmak için kullanır.

  1. Sanal ortamımı deaktif hale getirelim.
(eb-virt) ~/ebdjango$ deactivate

Uygulamamıza yeni paketler eklemek istediğimizde ya da lokalde uygulamamızı çalıştırmak istediğimiz zamanlarda sanal ortamımızı yeniden aktifleştirmemiz gerekir.

Uygulamanın EB CLI ile Yayına Alınması

Uygulamamızı Elastic Beanstalk ile yayınlayabilmek için gereken her şeyi ekledik ve böylelikle uygulamamızın klasörünün aşağıdakine benzemesi gerekmektedir.

~/ebdjango/
|-- .ebextensions
|   `-- django.config
|-- ebdjango
|   |-- __init__.py
|   |-- settings.py
|   |-- urls.py
|   `-- wsgi.py
|-- db.sqlite3
|-- manage.py
`-- requirements.txt

Bundan sonra, uygulama ortamımızı yaratacağız ve Elastic Beanstalk konfigürasyonu tamamlanmış uygulamamızı yayına alacağız.

Deployment’tan hemen sonra, Elastic Beanstalk tarafından verilen domain adımızı Django ayarlarında yer alan ALLOWED_HOSTS kısmına ekleyeceğiz. Daha sonra, uygulamamızı tekrar deploy edeceğiz.

Uygulama ortamını yaratıp, uygulamamızı deploy etmek için;

  1. eb init komutu ile EB CLI repomuzu oluşturacağız.
~/ebdjango$ eb init -p python-3.7 django-tutorial
Application django-tutorial has been created.

Bu komut django-tutorial isminde bir uygulama oluşturacaktır.

  1. (İsteğe bağlı) eb init kodunu tekrar çalıştıralım ve bir anahtar pair’i oluşturalım ki uygulamızı çalıştıran EC2 instance’ına SSH kullanarak bağlanabilelim.
~/ebdjango$ eb init
Do you want to set up SSH for your instances?
(y/n): y
Select a keypair.
1) my-keypair
2) [ Create new KeyPair ]

Eğer daha önceden oluşturulmuş bir key pair’imiz varsa onu seçebiliriz yoksa yeni bir tane oluşturmak üzere komutları takip edebiliriz.

  1. Bir ortam oluşturalım ve uygulamızı eb create komutu ile deploy edelim.
~/ebdjango$ eb create django-env

Bu komut django-env isminde bir Elastic Beanstalk ortamı oluşturacaktır. Bu ortamın oluşması yaklaşık olarak 5 dakika sürecektir. Elastic Beanstalk uygulamamızı çalıştırmak için gerekli olan kaynakları oluşturdukça konsola bununla ilgili bilgilendirici mesajlar düşecektir.

  1. Ortam oluşturulduktan sonra eb status kodunu çalıştırarak Elastic Beanstalk tarafından uygulamamıza atanan alan adını görebiliriz.
~/ebdjango$ eb status
Environment details for: django-env
  Application name: django-tutorial
  ...
  CNAME: eb-django-app-dev.elasticbeanstalk.com
  ...

Alan adımız CNAME anahtarının değeridir.

  1. Şimdi, ebdjango klasörümüzde yer alan settings.py dosyasını açıp yukarıda aldığımız alan adını ALLOWED_HOSTS kısmına ekleyebiliriz. Eğer bu kısım yoksa aşağıdaki kodu bu dosyaya ekleyelim.
...
ALLOWED_HOSTS = ['eb-django-app-dev.elasticbeanstalk.com']
...
  1. Artık uygulamamızı eb deploy komutu ile yayına alabiliriz. Bu komutu çalıştırdığımızda EB CLI projemizin içeriğini toparlar ve daha önceden oluşturduğumuz ortam üzerinde deploy eder.
~/ebdjango$ eb deploy
  1. Ortamın güncellenmesi tamamlandığında aşağıdaki komutu çalıştırarak internet sayfamızı açabiliriz.
~/ebdjango$ eb open

Bu komut ile bir internet tarayıcısı açılacak ve alan adımıza yönlendirileceğiz. Bu aşamada, eğer herhangi bir sorun yoksa lokalimizde oluşturduğumuz Django projemizi ve web sitemizi görmeliyiz.

Referanslar

  1. AWS Docs, Deploying a Django application to Elastic Beanstalk