1. Giriş

Python; veri bilimciler, web uygulaması geliştiricileri, sistem yöneticileri ve daha birçok kişi tarafından kullanılan popüler bir açık kaynak programlama dilidir.
Cloud Functions, etkinliğe dayalı, sunucusuz bir bilgi işlem platformudur. Cloud Functions, kaynak sağlama veya değişen gereksinimleri karşılamak için ölçeklendirme konusunda endişelenmeden kodunuzu yazmanıza olanak tanır.
İki tür Cloud Functions işlevi vardır:
- HTTP işlevleri, HTTP isteklerine yanıt verir. Bu codelab'de birkaç tane oluşturacaksınız.
- Arka plan işlevleri, Cloud Pub/Sub'da mesaj yayınlanması veya Cloud Storage'a dosya yüklenmesi gibi etkinliklerle tetiklenir. Bu laboratuvarda bu konuya değinilmemektedir ancak belgelerden daha fazla bilgi edinebilirsiniz.

Bu codelab'de, Python'da kendi Cloud Functions işlevlerinizi oluşturma adımları açıklanmaktadır.
Ne oluşturacaksınız?
Bu codelab'de, HTTP üzerinden çağrıldığında "Python Powered" logosunu gösteren bir Cloud Functions işlevi yayınlayacaksınız:

Neler öğreneceksiniz?
- HTTP Cloud Functions işlevi yazma
- Bağımsız değişken alan bir HTTP Cloud Functions işlevi yazma
- HTTP Cloud Functions işlevlerini test etme
- İşlevi denemek için yerel bir Python HTTP sunucusu çalıştırma
- Resim döndüren bir HTTP Cloud Functions işlevi yazma
2. Kurulum ve şartlar
Yönlendirmesiz ortam kurulumu
- Google Cloud Console'da oturum açın ve yeni bir proje oluşturun veya mevcut bir projeyi yeniden kullanın. Gmail veya Google Workspace hesabınız yoksa hesap oluşturmanız gerekir.



- Proje adı, bu projenin katılımcıları için görünen addır. Google API'leri tarafından kullanılmayan bir karakter dizesidir. Bu bilgiyi dilediğiniz zaman güncelleyebilirsiniz.
- Proje kimliği, tüm Google Cloud projeleri genelinde benzersizdir ve sabittir (ayarlandıktan sonra değiştirilemez). Cloud Console, benzersiz bir dizeyi otomatik olarak oluşturur. Genellikle bu dizeyi önemsemeniz gerekmez. Çoğu codelab'de proje kimliğinize (genellikle
PROJECT_IDolarak tanımlanır) başvurmanız gerekir. Oluşturulan kimliği beğenmezseniz başka bir rastgele kimlik oluşturabilirsiniz. Alternatif olarak, kendi adınızı deneyebilir ve kullanılabilir olup olmadığını görebilirsiniz. Bu adımdan sonra değiştirilemez ve proje süresince geçerli olur. - Bazı API'lerin kullandığı üçüncü bir değer olan proje numarası da vardır. Bu üç değer hakkında daha fazla bilgiyi belgelerde bulabilirsiniz.
- Ardından, Cloud kaynaklarını/API'lerini kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir. Bu codelab'i tamamlamak için çok az bir ücret ödemeniz gerekir veya hiç ödeme yapmanız gerekmez. Bu eğitimden sonra faturalandırma yapılmaması için oluşturduğunuz kaynakları veya projeyi silebilirsiniz. Yeni Google Cloud kullanıcıları 300 ABD doları değerinde ücretsiz deneme programından yararlanabilir.
Cloud Shell'i Başlatma
Google Cloud'u dizüstü bilgisayarınızdan uzaktan çalıştırabilirsiniz ancak bu codelab'de, Cloud'da çalışan bir komut satırı ortamı olan Cloud Shell'i kullanacaksınız.
Cloud Shell'i etkinleştirme
- Cloud Console'da Cloud Shell'i etkinleştir'i
tıklayın.

Cloud Shell'i ilk kez başlatıyorsanız ne olduğunu açıklayan bir ara ekran gösterilir. Ara ekran gösterilirse Devam'ı tıklayın.

Cloud Shell'in temel hazırlığı ve bağlanması yalnızca birkaç dakikanızı alır.

Bu sanal makine, gerekli tüm geliştirme araçlarıyla yüklüdür. 5 GB boyutunda kalıcı bir ana dizin bulunur ve Google Cloud'da çalışır. Bu sayede ağ performansı ve kimlik doğrulama önemli ölçüde güçlenir. Bu codelab'deki çalışmalarınızın neredeyse tamamını bir tarayıcı kullanarak yapabilirsiniz.
Cloud Shell'e bağlandıktan sonra kimliğinizin doğrulandığını ve projenin, proje kimliğinize ayarlandığını görürsünüz.
- Kimliğinizin doğrulandığını onaylamak için Cloud Shell'de şu komutu çalıştırın:
gcloud auth list
Komut çıkışı
Credentialed Accounts
ACTIVE ACCOUNT
* <my_account>@<my_domain.com>
To set the active account, run:
$ gcloud config set account `ACCOUNT`
- gcloud komutunun projenizi tanıdığını doğrulamak için Cloud Shell'de aşağıdaki komutu çalıştırın:
gcloud config list project
Komut çıkışı
[core] project = <PROJECT_ID>
Doğru proje listelenmiyorsa şu komutla ayarlayabilirsiniz:
gcloud config set project <PROJECT_ID>
Komut çıkışı
Updated property [core/project].
Cloud Functions ve Cloud Build API'lerinin etkinleştirildiğinden emin olma
Cloud Functions ve Cloud Build API'lerinin etkinleştirildiğinden emin olmak için Cloud Shell'de aşağıdaki komutu çalıştırın:
gcloud services enable \ cloudfunctions.googleapis.com \ cloudbuild.googleapis.com
Not: Cloud Build, gcloud functions deploy komutuyla çağrılır ve kodunuzu otomatik olarak bir container görüntüsüne dönüştürür.
Kaynak kodunu indirme
Cloud Shell terminalinden aşağıdaki komutları çalıştırın:
REPO_NAME="codelabs" REPO_URL="https://github.com/GoogleCloudPlatform/$REPO_NAME" SOURCE_DIR="cloud-functions-python-http" git clone --no-checkout --filter=blob:none --depth=1 $REPO_URL cd $REPO_NAME git sparse-checkout set $SOURCE_DIR git checkout cd $SOURCE_DIR
Kaynak dizinin içeriğine göz atın:
ls
Aşağıdaki dosyalara sahip olmanız gerekir:
main.py python-powered.png test_main.py web_app.py
3. HTTP Cloud Functions ile tanışma
Python'da HTTP Cloud Functions işlevleri, normal Python işlevleri olarak yazılır. İşlev, genellikle request olarak adlandırılan tek bir flask.Request bağımsız değişkenini kabul etmelidir.
main.py
import flask
def hello_world(request: flask.Request) -> flask.Response:
"""HTTP Cloud Function.
Returns:
- "Hello World! 👋"
"""
response = "Hello World! 👋"
return flask.Response(response, mimetype="text/plain")
# ...
Dosyayı tercih ettiğiniz komut satırı düzenleyiciyle (nano, vim veya emacs) açabilirsiniz. Kaynak dizini çalışma alanı olarak ayarladıktan sonra Cloud Shell Düzenleyici'de de açabilirsiniz:
cloudshell open-workspace .
Şimdi gcloud functions deploy komutunu kullanarak bu işlevi bir HTTP Cloud Functions işlevi olarak dağıtalım:
FUNCTION_NAME="hello_world" gcloud functions deploy $FUNCTION_NAME \ --runtime python312 \ --trigger-http \ --allow-unauthenticated
Komut çıkışı:
... Deploying function (may take a while - up to 2 minutes)...done. availableMemoryMb: 256 ... entryPoint: FUNCTION_NAME httpsTrigger: url: https://REGION-PROJECT_ID.cloudfunctions.net/FUNCTION_NAME ...
gcloud functions deploy seçenekleriyle ilgili notlar:
--runtime: Bu, dil çalışma zamanını belirtir. Python için bu değer şu andapython37,python38,python39,python310veyapython312olabilir. Çalışma zamanları bölümüne bakın.--trigger-http: İşleve bir uç nokta atanır. Uç noktaya gönderilen HTTP istekleri (POST, PUT, GET, DELETE ve OPTIONS) işlevin yürütülmesini tetikler.--allow-unauthenticated: İşlev herkese açık olur ve kimlik doğrulaması kontrol edilmeden tüm arayanlara izin verilir.- Daha fazla bilgi edinmek için gcloud functions deploy sayfasına bakın.
İşlevi test etmek için yukarıdaki komut çıkışında gösterilen httpsTrigger.url URL'sini tıklayabilirsiniz. Ayrıca URL'yi programatik olarak alabilir ve aşağıdaki komutlarla işlevi çağırabilirsiniz:
URL=$(gcloud functions describe $FUNCTION_NAME --format "value(httpsTrigger.url)") curl -w "\n" $URL
Aşağıdaki sonucu almanız gerekir:
Hello World! 👋
4. Bağımsız değişken alan bir HTTP Cloud Functions işlevi yazma
İşlevler, bağımsız değişkenleri kabul ettiklerinde daha çok yönlü olur. name parametresini destekleyen yeni bir hello_name işlevi tanımlayalım:
main.py
# ...
def hello_name(request: flask.Request) -> flask.Response:
"""HTTP Cloud Function.
Returns:
- "Hello {NAME}! 🚀" if "name=NAME" is defined in the GET request
- "Hello World! 🚀" otherwise
"""
name = request.args.get("name", "World")
response = f"Hello {name}! 🚀"
return flask.Response(response, mimetype="text/plain")
# ...
Bu yeni işlevi dağıtalım:
FUNCTION_NAME="hello_name" gcloud functions deploy $FUNCTION_NAME \ --runtime python312 \ --trigger-http \ --allow-unauthenticated
Komut çıkışı:
... Deploying function (may take a while - up to 2 minutes)...done. availableMemoryMb: 256 ... entryPoint: FUNCTION_NAME httpsTrigger: url: https://REGION-PROJECT_ID.cloudfunctions.net/FUNCTION_NAME ...
İşlevi test etmek için yukarıdaki komut çıkışında gösterilen httpsTrigger.url URL'sini tıklayabilirsiniz. Ayrıca URL'yi programatik olarak alabilir ve aşağıdaki komutlarla işlevi çağırabilirsiniz:
URL=$(gcloud functions describe $FUNCTION_NAME --format "value(httpsTrigger.url)") curl -w "\n" $URL
Varsayılan sonucu almanız gerekir:
Hello World! 🚀
name bağımsız değişkeni ayarlanmadığı için varsayılan sonucu görüyorsunuz. URL'ye bir parametre ekleyin:
curl -w "\n" $URL?name=YOUR%20NAME
Bu kez özel yanıtınızı alırsınız:
Hello YOUR NAME! 🚀
Sonraki adım, kaynak kodu güncellendiğinde işlevlerinizin beklendiği gibi çalışmaya devam etmesini sağlamak için birim testleri eklemektir.
5. Test yazma
Python'da HTTP Cloud Functions işlevleri, standart kitaplıktaki unittest modülü kullanılarak test edilir. İşlevinizi test etmek için emülatör veya başka bir simülasyon çalıştırmanız gerekmez. Normal Python kodu yeterlidir.
hello_world ve hello_name işlevleri için test şu şekilde görünür:
test_main.py
import unittest
import unittest.mock
import main
class TestHello(unittest.TestCase):
def test_hello_world(self):
request = unittest.mock.Mock()
response = main.hello_world(request)
assert response.status_code == 200
assert response.get_data(as_text=True) == "Hello World! 👋"
def test_hello_name_no_name(self):
request = unittest.mock.Mock(args={})
response = main.hello_name(request)
assert response.status_code == 200
assert response.get_data(as_text=True) == "Hello World! 🚀"
def test_hello_name_with_name(self):
name = "FirstName LastName"
request = unittest.mock.Mock(args={"name": name})
response = main.hello_name(request)
assert response.status_code == 200
assert response.get_data(as_text=True) == f"Hello {name}! 🚀"
- Python testleri, diğer Python dosyalarıyla aynı şekilde yazılır. Bir dizi içe aktarma işlemiyle başlar, ardından sınıfları ve işlevleri tanımlarlar.
- Test beyanı
class TestHello(TestCase)biçimindedir.unittest.TestCasesınıfından devralınan bir sınıf olmalıdır. - Test sınıfında, her biri
test_ile başlaması gereken ve ayrı test senaryolarını temsil eden yöntemler bulunur. - Her test durumu,
requestparametresini taklit ederek (yani, test için gereken belirli verileri içeren sahte bir nesneyle değiştirerek) işlevlerimizden birini test eder. - Her işlev çağrıldıktan sonra test, HTTP yanıtını kontrol ederek beklediğimiz yanıt olup olmadığını doğrular.
main.py, flask'e bağlı olduğundan test ortamınızda Flask çerçevesinin yüklü olduğundan emin olun:
pip install flask
Flask'i yüklediğinizde aşağıdakine benzer bir sonuç elde edersiniz:
Collecting flask ... Successfully installed ... flask-3.0.2 ...
Bu testleri yerel olarak çalıştırın:
python -m unittest
Üç birim testi de başarılı olmalıdır:
... ---------------------------------------------------------------------- Ran 3 tests in 0.001s OK
Ardından, "Python Powered" logosunu döndüren yeni bir işlev oluşturacaksınız.
6. "Python destekli" HTTP Cloud Functions işlevini yazma
Her istek için "Python Powered" resmini döndürerek yeni bir işlevi biraz daha eğlenceli hale getirelim:

Aşağıdaki listede, bunu gerçekleştirecek kod gösterilmektedir:
main.py
# ...
def python_powered(request: flask.Request) -> flask.Response:
"""HTTP Cloud Function.
Returns:
- The official "Python Powered" logo
"""
return flask.send_file("python-powered.png")
Yeni bir python_powered işlevi dağıtın:
FUNCTION_NAME="python_powered" gcloud functions deploy $FUNCTION_NAME \ --runtime python312 \ --trigger-http \ --allow-unauthenticated
Komut çıkışı:
... Deploying function (may take a while - up to 2 minutes)...done. availableMemoryMb: 256 ... entryPoint: FUNCTION_NAME httpsTrigger: url: https://REGION-PROJECT_ID.cloudfunctions.net/FUNCTION_NAME ...
İşlevi test etmek için yukarıdaki komut çıkışında gösterilen httpsTrigger.url URL'sini tıklayın. Her şey doğru çalışıyorsa yeni bir tarayıcı sekmesinde "Python Powered" logosunu görürsünüz.
Ardından, işlevinizi dağıtımdan önce yerel olarak çalıştırıp deneyebilmek için bir uygulama oluşturacaksınız.
7. İşlevi yerel olarak çalıştırma
Bir web uygulaması oluşturup işlevinizi bir rotada çağırarak HTTP işlevini yerel olarak çalıştırabilirsiniz. Bu dosyayı işlevinizle aynı dizine ekleyebilirsiniz. web_app.py adlı dosya aşağıdaki içeriğe sahiptir:
web_app.py
import flask
import main
app = flask.Flask(__name__)
@app.get("/")
def index():
return main.python_powered(flask.request)
if __name__ == "__main__":
# Local development only
# Run "python web_app.py" and open http://localhost:8080
app.run(host="localhost", port=8080, debug=True)
- Bu dosya bir Flask uygulaması oluşturur.
- Ana URL'de
index()adlı işlevle işlenen bir rota kaydeder. - Ardından
index()işlevi, geçerli isteği ileterekpython_poweredişlevimizi çağırır.
Geliştirme ortamınızda Flask çerçevesinin yüklü olduğundan emin olun:
pip install flask
Flask'i yüklediğinizde aşağıdakine benzer bir sonuç elde edersiniz:
Collecting flask ... Successfully installed ... flask-3.0.2 ...
Bu uygulamayı yerel olarak çalıştırmak için aşağıdaki komutu çalıştırın:
python web_app.py
Şimdi Cloud Shell web önizlemesini kullanarak web uygulamasını tarayıcınızda test edin. Cloud Shell'de "Web Önizlemesi" düğmesini tıklayın ve "8080 bağlantı noktasında önizle"yi seçin:

Cloud Shell, proxy hizmetindeki önizleme URL'sini yeni bir tarayıcı penceresinde açar. Web önizlemesi, HTTPS üzerinden erişimi yalnızca kullanıcı hesabınızla kısıtlar. Her şey düzgün çalışıyorsa "Python Powered" logosunu görürsünüz.

8. Tebrikler!

Flask çerçevesiyle web isteklerini işleyen deyimsel işlevleri kullanarak HTTP Cloud Functions işlevlerini dağıttınız.
Cloud Functions fiyatlandırması, işlevinizin ne sıklıkta çağrıldığına göre belirlenir. Sık çalıştırılmayan işlevler için ücretsiz katman da sunulur. Cloud Functions işlevlerinizi test etmeyi tamamladıktan sonra gcloud komutunu kullanarak silebilirsiniz:
gcloud functions delete hello_world --quiet gcloud functions delete hello_name --quiet gcloud functions delete python_powered --quiet
İşlevleri Google Cloud Console'dan da silebilirsiniz.
Python'da Cloud Functions'ı keyifle kullanmanızı dileriz.