Huawei Cloud DB, Cloud Functions ortamında nasıl yönetilir | Python

Mustafa Sarıkaya
Huawei Developers - Türkiye
6 min readJan 26, 2023
Bulut İşlevi

Giriş

Herkese merhaba,

Bu makalede Huawei Cloud DB Python Server Sdk’ yı fiziksel server kullanmadan, Cloud Function python runtime ile nasıl yönetebileceğimizi göreceğiz.Öncelikle bu uygulama içerisinde kullandığım servislerden bahsetmek istiyorum.Bunlar: Cloud DB ve Cloud Function.

Cloud DB Nedir?

Cihaz ile cloud arasında ve cihazlar arasında sorunsuz veri senkronizasyonu sağlayan ve çevrimdışı uygulama işlemlerini gerçekleştimemizi sağlayan bir veritabanıdır.

Cloud DB, Object Modele dayalı veri depolama yapısını kullanır. Veriler object olarak farklı DB Zone bolgesinde depolanır. Her object bir veri kaydıdır. Cloud DB Zone bağımsız bir depolama alınıdır.

Object Type : Klasik veritabanı mantığında bulunan her bir tabloyu temsil eder.

Cloud DB Zone : Cloud tarafındaki veri bolgesini temsil eder. Veritabanı adına karşılık gelir.

Cloud Function Nedir?

Cloud Functions, sunucusuz bilgi işlem sağlar. Hizmet mantığını işlevlere bölerek uygulama geliştirmeyi ve işletme ve bakımı basitleştirmek için hizmet olarak işlev (FaaS) yetenekleri sağlar ve uygulama işlevlerinizin daha kolay uygulanabilmesi için Cloud DB ve Cloud Storage ile çalışan Cloud Functions SDK’yı sunar. Cloud Functions, gerçek trafiğe dayalı olarak işlevleri otomatik olarak genişletir veya küçültür, sizi sunucu kaynak yönetiminden kurtarır ve maliyetleri düşürmenize yardımcı olur.

Başlarken

Cloud DB tablosu ve Nesneleri oluşturduğunuzu varsayıyorum. Eğer oluşturmadıysanız Cloud DB Belgelerini okuyabilir ve adımları takip edebilirsiniz.Bununla ilgili alternatif yolları da göstereceğim.

Dipnot

Nasıl Huawei Developer olabilirim?

Huawei developer olabilmek için ilk olarak https://developer.huawei.com/consumer/en/ adresinden kayıt olmak ve developer hesabı açmak gerekir.Developer hesabı oluştururken bireysel veya kurumsal olarak hesap oluşturulabilir.

Huawei Developer hesabının incelenmesi ve onaylanması ne kadar zaman alıyor?

Developer hesabı oluştururken bilgileri doğru girdiğinizden emin olun. Hesap bir veya iki iş günü içerisinde onaylanıp aktif olacaktır.

Projenizi Oluşturma ve Uygulama Ekleme

Eğer AppGallery Connect’te proje eklemediyseniz, AppGallery Connect’te oturum açın, bir proje oluşturun ve projeye bir uygulama ekleyin.

Cloud Function’ın aktive edilmesi

  1. AppGallery Connect’te oturum açın ve My projects’e tıklayın.
  2. Proje listesinden Cloud İşlevlerini etkinleştirmeniz gereken projenizi bulun.
  3. Build > Cloud Functions ‘a tıklayın ve sağ üst köşedeki Enable now butonuna tıklayın.
Cloud Function Aktive Etme Ekranı

Artık Cloud Function oluşturmaya hazırız.Şimdi ise bir Cloud DB python server paketine ihtiyacımız var.

Not: Eğer Cloud DB’yi Cloud Function üzerinden yönetmek istiyorsanız edit code inline seçeneğini kullanamazsınız, bu durumda .zip dosyası yükle seçeneğini kullanmalısınız. Aslında bu .zip dosyası Cloud DB python server uygulamasıdır.

Cloud DB Sunucu Paketinin oluşturulması

Server kodu Python olarak kodlanmalıdır. Kodlamadan sonra, Cloud Function’a yüklemek için bir .zip paketi oluşturacağız, .zip paket içeriği aşağıdaki gibi olmalıdır.

Klasör Yapısı

Buradaki zip içerisini inceleyelim.

python_modules klasörü AppGallery Connect Python Server SDK’yı içerir.Bunu oluşturmak için aşağıdaki command run edilir.

pip3 install -t ./python_modules agconnect

Bir diğer dosya olan agconnect_credentials.json dosyası ise Proje Düzeyinde Kimlik Bilgisine başvurarak elde ettiğiniz dosyadır. Create edilen agc-apiclient-*.json kimlik bilgisi dosyanızı belirtilen yola kaydedin.

cloud_db_zone_wrapper ise PythonSDK ile Cloud DB’ye aşağıdaki şekilde execute_query, execute_upsert,execute_delete,order_by_asc, limit gibi verileri istenen düzende sıralamak ve görüntülenecek veri kayıtlarını sınırlamak gibi işlemleri async olarak, python server sdk ile yapmayı saglar.

Buradaki get_books_list kod üzerindeki yorum satırlarında da görebileceğiniz gibi Cloud DB’de tablo oluşturmak için kullanılır.

Cloud DB’deki Tabloların Projeye Aktarılması

Cloud DB’de oluşturduğunuz tabloları JSON olarak dışa aktarıp python sdk ile book_info.py dosyasına benzer bir dosyayı oluşturabilirsiniz.Bu dosya aslında sizin tablolarınızı, onların içindeki tüm index ve rules durumlarını içerir.

Projede bulunan object_creator scripti ile cloud db hizmetinde kullanmak istediğiniz nesneleri oluşturabilirsiniz.Bunu başarmak için, sadece json dosyanızın yolunu ve yanına modelinizi yerleştirmek istediğiniz yolu belirtin. Aşağıdaki yapıda komutu çalıştırın:

python object_creator.py your_json_path your_model’s_path

Bir diğer yol ise File format’ın JS, File Type of js ‘inde serverSDK olarak seçili olduğuna emin olun. Ayrıntılar için Nesne Tiplerinin dışa aktarılması’n göz atabilirsiniz.Js olarak dışarı aktarıp pythona convert edebilirsiniz.

File Format Ekranı

Python Async Lambda Handler Function Oluşturma

Bu adıma kadar tüm işlemleri tamamladıysanız .zip olan resme baktığınızda handler.py ve nest_asyncio.py dısında tüm kısımlar tamam olmalıdır.Bu kısımda ise Cloud function ortamı bizden aşağıdaki yapıda bir myHandler methodu bekliyor.handler.py:

Burada return ifadesi sizin isteğinize bağlı istediğinizi return edebilirsiniz.

Dikkat ederseniz nest_asyncio diye bir ifade var. Bu kod parçacığının kullanım sebebi; Tasarım gereği asyncio, loop döngüsünün iç içe olmasına izin vermez.Bu bir sorun teşkil eder.Loop döngüsünün zaten çalıştığı bir ortamda görevleri çalıştırmak ve sonucu beklemek imkansızdır.Bu yüzden bu modül iç içe kullanımına izin vermek için asyncio’yu yamalar.Önce bir new loop oluşturup, sonra nest apply ile yama yapıp ve en son run_until_complete yapmanız gerekir.

nest_asyncio modülünü kullanabilmeniz için pip ile python modules içine yüklemeniz yada yine zip dosyasında gördüğünüz gibi direk kaynak dosyasını zip içine atıp apply methodunu call edebilirsiniz.

Ek olarak myHandler fonksiyonu async olmamalıdır.async_handler methodu için async gerekir.

Üstteki resimdeki gibi bir method oluşturabilirsiniz.Context ile de runtime için loglama siz de bu şekilde yapabilirsiniz.İmport işlemlerini de yine örnekteki gibi python_modules içinden yapabilirsiniz. CloudDbZoneWrapper, asyncio gibi importlar gereklidir.

Oluşturulan Paketin Cloud Function’a Yüklenmesi

Tüm işlemleri tamamladık, şimdi .zip dosyamızı cloud function ortamına upload edip çalıştırmamız gerek.

AG Connect sayfasından > My Project > Build > Cloud Functions sayfasından New Function butonuna tıklayın.

Function Oluşturma Ekranı
  1. Fonksiyonun ismini yazın.
  2. Daha önce oluşturduğumuz .zip uzantılı dosyayı yükleyin.
  3. Bu kısım önemli, myHandler bizim ana methodumuz.handler.py içerisinde.

4. Save butonuna tıklayın ve işlem bitene kadar bekleyin.

Kaydettikten sonra oluşan functiona tıklayın, açılan sayfa aşağıdaki gibi olacaktır, code sekmesine basın test butonuna basın.

Kodları Test Etme Ekranı

Kod başarılı bir şekilde çalıştığında buna benzer bir log görebilirsiniz.Unutmayın !

Buradaki loglar context ile handler.py içinden kodu nasıl ayarladığınıza göre atılır.

Sonuç Ekranı

Gördüğünüz gibi ben book listesinin bir elemanının adını ve query_average() ‘dan dönen değeri yalnızca log olarak bastırdım.Average değerini de return ettim.

Note: Eğer herhangi bir log görmüyorsanız, muhtemelen kodda bir syntax hatası veya exception hatası vardır. Bu sorunu çözebilmek için bütün fonksiyon dönüşlerini try {} except{} bloğuna alın ve hata mesajını bastırın. Kodu kontrol edin ve gerekirse her satıra adım adım log koyup ekrana yazdırın ve en son haliyle paketi tekrar yükleyerek kodun başarılı bir şekilde çalışmasını sağlayın.

Dikkat

Burada dikkat etmeniz gereken nokta, AGC Python SDK özelinde asyncio kullanılmakta ve bu server ile bir environment içinde çalışmak isterseniz asyncio, çalisan bir loop uzerinde ayrica bir loop calıştırıp sonucu beklemeye izin vermiyor.Bu yüzden buradaki örnekte clouddb transaction işlemlerini async olarak yapabilmek için nest_asyncio kullanmanız gerekli.Kullanmazsanız üstteki handler.py örneğindeki gibi, aşağıdakilere benzer hatalar alabilirsiniz.

RuntimeError: Yanıtın JSON serileştirmesi: <coroutine nesne işleyici 

RuntimeWarning: coroutine 'işleyici' hiçbir zaman beklenmiyordu

RuntimeError: geçerli döngü iş parçacığı yok '/O'

RuntimeError: Bu olay döngüsü zaten çalışıyor.

Sonuç

Cloud DB server paketinin nasıl oluşturulduğunu gördük, oluşturulan paketi Cloud Function’a yükledik ve çalıştırdık. Böylece fiziksel bir server’a ihtiyaç duymadan bütün işlemleri Cloud Function üzerinden tamamladık.

Okuduğunuz için teşekkürler…

Daha fazla bilgi için Huawei developer dökümanlarına göz atabilirsiniz.

Referanslar

Huawei Bulut Veritabanı

Huawei Bulut İşlevi

--

--