Bigquery tablosundaki verinin Fastapi ile dağıtılması ve VM Instance içerisinde Docker ile deploy edilmesi.

Kerem NOGAY
5 min readJun 4, 2023

Daha önceki bazı çalışmalar özelinde verinin çeşitli kaynaklardan ve cloud platformlardan nasıl yazdırılacağına dair dökümanlar hazırlamıştım.

Bu dökümanda benimde bir süredir denemek istediğim bir konu olan Fastapi geliştirmelerini deneyimlemek ve birtakım ihtiyaçları karşılamak üzere Bigquery tablosundaki datayı Fastapi ile dağıtmak üzerine yaptığım uygulamadan bahsedeceğim.

Bu çalışmada Kaggle’da çeşitli yaş grupları ve cinsiyete göre hastalıklara ait belirtileri ve teşhisleri içeren bir dataset kullanıyorum. Çünkü ilerde bir devam çalışması yaparak bu data üzerinde bazı denemeler yapacağım.

Öncelikle ilgili dosyayı oluşturduğum Bucket üzerine yükleyerek Bigquery’de bu CSV dosyasından bir tablo oluşturuyorum. Bu adımları detaylı olarak daha önceki çalışmamda anlatmıştım bu nedenle burada bazı detaylara girmiyorum.

Bigquery de bu CSV üzerinden bir tablo oluşturuyorum.

Daha sonra Python scripti içerisinde Bigquery’e erişim için kullanacağım bir Service Account yaratıyorum ve gerekli izinleri veriyorum ve script içerisinde Bigquery’e bağlantı sağlamak için key dosyasını indiriyorum.

Tablo ve Servis hesabı oluşturduktan sonra indirdiğim Key dosyası yardımı ile artık gerekli kütüphaneleri kullanarak Bigquery bağlantısı yapabilir ve ilgili tablodaki Data’yı api olarak dağıtabilirim.

Genel olarak göz atmamız gerekirse proje içerisinde Fastapi ve Google kütüphanelerini projeme dahil ediyorum, indirdiğim JSON formatındaki KEY dosyasını kullanarak Credentials tanımlıyorum ve gerekli tanımları yaparak ilgili tablodaki alanlar üzerinde gezmek üzere bir Class oluşturuyorum

Api’ye bağlanmak üzere Basic Auth kullanacağım şimdilik burada username ve password bilgilerini kod içerisinde belirttim.

Öncelikle ilk olarak oluşturacağım Endpointte, Get isteği atıldığı zaman 100 satır sınırlaması uygulayacağım ve gelen Resultset içerisinde de oluşacak Toplam Sayfa Sayısı’nı, Toplam Kayıt Sayısı’nı ve Pagination için URL bilgisini yansıtacağım. Burada Skip ve Limit Queryleri ile Pagination yapılmasını istiyorum.

Get isteği attığımda gelen sonuç aşağıdaki şekilde olacaktır. Verimizde 349 satır vardı ve 100 satır sınırlaması uygulamıştım. Doğal olarak Total Page’de 4 olacak.

Gelen sonuçlar içerisinde Next Page Url’ye istek attığımda da gelen sonuç 101. kayıttan başlayarak devam edecektir.

Eğer burada Septomları bir Array içerisinde yazdırmak isteseydik aşağıdaki gibi yapabilirdik.

GET isteği attığımda her kayıt için ilgili alanların Array olarak geldiğini görebilirdim.

Bu noktada herhangi bir Pagination yapılmasada veriyi 1000'er satır olarak getirecek ve girdiğim id’den daha yüksek olan id’leri listeleyecek bir Endpoint eklemeye karar verdim. Toplam Kayıt sayısını ve Filtrelediğim Kayıt sayısınıda görmek için Filtered Record Count ekliyorum.

Bu Endpoint’e de Get isteği attığımda bana hem Kayıt Sayısı’nı hemde Filtrelediğim Kayıt Sayısı’nı vermiş oluyor

Örneğin ?id=348 diyerek Query göndermiş olsaydım beklediğim gibi bu id’den yüksek olan kayıtları getirecekti.

Buraya kadar olan kısımda Local bilgisayarımda geliştirme yaptım ancak bunu bir VM Instance üzerinde Docker ile Deploy etmek istiyorum.

VM Instance oluşturma ve VM Instance üzerinde Docker kurulumu ile ilgili detaylı bilgiyi şu yazımda vermiştim.

Oluşturduğum main.py, requirements.txt, Dockerfile ve Bigquery bağlantısı için gereken Key dosyasını VM Instance’a yüklüyorum.

Dockerfile dosyasının görüntüsü şu şekilde olacaktır.

Requirements.txt dosyası içeriği şimdilik bu şekilde ancak değişkenlik gösterebilir. Paketlerin üzerinde şimdilik fazla durmadım.

Daha sonra “docker build -t fastapi .” ile ilgili imajı oluşturuyorum.

Artık Container’ı ayağa kaldırıp Postman ile istek atabilirim. Burada internalip VM Instance’ın internal ip’sidir.

docker run -d -p internalip:80:80 — name fastcontainer fastapi

Hem Tablo tarafında hemde Api tarafında kontrol ettiğimde de kayıtlarda bir tutarsızlık olmadığını görüyorum.

Bir sonraki çalışmada görüşmek üzere.

--

--