Pengantar orkestrasi serverless dengan Workflows

1. Pengantar

c9b0cc839df0bb8f.png

Anda dapat menggunakan Alur Kerja untuk membuat alur kerja serverless yang menautkan serangkaian tugas serverless secara bersamaan dalam urutan yang Anda tentukan. Anda dapat menggabungkan kecanggihan API Google Cloud, produk serverless seperti Cloud Functions dan Cloud Run, serta panggilan ke API eksternal untuk membuat aplikasi serverless yang fleksibel.

Alur kerja tidak memerlukan pengelolaan infrastruktur dan diskalakan dengan lancar sesuai permintaan, termasuk penskalaan ke nol. Dengan model harga bayar per penggunaan, Anda hanya membayar sesuai waktu eksekusi.

Dalam codelab ini, Anda akan mempelajari cara menghubungkan berbagai layanan Google Cloud dan API HTTP eksternal dengan Alur Kerja. Lebih khusus lagi, Anda akan menghubungkan dua layanan Cloud Functions publik, satu layanan Cloud Run pribadi, dan API HTTP publik eksternal ke dalam alur kerja.

Yang akan Anda pelajari

  • Dasar-Dasar Alur Kerja.
  • Cara menghubungkan Cloud Functions publik dengan Workflow.
  • Cara menghubungkan layanan Cloud Run pribadi dengan Workflows.
  • Cara menghubungkan API HTTP eksternal dengan Workflows.

2. Penyiapan dan Persyaratan

Penyiapan lingkungan mandiri

  1. Login ke Cloud Console dan buat project baru atau gunakan kembali project yang sudah ada. (Jika belum memiliki akun Gmail atau G Suite, Anda harus membuatnya.)

H_hgylo4zxOllHaAbPKJ7VyqCKPDUnDhkr-BsBIFBsrB6TYSisg6LX-uqmMhh4sXUy_hoa2Qv87C2nFmkg-QAcCiZZp0qtpf6VPaNEEfP_iqt29KVLD-gklBWugQVeOWsFnJmNjHDw

dcCPqfBIwNO4R-0fNQLUC4aYXOOZhKhjUnakFLZJGeziw2ikOxGjGkCHDwN5x5kCbPFB8fiOzZnX-GfuzQ8Ox-UU15BwHirkVPR_0RJwl0oXrhqZmMIvZMa_uwHugBJIdx5-bZ6Z8Q

jgLzVCxk93d6E2bbonzATKA4jFZReoQ-fORxZZLEi5C3D-ubnv6nL-eP-iyh7qAsWyq_nyzzuEoPFD1wFOFZOe4FWhPBJjUDncnTxTImT3Ts9TM54f4nPpsAp52O0y3Cb19IceAEgQ

Ingat project ID, nama unik di semua project Google Cloud (maaf, nama di atas telah digunakan dan tidak akan berfungsi untuk Anda!) Project ID tersebut selanjutnya akan dirujuk di codelab ini sebagai PROJECT_ID.

  1. Selanjutnya, Anda harus mengaktifkan penagihan di Cloud Console untuk menggunakan resource Google Cloud.

Menjalankan operasi dalam codelab ini seharusnya tidak memerlukan banyak biaya, bahkan mungkin tidak sama sekali. Pastikan untuk mengikuti petunjuk yang ada di bagian "Membersihkan" yang memberi tahu Anda cara menonaktifkan resource sehingga tidak menimbulkan penagihan di luar tutorial ini. Pengguna baru Google Cloud memenuhi syarat untuk mengikuti program Uji Coba Gratis senilai $300 USD.

Mulai Cloud Shell

Meskipun Google Cloud dapat dioperasikan dari jarak jauh menggunakan laptop Anda, dalam codelab ini, Anda akan menggunakan Google Cloud Shell, lingkungan command line yang berjalan di Cloud.

Dari GCP Console, klik ikon Cloud Shell di toolbar kanan atas:

STgwiN06Y0s_gL7i9bTed8duc9tWOIaFw0z_4QOjc-jeOmuH2TBK8l4udei56CKPLoM_i1yEF6pn5Ga88eniJQoEh8cAiTH79gWUHJdKOw0oiBZfBpOdcEOl6p29i4mvPe_A6UMJBQ

Hanya perlu waktu beberapa saat untuk penyediaan dan terhubung ke lingkungan. Jika sudah selesai, Anda akan melihat tampilan seperti ini:

r6WRHJDzL-GdB5VDxMWa67_cQxRR_x_xCG5xdt9Nilfuwe9fTGAwM9XSZbNPWvDSFtrZ7DDecKqR5_pIq2IJJ9puAMkC3Kt4JbN9jfMX3gAwTNHNqFmqOJ-3iIX5HSePO4dNVZUkNA

Mesin virtual ini berisi semua alat pengembangan yang Anda perlukan. Layanan ini menawarkan direktori beranda tetap sebesar 5 GB dan beroperasi di Google Cloud, sehingga sangat meningkatkan performa dan autentikasi jaringan. Semua pekerjaan Anda di lab ini dapat dilakukan hanya dengan browser.

3. Ringkasan Alur Kerja

Dasar-dasar

Alur kerja terdiri dari serangkaian langkah yang dijelaskan menggunakan sintaksis berbasis YAML Alur Kerja. Ini adalah definisi alur kerja. Untuk penjelasan mendetail tentang sintaksis YAML Alur Kerja, lihat halaman Referensi sintaksis.

Saat dibuat, alur kerja akan di-deploy, sehingga alur kerja siap untuk dieksekusi. Eksekusi adalah satu eksekusi logika yang terkandung dalam definisi alur kerja. Semua eksekusi alur kerja bersifat independen dan produk mendukung banyak eksekusi serentak.

Mengaktifkan layanan

Dalam codelab ini, Anda akan menghubungkan Cloud Functions, layanan Cloud Run dengan Alur Kerja. Anda juga akan menggunakan Cloud Build dan Cloud Storage selama mem-build layanan.

Aktifkan semua layanan yang diperlukan:

gcloud services enable \
  cloudfunctions.googleapis.com \
  run.googleapis.com \
  workflows.googleapis.com \
  cloudbuild.googleapis.com \
  storage.googleapis.com

Pada langkah berikutnya, Anda akan menghubungkan dua Cloud Function dalam alur kerja.

4. Men-deploy Cloud Function pertama

Fungsi pertama adalah generator angka acak di Python.

Buat dan buka direktori untuk kode fungsi:

mkdir ~/randomgen
cd ~/randomgen

Buat file main.py di direktori dengan konten berikut:

import random, json
from flask import jsonify

def randomgen(request):
    randomNum = random.randint(1,100)
    output = {"random":randomNum}
    return jsonify(output)

Saat menerima permintaan HTTP, fungsi ini menghasilkan angka acak antara 1 dan 100 dan ditampilkan dalam format JSON kembali ke pemanggil.

Fungsi ini mengandalkan Flask untuk pemrosesan HTTP dan kita perlu menambahkannya sebagai dependensi. Dependensi pada Python dikelola dengan pip dan dinyatakan dalam file metadata bernama requirements.txt.

Buat file requirements.txt di direktori yang sama dengan konten berikut:

flask>=1.0.2

Deploy fungsi dengan pemicu HTTP dan dengan permintaan yang tidak diautentikasi yang diizinkan dengan perintah ini:

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

Setelah fungsi di-deploy, Anda dapat melihat URL fungsi di bagian properti url yang ditampilkan di konsol atau ditampilkan dengan perintah gcloud functions describe.

Anda juga dapat membuka URL fungsi tersebut dengan perintah curl berikut:

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

Fungsi siap untuk alur kerja.

5. Men-deploy Cloud Function kedua

Fungsi kedua adalah pengganda. Fungsi ini mengalikan input yang diterima dengan 2.

Buat dan buka direktori untuk kode fungsi:

mkdir ~/multiply
cd ~/multiply

Buat file main.py di direktori dengan konten berikut:

import random, json
from flask import jsonify

def multiply(request):
    request_json = request.get_json()
    output = {"multiplied":2*request_json['input']}
    return jsonify(output)

Saat menerima permintaan HTTP, fungsi ini mengekstrak input dari isi JSON, mengalikannya dengan 2, dan menampilkannya dalam format JSON kembali ke pemanggil.

Buat file requirements.txt yang sama di direktori yang sama dengan konten berikut:

flask>=1.0.2

Deploy fungsi dengan pemicu HTTP dan dengan permintaan yang tidak diautentikasi yang diizinkan dengan perintah ini:

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

Setelah fungsi di-deploy, Anda juga dapat mengunjungi URL fungsi tersebut dengan perintah curl berikut:

curl $(gcloud functions describe multiply --format='value(url)') \
-X POST \
-H "content-type: application/json" \
-d '{"input": 5}'

Fungsi siap untuk alur kerja.

6. Menghubungkan dua Cloud Functions

Dalam alur kerja pertama, hubungkan kedua fungsi tersebut.

Buat file workflow.yaml dengan konten berikut.

- 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}

Dalam alur kerja ini, Anda mendapatkan angka acak dari fungsi pertama dan meneruskannya ke fungsi kedua. Hasilnya adalah angka acak yang dikalikan.

Deploy alur kerja pertama:

gcloud workflows deploy workflow --source=workflow.yaml

Jalankan alur kerja pertama:

gcloud workflows execute workflow

Setelah alur kerja dieksekusi, Anda dapat melihat hasilnya dengan meneruskan ID eksekusi yang diberikan pada langkah sebelumnya:

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

Output-nya akan menyertakan result dan state:

result: '{"body":{"multiplied":108},"code":200 ... } 

...
state: SUCCEEDED

7. Menghubungkan API HTTP eksternal

Selanjutnya, Anda akan menghubungkan math.js sebagai layanan eksternal dalam alur kerja.

Di math.js, Anda dapat mengevaluasi ekspresi matematika seperti ini:

curl https://api.mathjs.org/v4/?'expr=log(56)'

Kali ini, Anda akan menggunakan Cloud Console untuk memperbarui alur kerja. Temukan Workflows di Konsol Google Cloud:

7608a7991b33bbb0.png

Temukan alur kerja Anda, lalu klik tab Definition:

f3c8c4d3ffa49b1b.png

Edit definisi alur kerja dan sertakan panggilan ke math.js.

- 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}

Alur kerja kini memasukkan output fungsi perkalian ke dalam panggilan fungsi log di math.js.

UI akan memandu Anda untuk mengedit dan men-deploy alur kerja. Setelah di-deploy, klik Execute untuk menjalankan alur kerja. Anda akan melihat detail eksekusi:

b40c76ee43a1ce65.png

Perhatikan kode status 200 dan body dengan output fungsi log.

Anda baru saja mengintegrasikan layanan eksternal ke dalam alur kerja kita, keren banget!

8. Men-deploy layanan Cloud Run

Di bagian terakhir, selesaikan alur kerja dengan panggilan ke layanan Cloud Run pribadi. Artinya, alur kerja harus diautentikasi untuk memanggil layanan Cloud Run.

Layanan Cloud Run menampilkan math.floor dari nomor yang diteruskan.

Buat dan buka direktori untuk kode layanan:

mkdir ~/floor
cd ~/floor

Buat file app.py di direktori dengan konten berikut:

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 men-deploy container, jadi Anda memerlukan Dockerfile dan container Anda harus terikat ke variabel env 0.0.0.0 dan PORT, sehingga kode di atas.

Saat menerima permintaan HTTP, fungsi ini mengekstrak input dari isi JSON, memanggil math.floor, dan menampilkan hasilnya kembali ke pemanggil.

Di direktori yang sama, buat Dockerfile berikut:

# 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

Buat container:

export SERVICE_NAME=floor
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/${SERVICE_NAME}

Setelah container di-build, deploy ke Cloud Run. Perhatikan flag no-allow-unauthenticated. Hal ini memastikan layanan hanya menerima panggilan yang diautentikasi:

gcloud run deploy ${SERVICE_NAME} \
  --image gcr.io/${GOOGLE_CLOUD_PROJECT}/${SERVICE_NAME} \
  --platform managed \
  --no-allow-unauthenticated

Setelah di-deploy, layanan siap untuk alur kerja.

9. Menghubungkan layanan Cloud Run

Sebelum dapat mengonfigurasi Workflows untuk memanggil layanan Cloud Run pribadi, Anda harus membuat akun layanan untuk digunakan Workflows:

export SERVICE_ACCOUNT=workflows-sa
gcloud iam service-accounts create ${SERVICE_ACCOUNT}

Berikan peran run.invoker ke akun layanan. Tindakan ini akan memungkinkan akun layanan memanggil layanan Cloud Run yang diautentikasi:

gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \
    --member "serviceAccount:${SERVICE_ACCOUNT}@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \
    --role "roles/run.invoker"

Perbarui definisi alur kerja di workflow.yaml untuk menyertakan layanan Cloud Run. Perhatikan bahwa Anda juga menyertakan kolom auth untuk memastikan Workflows meneruskan token autentikasi dalam panggilannya ke layanan Cloud Run:

- 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}

Perbarui alur kerja. Kali ini meneruskan akun layanan:

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

Menjalankan alur kerja:

gcloud workflows execute workflow

Dalam beberapa detik, Anda dapat melihat eksekusi alur kerja untuk melihat hasilnya:

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

Output-nya akan menyertakan bilangan bulat result dan state:

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

...
state: SUCCEEDED

10. Selamat!

Selamat, Anda telah menyelesaikan codelab.

Yang telah kita bahas

  • Dasar-Dasar Alur Kerja.
  • Cara menghubungkan Cloud Functions publik dengan Workflow.
  • Cara menghubungkan layanan Cloud Run pribadi dengan Workflows.
  • Cara menghubungkan API HTTP eksternal dengan Workflows.