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

1. Giriş

c9b0cc839df0bb8f.png

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

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

H_hgylo4zxOllHaAbPKJ7VyqCKPDUnDhkr-BsBIFBsrB6TYSisg6LX-uqmMhh4sXUy_hoa2Qv87C2nFmkg-QAcCiZZp0qtpf6VPaNEEfP_iqt29KVLD-gklBWugQVeOWsFnJmNjHDw

dcCPqfBIwNO4R-0fNQLUC4aYXOOZhKhjUnakFLZJGeziw2ikOxGjGkCHDwN5x5kCbPFB8fiOzZnX-GfuzQ8Ox-UU15BwHirkVPR_0RJwl0oXrhqZmMIvZMa_uwHugBJIdx5-bZ6Z8Q

jgLzVCxk93d6E2bbonzATKA4jFZReoQ-fORxZZLEi5C3D-ubnv6nL-eP-iyh7qAsWyq_nyzzuEoPFD1wFOFZOe4FWhPBJjUDncnTxTImT3Ts9TM54f4nPpsAp52O0y3Cb19IceAEgQ

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.

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

STgwiN06Y0s_gL7i9bTed8duc9tWOIaFw0z_4QOjc-jeOmuH2TBK8l4udei56CKPLoM_i1yEF6pn5Ga88eniJQoEh8cAiTH79gWUHJdKOw0oiBZfBpOdcEOl6p29i4mvPe_A6UMJBQ

Ortamı sağlamak ve bağlamak yalnızca birkaç dakika sürer. Tamamlandığında şuna benzer bir sonuç görmeniz gerekir:

r6WRHJDzL-GdB5VDxMWa67_cQxRR_x_xCG5xdt9Nilfuwe9fTGAwM9XSZbNPWvDSFtrZ7DDecKqR5_pIq2IJJ9puAMkC3Kt4JbN9jfMX3gAwTNHNqFmqOJ-3iIX5HSePO4dNVZUkNA

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

7608a7991b33bbb0.png

İş akışınızı bulup 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 çı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:

b40c76ee43a1ce65.png

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.