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

1. Giriş

c9b0cc839df0bb8f.png

Bir dizi sunucusuz görevi tanımladığınız sırayla birbirine bağlayan sunucusuz iş akışları oluşturmak için Workflows'u kullanabilirsiniz. Esnek sunucusuz uygulamalar oluşturmak için Google Cloud'un API'lerinin, Cloud Functions ve Cloud Run gibi sunucusuz ürünlerinin ve harici API'lere yapılan çağrıların gücünü birleştirebilirsiniz.

Workflows için altyapı yönetimi gerekmez ve sıfıra ölçeklendirme de dahil olmak üzere talebe göre sorunsuz şekilde ölçeklendirilir. Kullanım başına ödeme fiyatlandırma modeli sayesinde 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 Workflows'a nasıl bağlayacağınızı öğreneceksiniz. Daha spesifik olarak, iki genel Cloud Functions hizmetini, bir özel Cloud Run hizmetini ve harici bir genel HTTP API'sini bir iş akışına bağlayacaksınız.

Neler öğreneceksiniz?

  • İş akışlarının temel özellikleri.
  • Herkese açık Cloud Functions'ı Workflows'a bağlama
  • Özel Cloud Run hizmetlerini Workflows'a bağlama
  • Harici HTTP API'lerini Workflows'a bağlama.

2. Kurulum ve Gereksinimler

Yönlendirmesiz ortam kurulumu

  1. Cloud Console'da oturum açın ve 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.)

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 kimlik, tüm Google Cloud projelerinde benzersiz bir addır (Yukarıdaki ad zaten alınmış olduğundan sizin için çalışmayacaktır). Bu codelab'in ilerleyen kısımlarında PROJECT_ID olarak adlandırılacaktır.

  1. Ardından, Google Cloud kaynaklarını kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir.

Bu codelab'i tamamlamak neredeyse hiç maliyetli değildir. Bu eğitimin ötesinde faturalandırma ücreti alınmaması için kaynakları nasıl kapatacağınız konusunda size tavsiyelerde bulunan "Temizleme" bölümündeki talimatları uyguladığınızdan emin olun. Google Cloud'un yeni kullanıcıları 300 ABD doları değerinde ücretsiz deneme programından yararlanabilir.

Cloud Shell'i başlatma

Google Cloud, dizüstü bilgisayarınızdan uzaktan çalıştırılabilir. Ancak 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 Cloud Shell simgesini tıklayın:

STgwiN06Y0s_gL7i9bTed8duc9tWOIaFw0z_4QOjc-jeOmuH2TBK8l4udei56CKPLoM_i1yEF6pn5Ga88eniJQoEh8cAiTH79gWUHJdKOw0oiBZfBpOdcEOl6p29i4mvPe_A6UMJBQ

Ortamın temel hazırlığı ve bağlanması yalnızca birkaç dakikanızı alır. İşlem tamamlandığında aşağıdakine benzer bir sonuç görürsünüz:

r6WRHJDzL-GdB5VDxMWa67_cQxRR_x_xCG5xdt9Nilfuwe9fTGAwM9XSZbNPWvDSFtrZ7DDecKqR5_pIq2IJJ9puAMkC3Kt4JbN9jfMX3gAwTNHNqFmqOJ-3iIX5HSePO4dNVZUkNA

Bu sanal makine, ihtiyaç duyacağınız tüm geliştirme araçlarını içerir. 5 GB boyutunda kalıcı bir ana dizin sunar ve Google Cloud üzerinde çalışır. Bu sayede ağ performansı ve kimlik doğrulama önemli ölçüde güçlenir. Bu laboratuvardaki çalışmalarınızın tamamını yalnızca bir tarayıcı kullanarak yapabilirsiniz.

3. İş Akışlarına Genel Bakış

Temel seviye

İş akışı, Workflows'un 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 dizimi hakkında ayrıntılı açıklama için Söz dizimi referansı sayfasına bakın.

Bir iş akışı oluşturulduğunda dağıtılır ve yürütülmeye hazır hale gelir. Yürütme, bir iş akışının tanımında yer alan mantığın tek bir çalıştırılmasıdır. Tüm iş akışı yürütmeleri bağımsızdır ve ürün, eşzamanlı olarak çok sayıda yürütmeyi destekler.

Hizmetleri etkinleştirme

Bu codelab'de Cloud Functions ve Cloud Run hizmetlerini Workflows'a bağlayacaksınız. Hizmetleri oluştururken 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 iş akışında birbirine bağlayacaksınız.

4. İlk Cloud Functions işlevini dağıtma

İlk işlev, Python'da rastgele sayı üreteci işlevidir.

İşlev kodu için bir dizin oluşturun ve bu dizine gidin:

mkdir ~/randomgen
cd ~/randomgen

Dizinde 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 geri döndürür.

İşlev, HTTP işleme için Flask'i 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

Aşağıdaki komutla, kimliği doğrulanmamış isteklere izin verilen bir HTTP tetikleyicisiyle işlevi dağıtın:

gcloud functions deploy randomgen \
    --runtime python312 \
    --trigger-http \
    --allow-unauthenticated

İşlev dağıtıldıktan sonra, işlevin URL'sini konsolda gösterilen url özelliği altında veya gcloud functions describe komutuyla birlikte görebilirsiniz.

Ayrıca, aşağıdaki curl komutuyla işlevin URL'sini de ziyaret edebilirsiniz:

curl $(gcloud functions describe randomgen --format='value(url)')

İşlev, iş akışı için hazı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

Dizinde 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 geri döndürür.

Aynı dizinde aşağıdaki içeriklerle aynı requirements.txt dosyasını oluşturun:

flask>=1.0.2

Aşağıdaki komutla, kimliği doğrulanmamış isteklere izin verilen bir HTTP tetikleyicisiyle işlevi 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ışı için hazır.

6. İki Cloud Functions işlevini bağlama

İlk iş akışında iki işlevi birbirine bağlayın.

Aşağıdaki içeriklerle 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ıp ikinci işleve iletiyorsunuz. 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, iş akışında harici bir hizmet olarak math.js'yi 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 öğesini bulun:

7608a7991b33bbb0.png

İş akışınızı bulup Definition sekmesini tıklayın:

f3c8c4d3ffa49b1b.png

İş akışı tanımını düzenleyin ve math.js'ı arama ç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 aktarıyor.

Kullanıcı arayüzü, iş akışını düzenleme ve dağıtma konusunda size yol gösterir. Dağıtım tamamlandıktan sonra iş akışını yürütmek için Execute simgesini tıklayın. Yürütme ayrıntılarını görürsünüz:

b40c76ee43a1ce65.png

Durum kodunun 200 ve günlük işlevinin çıkışıyla birlikte body simgesinin gösterildiğini fark edin.

İş akışımıza harici bir hizmet entegre ettiniz. Harika!

8. Cloud Run hizmeti dağıtma

Son bölümde, iş akışını özel bir Cloud Run hizmetine yapılan çağrıyla tamamlayın. Bu, iş akışının Cloud Run hizmetini çağırmak için 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ç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ıları dağıtır. Bu nedenle, Dockerfile değişkenine ihtiyacınız vardır ve kapsayıcınızın 0.0.0.0 ve PORT ortam değişkenine bağlanması gerekir. Bu nedenle yukarıdaki kod kullanılı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 geri döndürür.

Aynı dizinde aşağıdaki Dockerfile öğelerini 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, 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

Dağıtım tamamlandıktan sonra hizmet iş akışına hazır olur.

9. Cloud Run hizmetini bağlama

İş Akışları'nı özel Cloud Run hizmetini çağıracak şekilde yapılandırmadan önce İş Akışları'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ünü verin. Bu işlem, 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 ilettiğinden emin olmak için auth alanını da 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. Hizmet hesabında geçen süre:

gcloud workflows deploy workflow \
    --source=workflow.yaml \
    --service-account=${SERVICE_ACCOUNT}@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com

İş akışını yürütün:

gcloud workflows execute workflow

Birkaç saniye içinde iş akışı yürütme işlemine göz atarak sonucu görebilirsiniz:

gcloud workflows executions describe <your-execution-id> --workflow workflow

Çıkışta result ve state tam sayıları yer alır:

result: '{"body":"5","code":200 ... } 

...
state: SUCCEEDED

10. Tebrikler!

Codelab'i tamamladığınız için tebrik ederiz.

İşlediğimiz konular

  • İş akışlarının temel özellikleri.
  • Herkese açık Cloud Functions'ı Workflows'a bağlama
  • Özel Cloud Run hizmetlerini Workflows'a bağlama
  • Harici HTTP API'lerini Workflows'a bağlama.