1. Giriş
Bir dizi sunucusuz görevi tanımladığınız bir sırayla birbirine bağlayan sunucusuz iş akışları oluşturmak için İş akışlarını kullanabilirsiniz. Esnek sunucusuz uygulamalar oluşturmak için Google Cloud API'lerinin, Cloud Functions ve Cloud Run gibi sunucusuz ürünlerin ve harici API çağrılarının gücünü birleştirebilirsiniz.
İş akışları, altyapı yönetimi gerektirmez ve sıfıra ölçeklendirme dahil olmak üzere taleple sorunsuz şekilde ölçeklendirilir. Kullandıkça öde fiyatlandırma modelinde sadece yürütme süresi için ödeme yaparsınız.
Bu codelab'de, iş akışları ile çeşitli Google Cloud hizmetlerini ve harici HTTP API'lerini nasıl bağlayacağınızı öğreneceksiniz. Daha açık belirtmek gerekirse, bir özel Cloud Run hizmeti ve herkese açık harici bir HTTP API olmak üzere iki herkese açık Cloud Functions hizmetini iş akışına bağlayacaksınız.
Neler öğreneceksiniz?
- İş Akışlarıyla İlgili Temel Bilgiler.
- Herkese açık Cloud Functions'ı iş akışlarıyla bağlama.
- Özel Cloud Run hizmetlerini Workflows ile bağlama.
- Harici HTTP API'lerini Workflows ile bağlama.
2. Kurulum ve Gereksinimler
Kendi hızınızda ortam kurulumu
- Cloud Console'da oturum açıp yeni bir proje oluşturun veya mevcut bir projeyi yeniden kullanın. (Gmail veya G Suite hesabınız yoksa hesap oluşturmanız gerekir.)
Tüm Google Cloud projelerinde benzersiz bir ad olan proje kimliğini unutmayın (yukarıdaki ad zaten alınmış ve size uygun olmayacaktır!). Bu kod laboratuvarın ilerleyen bölümlerinde PROJECT_ID
olarak adlandırılacaktır.
- Sonraki adımda, Google Cloud kaynaklarını kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir.
Bu codelab'i çalıştırmanın maliyeti, yüksek değildir. "Temizleme" bölümündeki talimatları izlediğinizden emin olun. bölümünde, bu eğiticinin dışında faturalandırmayla karşılaşmamanız için kaynakları nasıl kapatacağınız konusunda tavsiyelerde bulunuyoruz. Yeni Google Cloud kullanıcıları 300 ABD doları ücretsiz deneme programından yararlanabilir.
Cloud Shell'i başlatma
Google Cloud dizüstü bilgisayarınızdan uzaktan çalıştırılabilse de bu codelab'de, 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 yer alan Cloud Shell simgesini tıklayın:
Ortamı sağlamak ve bağlamak yalnızca birkaç dakika sürer. Tamamlandığında şuna benzer bir sonuç görmeniz gerekir:
İhtiyacınız olan tüm geliştirme araçlarını bu sanal makinede bulabilirsiniz. 5 GB boyutunda kalıcı bir ana dizin sunar ve Google Cloud üzerinde çalışarak ağ performansını ve kimlik doğrulamasını büyük ölçüde iyileştirir. Bu laboratuvardaki tüm çalışmalarınızı yalnızca bir tarayıcıyla 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 diziminin ayrıntılı açıklaması için Söz dizimi referansı sayfasını inceleyin.
Bir iş akışı oluşturulduğunda dağıtılarak iş akışını yürütmeye hazır hale getirir. Yürütme, iş akışının tanımında yer alan mantığın tek bir kez çalıştırılmasıdır. Tüm iş akışı yürütmeleri bağımsızdır ve ürün, yüksek sayıda eşzamanlı yürütme işlemini destekler.
Hizmetleri etkinleştirme
Bu codelab'de, Cloud Functions ve Cloud Run hizmetlerini iş akışları ile bağlayacaksınız. Ayrıca hizmet derleme sırasında Cloud Build ve Cloud Storage'ı 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
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 bir sayı oluşturma aracıdır.
İşlev kodu için bir dizin oluşturun ve bu dizine gidin:
mkdir ~/randomgen cd ~/randomgen
Dizinde aşağıdaki içeriğe 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 çağrıya JSON biçiminde geri döner.
İşlev, HTTP işleme için Flask'ı kullanır ve bunu bağımlılık olarak 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çeriklere sahip bir requirements.txt
dosyası oluşturun:
flask>=1.0.2
İşlevi bir HTTP tetikleyicisiyle ve şu komutla izin verilen kimliği doğrulanmamış isteklerle dağıtın:
gcloud functions deploy randomgen \ --runtime python37 \ --trigger-http \ --allow-unauthenticated
İşlev dağıtıldıktan sonra httpsTrigger.url
özelliğinin altında işlevin URL'sini konsolda veya gcloud functions describe
komutuyla görüntüleyebilirsiniz.
Ayrıca, aşağıdaki curl
komutunu kullanarak işlevin URL'sini ziyaret edebilirsiniz:
curl $(gcloud functions describe randomgen --format='value(httpsTrigger.url)')
İşlev, iş akışı için hazırdır.
5. İkinci Cloud Functions işlevini dağıtma
İkinci fonksiyon 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
Dizinde aşağıdaki içeriğe 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
öğesini çıkarır, 2 ile çarpar ve çağrıyı yapana JSON biçiminde geri döner.
Aynı requirements.txt
dosyasını aynı dizinde aşağıdaki içeriklerle oluşturun:
flask>=1.0.2
İşlevi bir HTTP tetikleyicisiyle ve şu komutla izin verilen kimliği doğrulanmamış isteklerle dağıtın:
gcloud functions deploy multiply \ --runtime python37 \ --trigger-http \ --allow-unauthenticated
İşlev dağıtıldıktan sonra aşağıdaki curl
komutunu kullanarak işlevin URL'sini de ziyaret edebilirsiniz:
curl $(gcloud functions describe multiply --format='value(httpsTrigger.url)') \ -X POST \ -H "content-type: application/json" \ -d '{"input": 5}'
İşlev, iş akışı için hazırdır.
6. İki Cloud Functions işlevini bağlayın
İlk iş akışında, iki işlevi birbirine bağlayın.
Aşağıdaki içeriklere sahip 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 fonksiyondan rastgele bir sayı alıp ikinci işleve iletiyorsunuz. Sonuç, rastgele sayının çarpımı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 HTTP API'si bağla
Ardından, iş akışında math.js'yi harici bir hizmet olarak bağlayacaksınız.
math.js'de, aşağıdaki gibi matematiksel ifadeleri 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
aracını bulun:
İş akışınızı bulup 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 çıkışını math.js
içindeki bir günlük işlevi çağrısına besliyor.
Kullanıcı arayüzü, iş akışını düzenlemenize ve dağıtmanıza yardımcı olur. Dağıtımdan sonra iş akışını yürütmek için Execute
düğmesini tıklayın. Yürütmenin ayrıntılarını görürsünüz:
200
durum koduna ve günlük işlevinin çıkışını içeren bir body
olduğuna dikkat edin.
İş akışımıza harici bir hizmet entegre ettiniz, süper harika!
8. Cloud Run hizmeti dağıtma
Son bölümde, özel bir Cloud Run hizmetine çağrı yaparak iş akışını sonuçlandırın. Bu, Cloud Run hizmetini çağırmak için iş akışının kimliğinin doğrulanması 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
Dizinde aşağıdaki içeriğe 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, container'ları dağıttığından bir Dockerfile
'ye ihtiyacınız vardır ve container'ınızın 0.0.0.0
ile PORT
ortam değişkenine bağlanması gerekir. Dolayısıyla yukarıdaki kod bu şekildedir.
Bu işlev, bir HTTP isteği aldığında JSON gövdesinden input
öğesini çıkarır, creator.floor öğesini çağırır ve sonucu çağrıya geri döndürür.
Aynı dizinde şu Dockerfile
öğesini 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
Kapsayıcıyı oluşturun:
export SERVICE_NAME=floor gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/${SERVICE_NAME}
Container derlendikten sonra Cloud Run'a dağıtın. no-allow-unauthenticated
işaretine dikkat edin. Bu, hizmetin yalnızca kimliği doğrulanmış çağrıları kabul etmesini sağlar:
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ışı için hazır olur.
9. Cloud Run hizmetini bağlama
Workflows'u özel Cloud Run hizmetini çağıracak şekilde yapılandırmadan önce, Workflows'un 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 işlem, hizmet hesabının kimliği doğrulanmış Cloud Run hizmetlerini çağırmasına izin verir:
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 yapılan çağrılarında kimlik doğrulama jetonunu iletmesi için auth
alanını da dahil ettiğ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. Hizmet hesabında bu süre:
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ışının yürütülmesine göz atabilirsiniz:
gcloud workflows executions describe <your-execution-id> --workflow workflow
Çıkış, bir result
ve state
tam sayısı içerir:
result: '{"body":"5","code":200 ... } ... state: SUCCEEDED
10. Tebrikler!
Codelab'i tamamladığınız için tebrikler.
İşlediklerimiz
- İş Akışlarıyla İlgili Temel Bilgiler.
- Herkese açık Cloud Functions'ı iş akışlarıyla bağlama.
- Özel Cloud Run hizmetlerini Workflows ile bağlama.
- Harici HTTP API'lerini Workflows ile bağlama.