1. Giriş
Bir dizi sunucusuz görevi tanımladığınız sırada birbirine bağlayan sunucusuz iş akışları oluşturmak için Workflows'ı kullanabilirsiniz. Google Cloud API'lerinin gücünü, Cloud Functions ve Cloud Run gibi sunucusuz ürünlerin gücünü ve harici API'lere yapılan çağrıları birleştirerek esnek sunucusuz uygulamalar oluşturabilirsiniz.
İş akışları için altyapı yönetimi gerekmez ve sıfıra kadar ölçeklendirme dahil olmak üzere taleple sorunsuz şekilde ölçeklendirilir. Kullanım başına ödeme fiyatlandırma modeliyle yalnızca yürütme süresi için ödeme yaparsınız.
Bu codelab'de, çeşitli Google Cloud hizmetlerini ve harici HTTP API'lerini iş akışlarına nasıl bağlayacağınızı öğreneceksiniz. Daha ayrıntılı olarak belirtmek gerekirse, iki herkese açık Cloud Functions hizmetini, bir özel Cloud Run hizmetini ve harici bir herkese açık HTTP API'yi bir iş akışına bağlayacaksınız.
Neler öğreneceksiniz?
- Workflows'a giriş.
- Herkese açık Cloud Functions'ı Workflows'a bağlama.
- Özel Cloud Run hizmetlerini iş akışlarına bağlama.
- Harici HTTP API'lerini Workflows'a bağlama.
2. Kurulum ve Gereksinimler
Kendine ait tempoda ortam oluşturma
- Cloud Console'da oturum açın ve yeni bir proje oluşturun veya mevcut bir projeyi yeniden kullanın. (Henüz Gmail veya G Suite hesabınız yoksa hesap oluşturmanız gerekir.)
Proje kimliğini unutmayın. Bu, tüm Google Cloud projeleri genelinde benzersiz bir addır (yukarıdaki ad zaten alınmış olduğundan kullanılamaz). Bu kod laboratuvarının ilerleyen bölümlerinde PROJECT_ID
olarak atıfta bulunulacak.
- Ardından, Google Cloud kaynaklarını kullanabilmek için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir.
Bu codelab'i çalıştırmak çok pahalı olmayacaktır. Bu eğiticinin dışında faturalandırılmamak için "Temizleme" bölümündeki kaynakları nasıl kapatacağınıza dair talimatları uyguladığınızdan emin olun. Google Cloud'un yeni kullanıcıları 300 ABD doları değerinde ücretsiz deneme programına uygundur.
Cloud Shell'i başlatma
Google Cloud, dizüstü bilgisayarınızdan uzaktan çalıştırılabilir olsa da bu kod laboratuvarında Cloud'da çalışan bir komut satırı ortamı olan Google Cloud Shell'i kullanacaksınız.
GCP Console'da, sağ üstteki araç çubuğunda Cloud Shell simgesini tıklayın:
Ortam sağlanıp bağlantı kurulabilmesi için birkaç saniye beklemeniz gerekir. İşlem tamamlandığında aşağıdakine benzer bir ekran görürsünüz:
Bu sanal makinede ihtiyacınız olan tüm geliştirme araçları yüklüdür. 5 GB boyutunda kalıcı bir ana dizin sunar ve Google Cloud üzerinde çalışır. Bu sayede ağ performansını ve kimlik doğrulamayı büyük ölçüde iyileştirir. Bu laboratuvardaki tüm çalışmalarınızı yalnızca bir tarayıcı kullanarak yapabilirsiniz.
3. İş Akışlarına Genel Bakış
Temel seviye
İş akışı, Workflows YAML tabanlı söz dizimi kullanılarak açıklanan bir dizi adımdan oluşur. Bu, iş akışının tanımıdır. Workflows YAML söz dizimine dair ayrıntılı açıklama için Söz dizimi referansı sayfasına bakın.
Oluşturulan iş akışları dağıtılır. Bu sayede iş akışları yürütülmeye hazır hale gelir. Yürütme, bir iş akışının tanımında bulunan mantığın tek bir çalıştırmasıdır. Tüm iş akışı yürütmeleri bağımsızdır ve ürün çok sayıda eşzamanlı yürütmeyi destekler.
Hizmetleri etkinleştirme
Bu codelab'de Cloud Functions ve Cloud Run hizmetlerini iş akışlarına bağlayacaksınız. Ayrıca, hizmet oluşturma sırasında Cloud Build ve Cloud Storage'ı da kullanacaksınız.
Gerekli tüm hizmetleri etkinleştirin:
gcloud services enable \ cloudfunctions.googleapis.com \ run.googleapis.com \ workflows.googleapis.com \ cloudbuild.googleapis.com \ storage.googleapis.com
Bir sonraki adımda, iki Cloud Functions işlevini bir iş akışında birbirine bağlayacaksınız.
4. İlk Cloud Functions işlevini dağıtma
İlk işlev, Python'da rastgele sayı üretecidir.
İşlev kodu için bir dizin oluşturun ve bu dizine gidin:
mkdir ~/randomgen cd ~/randomgen
Dizine aşağıdaki içeriklere sahip bir main.py
dosyası oluşturun:
import random, json from flask import jsonify def randomgen(request): randomNum = random.randint(1,100) output = {"random":randomNum} return jsonify(output)
Bu işlev, bir HTTP isteği aldığında 1 ile 100 arasında rastgele bir sayı oluşturur ve JSON biçiminde arayana döndürür.
İşlev, HTTP işleme için Flask'ı kullanır ve bu bağımlılığı eklememiz gerekir. Python'daki bağımlılıklar pip ile yönetilir ve requirements.txt
adlı bir meta veri dosyasında ifade edilir.
Aynı dizinde aşağıdaki içeriğe sahip bir requirements.txt
dosyası oluşturun:
flask>=1.0.2
İşlevi, HTTP tetikleyiciyle ve kimliği doğrulanmayan isteklerin izin verildiği bu komutla dağıtın:
gcloud functions deploy randomgen \ --runtime python312 \ --trigger-http \ --allow-unauthenticated
İşlev dağıtıldıktan sonra, işlevin URL'sini konsolda veya gcloud functions describe
komutuyla gösterilen url
mülkünün altında görebilirsiniz.
Aşağıdaki curl
komutuyla işlevin URL'sini de ziyaret edebilirsiniz:
curl $(gcloud functions describe randomgen --format='value(url)')
İşlev, iş akışına hazırdır.
5. İkinci Cloud Functions işlevini dağıtma
İkinci işlev bir çarpandır. Alınan girişi 2 ile çarpar.
İşlev kodu için bir dizin oluşturun ve bu dizine gidin:
mkdir ~/multiply cd ~/multiply
Dizine aşağıdaki içeriklere sahip bir main.py
dosyası oluşturun:
import random, json from flask import jsonify def multiply(request): request_json = request.get_json() output = {"multiplied":2*request_json['input']} return jsonify(output)
Bu işlev, bir HTTP isteği aldığında JSON gövdesinden input
değerini çıkarır, 2 ile çarpar ve JSON biçiminde arayana döndürür.
Aynı dizinde aşağıdaki içeriklere sahip aynı requirements.txt
dosyasını oluşturun:
flask>=1.0.2
İşlevi, HTTP tetikleyiciyle ve kimliği doğrulanmayan isteklerin izin verildiği bu komutla dağıtın:
gcloud functions deploy multiply \ --runtime python312 \ --trigger-http \ --allow-unauthenticated
İşlev dağıtıldıktan sonra aşağıdaki curl
komutuyla işlevin URL'sini de ziyaret edebilirsiniz:
curl $(gcloud functions describe multiply --format='value(url)') \ -X POST \ -H "content-type: application/json" \ -d '{"input": 5}'
İşlev, iş akışına hazırdır.
6. İki Cloud Functions'ı bağlama
İlk iş akışında iki işlevi birbirine bağlayın.
Aşağıdaki içerikleri içeren bir workflow.yaml
dosyası oluşturun.
- randomgenFunction: call: http.get args: url: https://<region>-<project-id>.cloudfunctions.net/randomgen result: randomgenResult - multiplyFunction: call: http.post args: url: https://<region>-<project-id>.cloudfunctions.net/multiply body: input: ${randomgenResult.body.random} result: multiplyResult - returnResult: return: ${multiplyResult}
Bu iş akışında, ilk işlevden rastgele bir sayı alır ve bunu ikinci işleve iletirsiniz. Sonuç, çarpılan rastgele sayıdır.
İlk iş akışını dağıtın:
gcloud workflows deploy workflow --source=workflow.yaml
İlk iş akışını yürütün:
gcloud workflows execute workflow
İş akışı yürütüldükten sonra, önceki adımda verilen yürütme kimliğini ileterek sonucu görebilirsiniz:
gcloud workflows executions describe <your-execution-id> --workflow workflow
Çıkışta result
ve state
yer alır:
result: '{"body":{"multiplied":108},"code":200 ... } ... state: SUCCEEDED
7. Harici bir HTTP API'si bağlama
Ardından, math.js'yi iş akışında harici bir hizmet olarak bağlayacaksınız.
math.js'de matematiksel ifadeleri şu şekilde değerlendirebilirsiniz:
curl https://api.mathjs.org/v4/?'expr=log(56)'
Bu kez iş akışımızı güncellemek için Cloud Console'u kullanacaksınız. Google Cloud Console'da Workflows
'yi bulun:
İş akışınızı bulun ve Definition
sekmesini tıklayın:
İş akışı tanımını düzenleyin ve math.js
çağrısı ekleyin.
- randomgenFunction: call: http.get args: url: https://<region>-<project-id>.cloudfunctions.net/randomgen result: randomgenResult - multiplyFunction: call: http.post args: url: https://<region>-<project-id>.cloudfunctions.net/multiply body: input: ${randomgenResult.body.random} result: multiplyResult - logFunction: call: http.get args: url: https://api.mathjs.org/v4/ query: expr: ${"log(" + string(multiplyResult.body.multiplied) + ")"} result: logResult - returnResult: return: ${logResult}
İş akışı artık çarpma işlevinin çıktısını math.js
içindeki bir günlük işlevi çağrısına besler.
Kullanıcı arayüzü, iş akışını düzenleme ve dağıtma konusunda size yol gösterir. Dağıtıldıktan sonra iş akışını yürütmek için Execute
simgesini tıklayın. Yürütmeyle ilgili ayrıntıları görürsünüz:
log işlevinin çıktısıyla birlikte 200
durum koduna ve body
değerine dikkat edin.
İş akışımıza harici bir hizmet entegre ettiniz. Bu çok güzel.
8. Cloud Run hizmetini dağıtma
Son bölümde, özel bir Cloud Run hizmetine çağrı yaparak iş akışını tamamlayın. Bu, Cloud Run hizmetini çağırmak için iş akışının kimlik doğrulamasının yapılması gerektiği anlamına gelir.
Cloud Run hizmeti, iletilen sayının math.floor
değerini döndürür.
Hizmet kodu için bir dizin oluşturun ve bu dizine gidin:
mkdir ~/floor cd ~/floor
Dizine aşağıdaki içeriklere sahip bir app.py
dosyası oluşturun:
import json import logging import os import math from flask import Flask, request app = Flask(__name__) @app.route('/', methods=['POST']) def handle_post(): content = json.loads(request.data) input = float(content['input']) return f"{math.floor(input)}", 200 if __name__ != '__main__': # Redirect Flask logs to Gunicorn logs gunicorn_logger = logging.getLogger('gunicorn.error') app.logger.handlers = gunicorn_logger.handlers app.logger.setLevel(gunicorn_logger.level) app.logger.info('Service started...') else: app.run(debug=True, host='0.0.0.0', port=int(os.environ.get('PORT', 8080)))
Cloud Run, kapsayıcı dağıtır. Bu nedenle, bir Dockerfile
'e ihtiyacınız vardır ve kapsayıcınızın 0.0.0.0
ve PORT
env değişkenine bağlanması gerekir. Bu nedenle yukarıdaki kod kullanılmıştır.
Bu işlev, bir HTTP isteği aldığında JSON gövdesinden input
değerini çıkarır, math.floor işlevini çağırır ve sonucu arayana döndürür.
Aynı dizinde aşağıdaki Dockerfile
dosyasını oluşturun:
# Use an official lightweight Python image. # https://hub.docker.com/_/python FROM python:3.7-slim # Install production dependencies. RUN pip install Flask gunicorn # Copy local code to the container image. WORKDIR /app COPY . . # Run the web service on container startup. Here we use the gunicorn # webserver, with one worker process and 8 threads. # For environments with multiple CPU cores, increase the number of workers # to be equal to the cores available. CMD exec gunicorn --bind 0.0.0.0:8080 --workers 1 --threads 8 app:app
Container'ı oluşturun:
export SERVICE_NAME=floor gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/${SERVICE_NAME}
Container oluşturulduktan sonra Cloud Run'a dağıtın. no-allow-unauthenticated
işaretine dikkat edin. Bu sayede hizmet yalnızca kimliği doğrulanmış çağrıları kabul eder:
gcloud run deploy ${SERVICE_NAME} \ --image gcr.io/${GOOGLE_CLOUD_PROJECT}/${SERVICE_NAME} \ --platform managed \ --no-allow-unauthenticated
Hizmet dağıtıldıktan sonra iş akışına hazır olur.
9. Cloud Run hizmetini bağlama
İş Akışı'nı özel Cloud Run hizmetini çağıracak şekilde yapılandırmadan önce, İş Akışı'nın kullanacağı bir hizmet hesabı oluşturmanız gerekir:
export SERVICE_ACCOUNT=workflows-sa gcloud iam service-accounts create ${SERVICE_ACCOUNT}
Hizmet hesabına run.invoker
rolü verin. Bu, hizmet hesabının kimliği doğrulanmış Cloud Run hizmetlerini çağırmasına olanak tanır:
gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \ --member "serviceAccount:${SERVICE_ACCOUNT}@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \ --role "roles/run.invoker"
workflow.yaml
içindeki iş akışı tanımını Cloud Run hizmetini içerecek şekilde güncelleyin. Workflows'un Cloud Run hizmetine yaptığı çağrılarda kimlik doğrulama jetonunu iletmesini sağlamak için auth
alanını da nasıl eklediğinize dikkat edin:
- randomgenFunction: call: http.get args: url: https://<region>-<project-id>.cloudfunctions.net/randomgen result: randomgenResult - multiplyFunction: call: http.post args: url: https://<region>-<project-id>.cloudfunctions.net/multiply body: input: ${randomgenResult.body.random} result: multiplyResult - logFunction: call: http.get args: url: https://api.mathjs.org/v4/ query: expr: ${"log(" + string(multiplyResult.body.multiplied) + ")"} result: logResult - floorFunction: call: http.post args: url: https://floor-<random-hash>.run.app auth: type: OIDC body: input: ${logResult.body} result: floorResult - returnResult: return: ${floorResult}
İş akışını güncelleyin. Bu sefer hizmet hesabını iletin:
gcloud workflows deploy workflow \ --source=workflow.yaml \ --service-account=${SERVICE_ACCOUNT}@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com
İş akışını yürütme:
gcloud workflows execute workflow
Sonucu görmek için birkaç saniye içinde iş akışı yürütme işlemine göz atabilirsiniz:
gcloud workflows executions describe <your-execution-id> --workflow workflow
Çıkışta bir tam sayı result
ve state
yer alır:
result: '{"body":"5","code":200 ... } ... state: SUCCEEDED
10. Tebrikler!
Codelab'i tamamladığınız için tebrikler.
Ele aldığımız konular
- Workflows'a giriş.
- Herkese açık Cloud Functions'ı Workflows'a bağlama.
- Özel Cloud Run hizmetlerini iş akışlarına bağlama.
- Harici HTTP API'lerini Workflows'a bağlama.