İş akışları ile sunucusuz düzenlemeye giriş

1. Giriş

c9b0cc839df0bb8f.png

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

  1. 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.)

H_hgylo4zxOllHaAbPKJ7VyqCKPDUnDhkr-BsBIFBsrB6TYSisg6LX-uqmMhh4sXUy_hoa2Qv87C2nFmkg-QAcCiZZp0qtpf6VPaNEEfP_iqt29KVLD-gklBWugQVeOWsFnJmNjHDw

dcCPqfBIwNO4R-0fNQLUC4aYXOOZhKhjUnakFLZJGeziw2ikOxGjGkCHDwN5x5kCbPFB8fiOzZnX-GfuzQ8Ox-UU15BwHirkVPR_0RJwl0oXrhqZmMIvZMa_uwHugBJIdx5-bZ6Z8Q

jgLzVCxk93d6E2bbonzATKA4jFZReoQ-fORxZZLEi5C3D-ubnv6nL-eP-iyh7qAsWyq_nyzzuEoPFD1wFOFZOe4FWhPBJjUDncnTxTImT3Ts9TM54f4nPpsAp52O0y3Cb19IceAEgQ

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.

  1. 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:

STgwiN06Y0s_gL7i9bTed8duc9tWOIaFw0z_4QOjc-jeOmuH2TBK8l4udei56CKPLoM_i1yEF6pn5Ga88eniJQoEh8cAiTH79gWUHJdKOw0oiBZfBpOdcEOl6p29i4mvPe_A6UMJBQ

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:

r6WRHJDzL-GdB5VDxMWa67_cQxRR_x_xCG5xdt9Nilfuwe9fTGAwM9XSZbNPWvDSFtrZ7DDecKqR5_pIq2IJJ9puAMkC3Kt4JbN9jfMX3gAwTNHNqFmqOJ-3iIX5HSePO4dNVZUkNA

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:

7608a7991b33bbb0.png

İş akışınızı bulun ve Definition sekmesini tıklayın:

f3c8c4d3ffa49b1b.png

İş 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:

b40c76ee43a1ce65.png

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.