AWS EC2 Nedir? Django Uygulamasını AWS’de EC2 ile Yayınlamak

Standard

Herkese merhabalar,

Yakın zamanda AWS ile hayli haşır neşir olmaya başlamamın ardından, “bir Python Developer olarak AWS’yi nasıl kullanabilirim?” sorusuna da derli toplu cevap bulamadığımı farkettim. Felsefe bellidir, “Ya bir yol bulursun, ya bir yol yaparsın.” Hadi başlayalım 🙂

EC2 Nedir?

AWS’in temel yapı taşlarından birisi olan EC2 aslında AWS’in en eski hizmetlerinden birisi. Standart bir uygulamada eğer cloud ortamında değilsek, uygulamamızı sunucuya kurar, yayına almak için de CI/CD sürecini tetiklerdik. EC2 için CD sürecinde uygulamamızı yüklediğimiz ortam diye özet bir tanım yapabiliriz. Tabii EC2’nun bize kattığı avantajlar onu neden kullanmamız gerektiğini açıklamak için en doğru yol olacaktır. EC2 bize uygulamamızı (neredeyse) sınırsız bir şekilde ölçeklendirmemize, güvenlik kuralları tanımlamamıza, dışarıya veya kendi ekosistemimiz içerisinde yayınlamamıza imkan tanıyan, bildiğimiz GNU/Linux (ve/veya tercihe göre değişebilecek şekilde OS katmanı sağlayan) ortamı sağlayan sanal bir sunucu.

EC2’yu avantajlı kılan en önemli etmenlerin başında ölçeklendirilebilmesi gelmekte;

Yatayda / Dikeyde Ölçekleme

Türkçe’yi katletmemek adına böyle isimlendirmiş olsamda hepimizin plaza İngilizce’sinden aşina olduğu “scaling” kavramının en kolay çözümlerinden birisini AWS bizlere sunmakta. Bu ölçeklendirmeyi yaparken sunucu güncellemeleri, bakım masrafları gibi problemler ile de bizi uğraşmadığı için ekstra avantaj sağlıyor. EC2 ile dikeyde ölçekleme yapmak istediğimizde uygulamamızı yüklediğimiz EBS(Elastic Block Storage) ortamımızı diğer EC2’ya bağlayıp daha yüksek donanımlı bir sunucu(aslında EC2 🙂 ) ya geçirmek mümkün. Yatayda ölçekleme yapmak ise daha kolay, çünkü ASG yani Auto Scaling Group sayesinde, bir uygulamanın minimum kaç instance ile çalışacağını, yük altında kaç instance ayağa kalkacağını ve yük bittikten sonra kaç instance’a düşeceğini de yine ASG konfigürasyonu ile sağlayabiliyoruz. Daha detaylı bilgi almak için şuraya göz atabilirsiniz.

İsteğe göre veya Rezerve Ederek Ölçekleme

Bir üst başlıkta bahsettiğim ölçeklemenin aslında 2 yöntemi var;

  1. Uygulama yük altında olduğunda uygulamayı büyüt (daha eknonomik)
  2. Uygulama için her daim istenilen miktarda EC2 yu hazır tut ve kullan. (maliyetli ama daha stabil)

Her Daim Ayakta ve Güvenilir

Bir sunucu ayağa kaldırdığınızda Devops tarafı ile her daim başınız bir miktar ağırır, “Bu sunucu neden gerekli? sunucunun donanım özellikleri neler olacak? hangi portlar açık olacak? kimler erişecek?…” gibi birçok soru ile baş etmek durumunda kalıyoruz. EC2 için bunların hepsinin kontrol altında olduğu, bakım sürecine de ihtiyaç duymadığımızı düşünürsek çok daha stabil bir ortam sunduğunu da söyleyebiliriz. Tabii bu arada EC2 ortamının güvenliğinden de AWS büyük oranda mesul (yine de parolanızı, erişim için tüm portlarınızı açık bırakırsanız, AWS’in yapacağı çok birşey kalmaz 🙂 )

Diğer Alt Teknolojiler ile Direkt Uyum

Bu aslında diğer avantajlarından çok daha kritik ve önemli, ancak makalenin konusunun dağılmaması adına detaylarını bir başka makaleye bırakarak yüzeysel anlatmak istiyorum. Diyelim ki bir web uygulamanız var, pek tabii veritabanına, bir önbellek katmanına, dosyalarınızı saklamak için bir depolama alanına ihtiyaç duyarsınız. En temel ihtiyaçlar olan bu saydıklarımı, AWS ortamında karşılamak isterseniz, ortam olarak EC2, önbellek olarak Elasticache, veritabanı olarak RDS, dosyalarınızı saklamak içinse S3 kullanabilirsiniz. Bu ortamları ayağa kaldırıp birbirleriyle haberleştirmenizse en fazla 1 saatinizi alır (tüm konfigürasyonların temel olduğunu varsayıyorum). Böyle bir altyapı bare-metal yani kendi sunucu ortamınızda ayağa kaldırılacak olsa muhtemelen günler sürecektir.

Bu kadar AWS, EC2 açıklamasından sonra, varolan bir Django uygulamamızı artık neden EC2 ile ayağa kaldırmamız gerektiğini anladığımıza göre, nasıl yapacağımızı öğrenmeye başlayabiliriz.

Django Uygulamasını EC2 üzerinde Yayına Alma

Uygulamamızın basit olması amacıyla tek bir uç noktası olan, anasayfasında varsayılan django index’ini gösteren bir django uygulaması kullanıyorum. Uygulamamızın production ortamında çalışması için gereken ayarları yaparak başlıyoruz,

Settings altındaki “ALLOWED_HOSTS” kısmını “*” ile yani gelen tüm istekleri cevaplayacak şekilde değiştiriyoruz.

Web uygulamamızın gerekli paketlerini EC2 ortamında kurabilmek için “pip freeze > requirements.txt” komutuyla, bağımlılıkları requirements.txt’ye yazdırıyoruz.

Uygulamamızı test etmek için “python manage.py runserver 8000” diyerek lokal ortamda ayağa kaldırıyoruz;

Uygulamamızı istersek bu adımda Github’a yükleyebilir, böylece sunucuya dosya aktarımı zahmetinden kurtulabiliriz, ancak ben direkt sunucuya bir dosya gönderiminin nasıl olduğunu da göstermek istediğimden, lokal ortamımdan aktararak ilerleyeceğim.

EC2 Instance Oluşturma

AWS’ye giriş yapıyoruz. Arama çubuğundan EC2 aratıp, EC2 sekmesine geçiyoruz;

Burada test amaçlı kurulum yaptığımız için, ücretsiz versiyon olan “t2.micro” yu ve işletim sistemi tercihi olarakta ubuntu’yu seçiyoruz;

Eğer daha önce oluşturmadıysanız, dosya aktarımı yapabilmek için Key Pair kullanarak SSH bağlantısı üzerinden dosyamızı aktaracağız. Nasıl Keypair oluşturacağınıza şu makaleden bakabilirsiniz.

Keypair seçimi yapmazsanız sunucunuza SSH ile ulaşmanız güvenlik sebebiyle mümkün olmayacaktır.

Network ayarları kısmında ise, EC2 instance’ımıza hangi portlardan erişilebileceğini ayarlamamız gerekiyor. Bu adımda HTTP ile ilerlelemek için HTTP erişimi ve sunucuya bağlanmak için de SSH bağlantısını açıyoruz;

EC2’yu başlatıp, hazır olması için kısa bir süre bekliyoruz. Burada önemli bir nokta, ayağa kaldırmak için komut verdiğiniz EC2 hemen hazır olmuyor, dolayısıyla bu sürede EC2 instance ınıza ulaşmaya çalışırsanız hata alırsınız;

“Instance State” kısmında “Running” yazısını gördüğümüzde, herşey yolunda ve EC2 konteyner’ımız hazır demektir. EC2’ya bağlanarak başlıyoruz, ID’ye tıklayarak sağ üstteki connect yazısını seçiyoruz ve seçenekler arasından “SSH Client” sekmesine geçiyoruz;

Şimdi bağlantımızı test ettiğimizde EC2 instance’a bağlanabiliyor olmalıyız;

her zaman olması gereken yeni bir GNU/Linux ortamına bağlanıldığında paketlerinizi güncellemenizdir, bu sayede eski kalan versiyona sahip paketleri de güncellemiş ve bunlar nedeniyle hata alma olasılığınızı ortadan kaldırmış olursunuz, ayrıca ihtiyacımız olan pip paket yöneticimizi de kuruyoruz;

sudo apt update && sudo apt -y upgrade
sudo apt install python3-pip

Şimdi lokal ortamımızda bulunan projemizi EC2 ortamına aktaracağız. Bunun için “scp” yani Secure Copy Protocol komutunu kullanacağız, bu sırada PEM dosyamızı da ekleyerek, sunucuya yetkili birisi olarak eriştiğimizi de belirtmeliyiz;

scp -i [KEYPAIR_FILE].pem -r [project_file_name ] ubuntu@[EC2-name].compute-1.amazonaws.com:/home/ubuntu/

Kodu biraz inceleyerek olursak, “-i” parametresi ile pem dosyamızın dizinini gösteriyoruz. Projenin olduğu dizini “project_file_name” kısmına koyuroruz, son olarak EC2 ortamında hangi adrese aktarılmasını istediğimizi belirtiyoruz, “-r” parametresi ile recursive yani belirttiğimiz dizin altındaki tüm dosyaları taşımak istediğimizi belirtiyoruz. Herşey yolundaysa şöyle bir çıktı görüyor olmalısınız;

Bu adımdan sonra, karşımızda herhangi bir GNU/Linux sunucu var ve onun üzerinde projemizi ayağa kaldırıyormuş gibi davranabiliriz. Bir servis olarak tanımlayabilir ya da manage.py üzerinden çalıştırabiliriz. Konuyu dağıtmamak adına test amaçlı, projenin bağımlılıklarını EC2 ortamında yükleyip, projemizi 80 portundan yayına alıyoruz;

sudo su
pip install -r requirements.txt
python manage.py makemigrations
python manage.py migrate
python manage.py runserver 0.0.0.0:80 &

Herşey yolundaysa tekrar AWS’ye dönüyor, EC2 instance’ımızın URL adresini alıyoruz;

Adrese ulaştığımızda django arayüzümüzü görüyoruz;

Örnek projeye (eğer eriniyorsanız 🙂 ) buradan ulaşabilirsiniz.

Bir sonraki yazım da görüşmek üzere 🙂

One thought on “AWS EC2 Nedir? Django Uygulamasını AWS’de EC2 ile Yayınlamak

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Bu site istenmeyenleri azaltmak için Akismet kullanır. Yorum verilerinizin nasıl işlendiğini öğrenin.