Azure Function’da Python kodu çalıştırma ve Data Factory üzerinden çağırma

Azure Function - Python - PostgreSQL

Azure Functions, uygulama geliştirmeyi hızlandırmak ve kolaylaştırmak amacıyla küçük kod parçalarının çalıştırılmasını sağlayan, Function as a Service (FaaS) olarak adlandırılan ve serverless mimaride çalışan bir Azure hizmetidir.

Azure Function servisinin ve örnek bir fonksiyonun oluşturulması ve bu kodun Azure Data Factory akışı üzerinden tetiklenmesi nasıl oluyor, kısaca bahsetmeye çalışalım.

Öncelikle bu örneğin yapılacağı ortamda aşağıdaki yazılım ve kütüphanelerin kurulu olmaslı gerekiyor:

Azure Function servisinin oluşturulması

Azure Portal sayfasında üstteki arama kutucuğuna function yazıyoruz. Function App servisine tıklıyoruz.

Yeni Function App oluşturma ekranında abonelik bilgisi seçiyoruz. Diğer seçenekler sırasıyla aşağıdaki gibi:

  • Resource Group: Bu örnek için yeni bir kaynak grubu (my-function-app-test-001_group) oluşturmasını istiyoruz. Farklı bir kaynak grubuna dahil etmek isterseniz bu bölümden seçebilirsiniz.
  • Function App name: Function App ismini yazıyoruz.
  • Runtime stack: Python
  • Version: 3.9
  • Region: West Europe
  • Operating system: Linux
  • Plan type: Consumption (Serverless)

Sonraki sekmelerde de aşağıdaki seçimleri yapalım:

  • Hosting, Networking varsayılan olarak bırakılabilir.
  • Monitoring kısmında Enable Application Insights No seçiyoruz.
  • Deployment kısmında Continuous deployment da No olarak seçelim.

Önce Review & create, sonra da Create diyerek servisi oluşturuyoruz. Kurulum tamamlandığında kaynak grubumuz içinde Function App görünecektir.

Visual Studio Code ile fonskiyon oluşturma

Azure ortamındaki kaynakları görüntüleyebilmek ve kodu bu ortama aktarabilmek için Azure’a giriş yapmamız gerekiyor (sign-in to Azure). Giriş yaptıktan sonra sol taraftaki Azure simgesine tıkladığımızda Resources altında ilgili abonelik ve altında kaynaklar görünüyor olmalı.

Yeni bir fonksiyon oluşturmak için Workspace bölümünde Create Function‘a tıklayalım. Buradaki Workspace’I göremiyorsanız ilk adımdaki Azure Functions Core Tools ve VSCode Azure Function eklentisinin kurulumlarını kontrol edeblirsiniz.

Workspace klasörü olarak bir klasör yolu gösteriyoruz. Sonrasında açılan menüden (Select a language) Python seçiyoruz.

Bir virtual env kullanılmayacaksa Skip virtual environment seçip varsayılan Python ortamını kullanacağımız belirtebiliriz.

Fonksiyon şablonu olarak HTTP trigger seçilir.

Trigger’a bir isim veriyoruz. Bu örnek için myHttpTrigger kullanalım.

Bu fonksiyona API ile erşileceği için Authorization level olarak Anonymous‘u seçiyoruz.

Son olarak da projeyi Workspace’e ekleyip oradan açmak istediğimizi belirtiyoruz (Add to workspace).

Proje dosyaları verilen workspace içine kopyalanacak ve aşağıdaki gibi açılacaktır.

Bu örnek fonskiyon name adında bir parametre alıyor ve çalıştığında bir mesaj döndürüyor (HttpResponse). Eğer name parametresi verilmişse mesaj içeriğindeki {name} kısmına parametre değerini yazıyor.

Kodu çalıştırmak için Run menüsünden Start debugging‘i seçelim ya da F5‘e basalım. Visual Studio Code içindeki terminal penceresi açılacak ve aşağıdaki gibi bir çıktı üretecektir:

Buradaki URL’i (http://localhost:7071/api/myHttpTrigger) kopyalayıp tarayıcıda açıyoruz. Kodu şu an herhangi bir ortama yayınlamadığımz için kendi ortamımızda çalıştıracağız.

Parametre vermediğimizde varsayılan mesaj ve parametre uyarısı gelecek:

Eğer son kısma name parametresini eklersek (http://localhost:7071/api/myHttpTrigger?name=John) çıktı mesajı aşağıdaki gibi değişecektir:

Run > Stop Debugging‘I seçerek (Shift + F5) kod çalıştırma işlemini sonlandırıyoruz.

Yeni fonksiyon yazma

Yukarıdaki örnekte Azure Function’un HTTP trigger’ı ile nasıl çağırıldığını görmüş olduk. Şimdi baştan yeni bir fonksiyon yazalım ve fonksiyonu çağırma işlemini de Azure Data Factory üzerinden yapmaya çalışalım.

Örnek olarak Azure üzerindeki bir PostgreSQL veritabanındaki bir tabloya veri atan bir kod olsun.

Burada örneği basitleştirmek amacıyla PostgreSQL veritabanı sadece kullanıcı adı ve şifre ile erişilebilir (public access) durumda olarak ayarlanmıştır.

Aşağıdaki gibi bir kod, postgredb veritabanında yer alan test.test_table adlı iki kolonlu (ID ve test_value) tabloya fonksiyon her çalıştığında günün tarihini (timestamp formatında) yazacak:

Buradaki veritabanı bağlantı bilgilerini yerine kendi oluşturduğunuz veritabanına ait bilgileri yazmalısınız.

Bu kodu, __init.py__ dosyası içinde bir önceki halinin yerine yapıştırıyoruz.

Kod içerisinde PostgreSQL veritabanına bağlanmak için psycopg2 kütüphanesini kullandık. Kodu Azure ortamına aktarmadan önce requirements.txt dosyasına bu kütüphaneyi eklememiz gerekiyor. Kodda kullanılan bütün harici kütüphaneleri bu dosya içerisine eklemezsek kodumuz hata alacaktır.

Kod içerisinde psycopg2 olarak kullanılsa da kütüphane adı psycopg2-binary olarak yazılmalıdır.

Kodu kaydedip çalıştırdığımız zaman (Run > Start Debugging ya da F5) Terminal penceresinde tekrar aynı URL’I göreceğiz:

http://localhost:7071/api/myHttpTrigger

Burada, bir önceki örnekteki name parametresine ihtiyacımız olmadığı için doğrudan bu adresi kopyalayıp tarayıcıda açarsak yeterli olacak. Kod çalıştığında aşağıdaki mesaj görüntülenmeli:

PostgreSQL veritabanına gidip tabloyu kontrol ettiğimizde yeni kaydın eklenmiş olması gerekiyor:

Tarayıcıdaki adresi, sayfayı yenileyerek (HTTP tetikleyiciyi tekrar çağırarak) yeni kayıtların eklendiğini görebilirsiniz. Sayfayı birkeç kez yenileyelim ve tabloyu tekrar kontrol edelim.

Böylece kodumuzun çalıştığını ve veritabanına kayıt attığını kontrol ettik fakat bu kod halen bizim kendi ortamımızda. Şimdi gelelim bu kodu Azure Function’a deploy etmeye.

Kodu Azure function’a yayınlama (Deploy)

Azure üzerinde ilk adımlarda oluşturduğumuz Function app’imiz (my-function-app-test-001) içerisine bu kodu yayınlamamız gerekiyor bu adımda.

Visual Studio Code’da sol menüdeki Azure simgesine tıklayıp Workspace kısmını açalım ve Workspace’in hemen sağındaki Deploy simgesine tıklayıp açılan Deploy to Function App seçeneğini seçelim.

İlk olarak Azure aboneliğini (subscription) seçiyoruz.

Sonrasında oluşturduğumuz Function’I seçiyoruz.

Gelen uyarıya Deploy diyerek geçiyoruz.

Deployment tamamlandığında (ekranın sağ alt köşesinde bildirim görüntülenecektir) Function App’imizin ana ekranına giriyoruz. Sol taraftaki Functions menüsüne tıkladığımızda bu Function App içinde kayıtlı olan (buraya deploy edilmiş olan) fonksiyonlar listelenecektir. Bu örneğimizdeki fonksiyonumuz (myHttpTrigger) burada görüntülenmeli.

Fonksiyona tıklayıp detayları görüntüleyelim. Burada sol taraftaki Code + Test kısmında fonksiyon içindeki kodu görüntüleyebilir ve test edebilirsiniz. Şimdilik bu örnek için buraya girmiyoruz.

En alttaki Function Keys kısmına gelelim. Burada önceden tanımlanmış bir function key bulunuyor. Hidden value. Click to show value. üzerine tıklayıp bu anahtar değerini görünür yapalım ve bunu kopyalayıp bir kenara not edelim.

Şimdi sırada bu fonksiyonu Azure Data Factory kullanarak çağırma kısmı var.

Azure Data Factory akışı oluşturma

Data Factory’de yeni bir akış (pipeline) oluşturup Activities menüsündeki Azure Function nesnesini akış içine sürükleyelim. Bir isim verdikten sonra Settings sekmesinde Azure Function linked service bölümünden yeni bir bağlantı tanımlamamız gerekiyor. New butonuna tıklıyoruz.

Açılan ekranda sırasıyla önce aboneliği sonra App url‘yi listeden seçiyoruz. Function key değeri olarak da, daha önce kopyaladığımız Function key’i yapıştırıyoruz. Authentication mode da, API aracılığıyla erişeceğimiz için Anonymous olmalı.

Create’e tıklayıp bağlantıyı kaydediyoruz.

Linked service Setting kısmındaki değerler tanımlandığı için seçili halde gelmiş durumda. Fonksiyonumuzun adını yazıyoruz (myHttpTrigger) ve Method olarak POST seçiyoruz. Body kısmına şimdilik bir şey yazmamıza gerek yok.

Debug‘a tıklayıp çalıştırdığımızda başarılı bir şekilde çalışmalı.

PostgreSQL veritabanından da kontrol ettiğimizde yeni kaydın eklendiğini görebiliriz.

Sonuç

Azure Function ile Python kullanarak basit bir uygulamanın nasıl oluşturulduğunu ve Azure Data Factory ile nasıl tetiklendiğini görmüş olduk. Azure Function ile Python haricinde C#, Java, Javascript, Powershell script, Typescript gibi dilleri kullanarak kodlar yazabilir ve bunları çalştırabilirsiniz.

https://learn.microsoft.com/en-us/azure/azure-functions/supported-languages#languages-by-runtime-version