Free AWS Hesabı ile Streamlit Projesini Deploy Etmek

Dr. Fatih Hattatoglu
Academy Team
Published in
12 min readOct 7, 2023

Bu makalede, teknolojinin en heyecan verici ve popüler konularından biri olan deployment yani uygulama dağıtımı üzerine bir yolculuğa çıkacağız. Özellikle, Python programlama dilinin harikulade bir kütüphanesi olan Streamlit ile oluşturduğumuz bir projeyi, Amazon Web Services (AWS) kullanarak nasıl internet üzerinde erişilebilir hale getireceğimizi adım adım inceleyeceğiz. Hem de herkesin rahatlıkla uygulayabileceği kısa kısa adımlarla inceleyeceğiz.

Streamlit ile modeli deploy etme hakkındaki yazımızı bu makaleye giriş babında bu linkten okuyabilirsiniz. Hatta deployment meselesinin genel mantık çerçevesini anlamak için öncelikle linkini paylaştığım yazıyı okuduktan sonra bu yazıyı okumak daha faydalı olacaktır.

Peki, neden Streamlit ve AWS?

Streamlit, veri bilimcileri ve mühendisleri için kullanıcı dostu, kolay ve etkileyici web uygulamaları oluşturma olanağı sunan bir kütüphanedir. Diğer taraftan, AWS, dünya genelindeki geliştiriciler tarafından en çok tercih edilen bulut hizmetlerinden biri olup (Dünyada Cloud kullanımlarında şimdilik %34 ile ilk sırada), sağladığı esnek, güvenli ve ölçeklenebilir altyapı ile projelerimizi hızlıca canlıya almanın (bu tabiri önceki yazımızda detaylıca ifade etmiştim) kapılarını aralar.

Bu yazıda, ilk olarak basit bir Streamlit uygulamasını ele alacağız. Ardından, bu uygulamamızı AWS’nin Elastic Compute Cloud (EC2) servisi üzerinde nasıl dağıtabileceğimizi, adım adım sizlerle paylaşacağım. Hem teorik bilgileri hem de pratiğe dair ipuçlarını, deneyimlerimi ve en iyi uygulama önerilerimi de süreç boyunca sizlerle paylaşacağım. İster bir veri bilimcisi ister bir yazılım geliştirici, isterse teknolojiye meraklı biri olun; bu yazı, projelerinizi internet üzerinden paylaşma konusunda size rehberlik edecek değerli bilgiler sunacak. Haydi, başlayalım!

Bölüm 1: Ön Koşullar

Temel Bilgiler

Başlamadan önce, bu yazının ana konuları olan Streamlit ve AWS hakkında kısaca bilgi vermek istiyorum.

-Streamlit: Python tabanlı, açık kaynaklı bir kütüphanedir ve veri bilimcileri ile mühendislerin, veri görselleştirmeleri, makine öğrenimi modelleri ve interaktif dashboardlar oluşturmak için kullanabileceği kullanıcı dostu bir araçtır.

- AWS (Amazon Web Services): Amazon’un Cloud (bulut) bilişim platformudur ve geniş bir hizmet yelpazesi sunar. Bu yazıda özellikle EC2 (Elastic Compute Cloud) servisini kullanacağız, bu servis sayesinde sanal sunucularımızı oluşturup yönetebileceğiz. Sanal sunucuyu bir bankada kiraladığınız içi boş bir çekmeceye benzeyen para kasası gibi düşünebilirsiniz. Burayı istediğimiz araçlarla yani python kütüphaneleriyle donatacağız.

Gerekli Araçlar

Projemizi başarıyla tamamlamak için ihtiyacımız olan araçlar ve teknolojiler şunlardır:

- Python: Streamlit, Python tabanlı olduğu için temel bilgi ve kurulum gereklidir.

- Streamlit: Uygulamamızı oluşturmak için kullanacağımız kütüphane.

- AWS Hesabı: Uygulamamızı dağıtmak için bir AWS hesabına ihtiyacımız olacak.

- SSH Anahtarı: AWS EC2 instance’ımıza güvenli bir şekilde bağlanmak için SSH anahtarı oluşturacağız.

Bu makale sonucunda istenen noktaya gelmek için bir önceki yazımızda belirtilen seviyeye gelmiş olmanız önemlidir.

Hesap Oluşturma

Eğer henüz bir AWS hesabınız yoksa, AWS’nin resmi web sitesi üzerinden veya bu linke tıklayarak kolayca bir hesap oluşturabilirsiniz. Hesap oluşturma süreci sırasında kredi kartı bilgileriniz istenecektir. Lakin endişelenmeyin! AWS, yeni kullanıcılara ücretsiz olarak birçok servisi kullanma olanağı sunar (bazı kısıtlamalar ile). Biz de bu yazıda ücretsiz kullanım üzerinden rahatlıkla işlerimizi halletmiş olacağız.

Streamlit’in örnek uygulamasını başlatmak için gerekli aşamaları bir önceki yazımızdan okuyabilirsiniz. Bununla beraber “Streamlit Hello” sayfasına sağlıklı bir şekilde ulaşmış olmalısınız.

Streamlit Hello Ana Sayfa

Şimdi temel bilgileri ve gerekli araçları gözden geçirdiğimize göre, bir sonraki bölümde AWS üzerinde bir EC2 instance oluşturmayı ve bu instance üzerinde Streamlit uygulamamızı nasıl çalıştıracağımızı öğreneceğiz. Heyecanlı mısınız?

Bölüm -2: AWS EC2 Instance Oluşturma

Bu bölümde, AWS üzerinde bir EC2 instance oluşturacağız ve bu instance üzerinde Streamlit uygulamamızı çalıştırmak için gerekli ayarları yapacağız.

Adım 1: AWS Management Console’a Giriş Yapın

AWS hesabınıza giriş ekranı
  • “Services” menüsünden “EC2” seçeneğini bulun ve tıklayın.
EC2 girişi

Adım 2: EC2 Instance Oluşturma

Aşağıda resimlerde verdiğim tüm aşamaları sırayla gerçekleştirmeye çalışın. Buradaki adımlar bundan 2 yıl önce daha farklıydı ama şimdi daha kolaylaştırılmış biçimdeki bu aşamalar AWS arayüzünde gerçekleştiriliyor. Belki ilerde de yeniden değişir mi? Belki, ama mantık aşağı yukarı aynı olacaktır.

Alt resimdeki gibi “Launch Instance” diyerek ilk sanal makinemizi AWS üzerindeki hesabımızda oluşturmaya başlayalım. Önceki örnekten hareketle, şimdi bankadaki boş çekmece halindeki para kasamızı inşa etmeye başlıyoruz.

Launch Instance

Server ismini örnek olarak “streamlit-server” şeklinde tanımlıyoruz. Siz farklı isim verebilirsiniz, örneğin “server” veya “test” demek de yaygındır.

Şimdi sanal makinede hangi işletim sistemini seçeceğimizi işaretleyelim. Genelde Amazon Linux seçeneği ile devam ederiz. Free özelliklerden gideceğimiz için bazı seçenekler zaten uygun olmayabilir. Bu yazıda Linux üzerinden sanal makineyi inşa edeceğiz.

Alt resimde sanal makinenin donanımsal özelliklerini seçiyoruz. Burada bize free olan seçeneklerden birisini seçeceğiz. Okla gösterilen makine bizim için uygun olacaktır. Çünkü daha stabil donanıma sahiptir. Daha donanımlı sanal makine için ise ücretli kısmından devam ederek elbette deneyebilirsiniz.

Alt resimde yine Free olarak sunulan Instance tipini seçiyoruz. Zaten bu seçenek hazır seçili olarak gelmektedir. Diğer seçenekler ücretlidir.

Adım-3: SSH Anahtarı Oluşturma ve İndirme

Bu aşamada “Key pair” diye isimlendirilen bir anahtar dosa üretimi gerçekleştireceğiz. Eğer daha önce bilgisayarınızda oluşmuş bir “key pair” dosyası varsa o da kullanılabilir. Biz burada yeni dosya oluşturalım. Alt resimdeki gibi “Create new key pair” diyerek devam edeceğiz.

Key pair name olarak örnekte “streamlit1” ismini verdik ve o isimde bir dosya üretmiş olacak. Diğer tüm ayarlar alttaki resimde görüldüğü gibi olacaktır.

Oluşturulan dosya alttaki resimdeki gibi bilgisayarınıza “streamlite1.pem” dosyası şeklinde kaydedilmiş olacaktır. İlerleyen adımlarda bu dosyanın özelliklerine bir müdahale yapacağız.

AWS kısmındaki ayarları yapmaya devam ediyoruz. Sayfanın altına doğru indikçe yeni ayar pencereleri karşımıza çıkmış olacak. Şimdi port’ları oluşturalım. Alttaki resmin sağ üst kısmındaki Edit’e tıklayıp alttaki diğer resmin olduğu alana geçelim. Burada mevcutta gelen Rule kalacak ve okla gösterilen 22 ssh portu default olarak onaylanmış olacak. Fakat biz yine okla gösterilen yerden “Add security group rule” diyerek ilave bir rule ekleyeceğiz.

Alttaki resimlerde verilen ayarlar yapılarak 8501 portunu ilave olarak eklemiş olacağız. 8501 portu, Streamlit için kullanılacak olan porttur.

Son ayarlamayı veya onaylamayı ise alttaki penceredeki seçim ile yapmış olacağız. Bu bölümde ilave bir düzenleme yapmanıza gerek yoktur. Gösterilen donanım alternatifi -ki minimum olanıdır-, bizim çalışmamız için yeterli olacaktır.

Son olarak resimdeki gibi “Launch Instance” diyerek bu alanı tamamlamış olacağız. Artık instance yani makinemiz ayarları yapıldı ve kullanıma hazır. Örnekten gidersek, bankadan istediğimiz özelliklere sahip kasayı kiralamış, anahtarı cebimize koymuş olduk.

Adım 4: EC2 Instance’a Bağlanma

Son resimdeki “Launch Instance” dediğimiz noktadan sonra altta gelen resimdeki “View instances” kısmına tıklayacağız.

Alttaki resimde açılan tüm Instance’lar görülmüş olacaktır. Biz sadece 1 tane Instance oluşturduk yani bir makine kiraladık.

Oluşturduğumuz Instance’ın solundaki tik’leme alanını seçip aktif hale getirelim. Seçili hale getirince “Instance State” kısmında yeşil renkte “Running” olduğuna dikkat edelim. Bunnu için biraz beklemek gerekebilir. Uzak Sanal makinemiz şu an çalışır durumda artık.

Adım 5: “streamlit.pem” dosyasına yapılacak müdahaleler

Bu aşamada daha önce ürettiğimiz key dosyası olan “streamlite1.key” dosyasında bir ayar değişikliği yapmak durumundayız. Aksi halde bir sonraki adımda gerçekleştireceğimiz bilgisayarımızı AWS uzak makineyle bağlantı kurma aşamasında hata alırsınız. Şimdi bu dosyada yapılacak adımları görelim:

  • Streamlit.pem dosyasına sağ tuş yapıp özelliklere tıklamak
  • Güvenlik sekmesine geç ve Gelişmiş seçeneğine tıklamak
  • Gelen listedekilerin birisi bilgisayarın ismi ile başlıyor. Bu bilgisayar için bilgisayar ad: pc olduğu için o kalacak diğerleri kaldırılacak. Kaldırmak için öncelikle “Devralmayı devre dışı bırak” diyeceğiz sonra kaldır diyeceğiz. Sırayla oradaki 2 seçeneği kaldıracağız.
  • Sadece alttaki resimdeki seçenek kalacak
  • Düzenle seçeneğine girilir
  • Sadece okuma seçeneği kalacak

Adım 6: AWS bağlantısının oluşturulması

Bu aşamada artık bilgisayarımızdan uzak sanal makineye yani AWS makinemize bağlanarak çalışmalarımıza oradan devem edeceğiz. Bu bağlantıyı tesis etmek için aşağıdaki maddeleri uygulayacağız.

  1. Anaconda prompt açıp “.pem” dosyasının (bu yazıda streamlit1.pem dosyası) olduğu konuma gerekli komutlar yazarak ulaşılır. Yani indirdiğiniz `.pem` dosyasının bulunduğu dizine gidin.

2. AWS arayüzündeki EC2 ekranında Connect e tıklanır

3. SSH client a gelip sol altta Example yazan yerin oradaki Copy kısmına tıklayarak IPv4 adresini kopyalayalım. Burada “streamlit1.pem” indirdiğiniz anahtar dosyasının adı ve “your-ec2-ip-address” ise EC2 Dashboard’tan alabileceğiniz IPv4 Public IP adresidir.

4. Yukarda kopyalanan metini Anaconda Prompt a yapıştırıp gelen soruya “yes” diyerek bağlantıyı sağlayalım

5. Eğer alttaki resim elde edilirse (dikdörtgen alan içerisi) bağlantı yapıldı demektir. Artık AWS makineye bağlantı yapılmış durumdadır. Alt çizgili kısımdaki ec-2 ile başlayan satır artık sizin AWS makinenizdeki Linux kodlarıyla yöneteceğiniz makinenin komut satırıdır.

Tebrikler! Artık kendi EC2 instance’ınıza sahipsiniz ve bu instance’a SSH ile bağlanabiliyorsunuz!

Adım 7: AWS makineye yazılım yüklemeleri

AWS makinemiz boş bir cihaz hükmünde şimdilik. İçinde sadece Linux işletim sistemi var ve Linux komutları algılıyor. Bu aşamada AWS sanal makinemizi Streamlit projemizi Run edebilecek kütüphanelerle donatacağız. Neticede boş bir makine ve biz şimdi onu projemizi görüntüleyecek hale getiriyoruz.

1. Alttaki kodları yazıp prompt kısmında sırayla güncelleme yapılır. Streamliti çalıştırmak için ilgili kütüphane, githu’dan ilgili dosyayı çekmek için yine ilgili kütüphane install edilir.
sudo yum update
sudo python3 -m pip install streamlit
sudo yum install git –y

2. Proje dosyasını GitHub üzerinden çağıracağız. GitHub daki ilgili klasörü AWS makineye clone yapalım. “Anaonda prompt” a alttaki metni yapıştıralım. Bu aşamada streamlit proje klasörünün olduğu dosyaları sanal makineye indirmiş oluyoruz.

git clone https://github.com/niyaziozkan/Projects.git

3. Linux koutlarından “ls” yazarak klasörler listelenir ve github dan indirilen Projects klasörü görüntülenir. Resimde Projects klasörünün başarıyla indirildiği görünüyor.

4. Projects klasörünün içine girip, oradan da Car Price Prediction klasörüne girilir. Yine ls yapılıp dosya içeriğine bakılır. Aradığımız app.py dosyası buradadır. (Bu klasörde Car_Price_Predictiion_app.py şeklinde kaydedilmiş)

Adım-8: App.py dosyasının Run edilmesi

Bu noktaya kadar geldikten sonra artık Streamlit ile oluşturduğumuz projenin app.py dosyasını run ederek web sayfası şeklinde bütün projeyi görüntülemiş olacağız. Bir önceki yazımızda kendi local bilgisayarımızda tüm projeyi test edip yayınlamış olduğumuzu hatırlatmak istiyorum. Burada artık AWS üzerinden canlıya çıkarmış olacağız.

1. App.py dosyasını run etmeden önce ilgili kütüphaneleri (burada scikit-learn ve joblib grekiyor) yüklememiz gerekiyor.

sudo python3 -m pip install joblib
sudo python3 -m pip install scikit-learn

2. İlgili kodu çalıştırıp app.py dosyası run edeceğiz. Fakat öncesinde, son zamanlarda bazı güncelleme problemlerinden ve bunlarla ilgili program gerekleri karşılayamama durumlarından dolayı “Urllib hatası” alınabiliyor. Bu hatayı gidermek için alttaki kod yazılır ve çalıştırılır.
sudo python3 -m pip install urllib3==1.26.6

3. Şimdi artık ilgili app.py dosyasını run edelim.

( Buprojedeki app.py dosyası bu isimle kaydedilmiş durumda)
streamlit run Car_Price_Prediction_App.py

NOT:

Burada ayrı ayrı satırlarda yüklediğimiz python kütüphane paketlerini bir `requirements.txt` dosyasında yazarak da belirtebiliriz. Dosyada aşağıdaki satırlar olacaktır.
scikit-learn==1.2.1
joblib==1.3.2
pandas
streamlit

Adım-9: Port Değişikliği durumu

AWS ile bağlantı yaptığınız zaman eğer streamlit projesi üzerinde bazı değişimler yaparsanız ve yeniden Streamlit projeyi run etmeyi denerseniz bu sefer de port hatası alma durumunuz olabilir. Çünkü yukardaki satırlarda biz sadece 8501 portunu AWS deki Rules içine ekledik. Yeni run etme durumunda sistemsel olarak otomatikman 8502 portuna yükseltiyor (alttaki resimde görüldüğü gibi) ama AWS de bu portun karşılığı olmadığı için hata alacağız ve yayına çıkamayacağız. Yayına çıkma aşamasındaki her müdahalede portun ilerlediğini göreceksiniz. 8503, 8504 gibi.

Bunun için tekrar AWS ekranındaki EC2 bölümüne tekrar gideceğiz. Önce Instance daki Security e girilir sonra Security detail açılır.

Edit Inbound rules’ a girilir (alt resim)

Add Rules tıklanır.

8502 portu için değerleri girilir.

Artık yeni port eklenmiş oldu. Eğer gerekirse diğer portlar da eklenebilir. Bununla beraber isterseniz ilk baştaki portu da 8501’den 8502’ye değişebilirdiniz ana yeniş port eklemek daha doğru bir yaklaşım olabilir.

Bölüm 3: TMUX ile sürekli çalışmanın temini

Projemiz bu aşamada herkesin erişebileceği bir url linkde çalışıyor fakat bu noktaya gelinceye kadar tüm işlemleri yürüttüğümüz terminal ekranını kapattığımız zaman uygulamamız duracaktır. Bunun önüne geçebilmek için TMUX Terminal yazılımını kullanacağız.

TMUX (Terminal Multiplexer), kullanıcıların tek bir terminal penceresi içerisinde birden fazla terminal oturumu (session) oluşturmasını, bu oturumlar arasında geçiş yapmasını ve bu oturumları bağımsız olarak kontrol etmesini sağlayan bir terminal multiplexer’dir. TMUX, kullanıcıların aynı anda birden fazla işlemi görsel olarak yönetmelerine olanak tanır ve özellikle uzak sunucularla çalışırken oturumların bağlantı kopmalarına karşı dayanıklı olmasını sağlar, böylece kullanıcılar bağlantıları tekrar sağladıklarında kaldıkları yerden devam edebilirler.

Önceki terminalden çalışan AWS yi durdurmak için sadece 1 kez “Ctrl + C” yapacağız. Ama dikkat edin sadece 1 kez. Aksi halde AWS makine ile bağlantıdan da çıkmış olur. Resimdeki gibi “Stopping” yazısı görülmesi gerekir.

Önce tmux kurulumunu terminale yapıyoruz. Bunun için alttaki kodu terminale girelim.
sudo yum install tmux

Alttaki kod satırı ile Streamlit isminde yeni bir tmux session’ı oluşturuyoruz.
tmux new -s Streamlit

Tmux session açıldığı zaman alt resimdeki gibi ekranın altında yeşil bir satır ile bunu göreceğiz.

Şimdi bu ekranda;
streamlit run Car_Price_Prediction_App.py

ile TMUX alanında tekrar komut vererek alttaki şekilde External URL kısmı copy-paste yaparak web browser üzerinde proje çalıştırılır

Copy-Paste yaptığımız external URL’de artık projemiz çalışır durumdadır. Şimdi terminal ekranını kapattığımızda proje uygulamamızın (bu makalede ele alınan Car_price_prediction dosyası) çalışmaya devam etmesi için tmux session’dan ayrılacağız. Bunu yaparken çok dikkatli biçimde bir işlem gerçekleştireceğiz. Aksi halde amacımıza ulaşamayız. Bu işlem için önce Ctrl+B ve sonra hemen peşinde sadece D tuşlarına basıyoruz (D tuşuna basarken Ctrl tuşuna basmayın!)

Artık terminal kapansa bile uygulama çalışıyor olacaktır. Fakat bu deploy etme işlemi siz AWS makineyi açık tuttuğunuz sürece devam edecektir.

Free hesap kullandığımız için 750 saate kadar ücretsiz kullanıma sahibiz. Bu limit aşılırsa AWS tarafından daha önce tanımladığımız banka kart bilgilerine fatura geldiğini üzülerek görebilirsiniz. Alternatif olarak hosting işlemleri yapabilirsiniz veya AWS den de devam edebilirsiniz elbette. Karar sizin. Yayına alma işlemi ile ilgili tüm aşamalar tamamlandıktan sonra free hesabınızdan aşım olmasını istemiyorsanız, son aşamada Instances’ ı terminate etmek yani ortadan kaldırmak gerekir. Bunun için aşağıdaki işlem yapılır.

Sayfanızın yayında kalması; domain işlemleri, DNS işlemleri, hosting işlemleri gibi konulardan haberdar olmak gerekir. Bununla beraber Streamlit’,n sunduğu imkanlardan da yararlanarak sayfamızı onların sağlayacağız bir domain üzerinden yayınlayabiliyoruz.

Projenin Streamlit Sharing üzerinden yayınlanan haline ise buraya tıklayarak ulaşabilirsiniz.

Sonuç

Ve işte bu kadar! Bu yazı ve önceki yazımız boyunca, bir Streamlit uygulaması üzerinden proje geliştirmeyi, AWS EC2 instance’ını nasıl yapılandıracağımızı ve uygulamamızı internet üzerinden nasıl erişilebilir hale getireceğimizi adım adım gördük.

Deployment yani uygulama dağıtımı, özellikle de bulut ortamlarında, birçok farklı şekilde yapılabilecek geniş bir konudur. Umarım bu rehber, kendi projelerinizi deploy etme konusunda size yardımcı olur. Projelerinizde başarılar dilerim!

--

--