ข้อมูลเบื้องต้นเกี่ยวกับการจัดการเป็นกลุ่มแบบ Serverless ด้วยเวิร์กโฟลว์

1. บทนำ

c9b0cc839df0bb8f.png

คุณใช้ Workflows เพื่อสร้างเวิร์กโฟลว์แบบ Serverless ที่ลิงก์ชุดงานแบบ Serverless เข้าด้วยกันตามลำดับที่คุณกำหนดได้ คุณสามารถผสานประสิทธิภาพของ API ของ Google Cloud, ผลิตภัณฑ์แบบ Serverless เช่น Cloud Functions และ Cloud Run รวมถึงการเรียกใช้ API ภายนอกเพื่อสร้างแอปพลิเคชันแบบ Serverless ที่ยืดหยุ่น

เวิร์กโฟลว์ไม่จำเป็นต้องมีการจัดการโครงสร้างพื้นฐานและปรับขนาดได้อย่างราบรื่นตามความต้องการ รวมถึงลดขนาดลงเป็น 0 รูปแบบการกำหนดราคาแบบจ่ายตามการใช้งานช่วยให้คุณจ่ายเฉพาะเวลาในการดำเนินการเท่านั้น

ใน Codelab นี้ คุณจะได้เรียนรู้วิธีเชื่อมต่อบริการต่างๆ ของ Google Cloud และ HTTP API ภายนอกกับเวิร์กโฟลว์ กล่าวโดยละเอียดคือ คุณจะเชื่อมต่อบริการ Cloud Functions แบบสาธารณะ 2 รายการ บริการ Cloud Run แบบส่วนตัว 1 รายการ และ HTTP API สาธารณะภายนอกเข้ากับเวิร์กโฟลว์

สิ่งที่คุณจะได้เรียนรู้

  • ข้อมูลพื้นฐานของเวิร์กโฟลว์
  • วิธีเชื่อมต่อ Cloud Functions สาธารณะกับเวิร์กโฟลว์
  • วิธีเชื่อมต่อบริการ Cloud Run ส่วนตัวกับเวิร์กโฟลว์
  • วิธีเชื่อมต่อ API ของ HTTP ภายนอกกับเวิร์กโฟลว์

2. การตั้งค่าและข้อกำหนด

การตั้งค่าสภาพแวดล้อมแบบเรียนรู้ด้วยตนเอง

  1. ลงชื่อเข้าใช้ Cloud Console แล้วสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่ซ้ำ (หากยังไม่มีบัญชี Gmail หรือ G Suite คุณต้องสร้างบัญชี)

H_hgylo4zxOllHaAbPKJ7VyqCKPDUnDhkr-BsBIFBsrB6TYSisg6LX-uqmMhh4sXUy_hoa2Qv87C2nFmkg-QAcCiZZp0qtpf6VPaNEEfP_iqt29KVLD-gklBWugQVeOWsFnJmNjHDwdcCPqfBIwNO4R-0fNQLUC4aYXOOZhKhjUnakFLZJGeziw2ikOxGjGkCHDwN5x5kCbPFB8fiOzZnX-GfuzQ8Ox-UU15BwHirkVPR_0RJwl0oXrhqZmMIvZMa_uwHugBJIdx5-bZ6Z8QjgLzVCxk93d6E2bbonzATKA4jFZReoQ-fORxZZLEi5C3D-ubnv6nL-eP-iyh7qAsWyq_nyzzuEoPFD1wFOFZOe4FWhPBJjUDncnTxTImT3Ts9TM54f4nPpsAp52O0y3Cb19IceAEgQ

โปรดจดจำรหัสโปรเจ็กต์ ซึ่งเป็นชื่อที่ไม่ซ้ำกันในโปรเจ็กต์ Google Cloud ทั้งหมด (ชื่อด้านบนมีผู้ใช้แล้วและจะใช้ไม่ได้ ขออภัย) ซึ่งจะเรียกว่า PROJECT_ID ในภายหลังใน Codelab นี้

  1. จากนั้นคุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร Google Cloud

การทำตาม Codelab นี้ไม่ควรมีค่าใช้จ่ายมากนัก หรืออาจไม่มีเลย โปรดทำตามวิธีการในส่วน "การล้างข้อมูล" ซึ่งจะแนะนำวิธีปิดทรัพยากรเพื่อไม่ให้มีการเรียกเก็บเงินนอกเหนือจากบทแนะนำนี้ ผู้ใช้ใหม่ของ Google Cloud มีสิทธิ์เข้าร่วมโปรแกรมช่วงทดลองใช้ฟรีมูลค่า$300USD

เริ่มต้น Cloud Shell

แม้ว่าคุณจะใช้งาน Google Cloud จากระยะไกลในแล็ปท็อปได้ แต่ใน Codelab นี้คุณจะใช้ Google Cloud Shell ซึ่งเป็นสภาพแวดล้อมบรรทัดคำสั่งที่ทำงานในระบบคลาวด์

จาก GCP Console ให้คลิกไอคอน Cloud Shell ในแถบเครื่องมือด้านขวาบน

STgwiN06Y0s_gL7i9bTed8duc9tWOIaFw0z_4QOjc-jeOmuH2TBK8l4udei56CKPLoM_i1yEF6pn5Ga88eniJQoEh8cAiTH79gWUHJdKOw0oiBZfBpOdcEOl6p29i4mvPe_A6UMJBQ

การจัดสรรและเชื่อมต่อกับสภาพแวดล้อมจะใช้เวลาเพียงไม่กี่นาที เมื่อเสร็จแล้ว คุณควรเห็นข้อความคล้ายกับตัวอย่างต่อไปนี้

r6WRHJDzL-GdB5VDxMWa67_cQxRR_x_xCG5xdt9Nilfuwe9fTGAwM9XSZbNPWvDSFtrZ7DDecKqR5_pIq2IJJ9puAMkC3Kt4JbN9jfMX3gAwTNHNqFmqOJ-3iIX5HSePO4dNVZUkNA

เครื่องเสมือนนี้มาพร้อมเครื่องมือพัฒนาซอฟต์แวร์ทั้งหมดที่คุณต้องการ โดยมีไดเรกทอรีหลักแบบถาวรขนาด 5 GB และทำงานบน Google Cloud ซึ่งช่วยเพิ่มประสิทธิภาพเครือข่ายและการตรวจสอบสิทธิ์ได้อย่างมาก คุณสามารถทำงานทั้งหมดในห้องทดลองนี้ได้โดยใช้เพียงเบราว์เซอร์

3. ภาพรวมของเวิร์กโฟลว์

พื้นฐาน

เวิร์กโฟลว์ประกอบด้วยชุดขั้นตอนที่อธิบายโดยใช้ไวยากรณ์ที่ใช้ YAML ของเวิร์กโฟลว์ นี่คือคำจำกัดความของเวิร์กโฟลว์ ดูคำอธิบายโดยละเอียดเกี่ยวกับไวยากรณ์ YAML ของเวิร์กโฟลว์ได้ที่หน้าการอ้างอิงไวยากรณ์

เมื่อสร้างเวิร์กโฟลว์แล้ว ระบบจะนำไปใช้งาน ซึ่งทำให้เวิร์กโฟลว์พร้อมสำหรับการดำเนินการ การดำเนินการคือการเรียกใช้ตรรกะที่อยู่ในคำจำกัดความของเวิร์กโฟลว์เพียงครั้งเดียว การดำเนินการเวิร์กโฟลว์ทั้งหมดเป็นอิสระต่อกัน และผลิตภัณฑ์รองรับการดำเนินการพร้อมกันจำนวนมาก

เปิดใช้บริการ

ใน Codelab นี้ คุณจะได้เชื่อมต่อ Cloud Functions, บริการ Cloud Run กับเวิร์กโฟลว์ นอกจากนี้ คุณยังจะได้ใช้ Cloud Build และ Cloud Storage ในระหว่างการสร้างบริการด้วย

เปิดใช้บริการที่จำเป็นทั้งหมด

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

ในขั้นตอนถัดไป คุณจะเชื่อมต่อ Cloud Functions 2 รายการเข้าด้วยกันในเวิร์กโฟลว์

4. ทําให้ Cloud Function แรกใช้งานได้

ฟังก์ชันแรกคือโปรแกรมสร้างตัวเลขสุ่มใน Python

สร้างและไปยังไดเรกทอรีสำหรับโค้ดฟังก์ชัน

mkdir ~/randomgen
cd ~/randomgen

สร้างไฟล์ main.py ในไดเรกทอรีที่มีเนื้อหาต่อไปนี้

import random, json
from flask import jsonify

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

เมื่อได้รับคำขอ HTTP ฟังก์ชันนี้จะสร้างตัวเลขสุ่มระหว่าง 1 ถึง 100 และส่งกลับในรูปแบบ JSON ไปยังผู้เรียก

ฟังก์ชันนี้ใช้ Flask สำหรับการประมวลผล HTTP และเราต้องเพิ่ม Flask เป็นทรัพยากร Dependency การจัดการการขึ้นต่อกันใน Python จะทำผ่าน pip และแสดงในไฟล์ข้อมูลเมตาที่ชื่อ requirements.txt

สร้างไฟล์ requirements.txt ในไดเรกทอรีเดียวกันโดยมีเนื้อหาต่อไปนี้

flask>=1.0.2

ทำให้ฟังก์ชันใช้งานได้ด้วยทริกเกอร์ HTTP และอนุญาตคำขอที่ไม่ได้รับการตรวจสอบสิทธิ์ด้วยคำสั่งนี้

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

เมื่อติดตั้งใช้งานฟังก์ชันแล้ว คุณจะเห็น URL ของฟังก์ชันภายใต้พร็อพเพอร์ตี้ urlที่แสดงในคอนโซลหรือแสดงด้วยคำสั่ง gcloud functions describe

คุณยังไปที่ URL ของฟังก์ชันนั้นด้วยคำสั่ง curl ต่อไปนี้ได้ด้วย

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

ฟังก์ชันพร้อมใช้งานในเวิร์กโฟลว์แล้ว

5. ทำให้ Cloud Function ที่ 2 ใช้งานได้

ฟังก์ชันที่ 2 คือตัวคูณ โดยจะคูณอินพุตที่ได้รับด้วย 2

สร้างและไปยังไดเรกทอรีสำหรับโค้ดฟังก์ชัน

mkdir ~/multiply
cd ~/multiply

สร้างไฟล์ main.py ในไดเรกทอรีที่มีเนื้อหาต่อไปนี้

import random, json
from flask import jsonify

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

เมื่อได้รับคำขอ HTTP ฟังก์ชันนี้จะดึง input จากเนื้อหา JSON คูณด้วย 2 แล้วส่งคืนในรูปแบบ JSON ไปยังผู้เรียก

สร้างไฟล์ requirements.txt เดียวกันในไดเรกทอรีเดียวกันโดยมีเนื้อหาต่อไปนี้

flask>=1.0.2

ทำให้ฟังก์ชันใช้งานได้ด้วยทริกเกอร์ HTTP และอนุญาตคำขอที่ไม่ได้รับการตรวจสอบสิทธิ์ด้วยคำสั่งนี้

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

เมื่อติดตั้งใช้งานฟังก์ชันแล้ว คุณยังเข้าชม URL ของฟังก์ชันนั้นได้ด้วยcurl คำสั่งต่อไปนี้

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

ฟังก์ชันพร้อมใช้งานในเวิร์กโฟลว์แล้ว

6. เชื่อมต่อ Cloud Functions 2 รายการ

ในเวิร์กโฟลว์แรก ให้เชื่อมต่อฟังก์ชันทั้ง 2 เข้าด้วยกัน

สร้างไฟล์ workflow.yaml ที่มีเนื้อหาต่อไปนี้

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

ในเวิร์กโฟลว์นี้ คุณจะได้รับหมายเลขสุ่มจากฟังก์ชันแรกและส่งไปยังฟังก์ชันที่ 2 ผลลัพธ์คือตัวเลขสุ่มที่คูณแล้ว

ทำให้เวิร์กโฟลว์แรกใช้งานได้

gcloud workflows deploy workflow --source=workflow.yaml

เรียกใช้เวิร์กโฟลว์แรก

gcloud workflows execute workflow

เมื่อเวิร์กโฟลว์ทำงานแล้ว คุณจะดูผลลัพธ์ได้โดยส่งรหัสการดำเนินการที่ได้รับในขั้นตอนก่อนหน้า

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

เอาต์พุตจะมี result และ state ดังนี้

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

...
state: SUCCEEDED

7. เชื่อมต่อ HTTP API ภายนอก

จากนั้นคุณจะเชื่อมต่อ math.js เป็นบริการภายนอกในเวิร์กโฟลว์

ใน math.js คุณสามารถประเมินนิพจน์ทางคณิตศาสตร์ได้ดังนี้

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

คราวนี้คุณจะใช้ Cloud Console เพื่ออัปเดตเวิร์กโฟลว์ ค้นหา Workflows ในคอนโซล Google Cloud โดยทำดังนี้

7608a7991b33bbb0.png

ค้นหาเวิร์กโฟลว์แล้วคลิกแท็บ Definition

f3c8c4d3ffa49b1b.png

แก้ไขคำจำกัดความของเวิร์กโฟลว์และใส่การเรียกใช้ 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}

ตอนนี้เวิร์กโฟลว์จะป้อนเอาต์พุตของฟังก์ชันการคูณลงในการเรียกใช้ฟังก์ชันบันทึกใน math.js

UI จะแนะนำให้คุณแก้ไขและทำให้เวิร์กโฟลว์ใช้งานได้ เมื่อติดตั้งใช้งานแล้ว ให้คลิก Execute เพื่อเรียกใช้เวิร์กโฟลว์ คุณจะเห็นรายละเอียดการดำเนินการดังนี้

b40c76ee43a1ce65.png

สังเกตรหัสสถานะ 200 และ body ที่มีเอาต์พุตของฟังก์ชันบันทึก

คุณเพิ่งผสานรวมบริการภายนอกเข้ากับเวิร์กโฟลว์ของเรา เจ๋งสุดๆ ไปเลย

8. ติดตั้งใช้งานบริการ Cloud Run

ในส่วนสุดท้าย ให้สรุปเวิร์กโฟลว์ด้วยการเรียกใช้บริการ Cloud Run แบบส่วนตัว ซึ่งหมายความว่าต้องมีการตรวจสอบสิทธิ์เวิร์กโฟลว์เพื่อเรียกใช้บริการ Cloud Run

บริการ Cloud Run จะแสดงผล math.floor ของหมายเลขที่ส่ง

สร้างและไปยังไดเรกทอรีสำหรับโค้ดบริการ

mkdir ~/floor
cd ~/floor

สร้างไฟล์ app.py ในไดเรกทอรีที่มีเนื้อหาต่อไปนี้

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 จะทําการติดตั้งใช้งานคอนเทนเนอร์ ดังนั้นคุณจึงต้องมี Dockerfile และคอนเทนเนอร์ต้องเชื่อมโยงกับตัวแปรสภาพแวดล้อม 0.0.0.0 และ PORT จึงเป็นที่มาของโค้ดด้านบน

เมื่อได้รับคำขอ HTTP ฟังก์ชันนี้จะดึง input จากเนื้อหา JSON เรียกใช้ math.floor และส่งผลลัพธ์กลับไปยังผู้เรียกใช้

ในไดเรกทอรีเดียวกัน ให้สร้าง Dockerfile ต่อไปนี้

# 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

สร้างคอนเทนเนอร์โดยใช้คำสั่งต่อไปนี้

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

เมื่อสร้างคอนเทนเนอร์แล้ว ให้ทำให้ใช้งานได้ใน Cloud Run สังเกตno-allow-unauthenticatedธง ซึ่งจะช่วยให้มั่นใจได้ว่าบริการจะยอมรับเฉพาะการเรียกที่ได้รับการตรวจสอบสิทธิ์แล้วเท่านั้น

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

เมื่อติดตั้งใช้งานแล้ว บริการจะพร้อมสำหรับเวิร์กโฟลว์

9. เชื่อมต่อบริการ Cloud Run

ก่อนที่จะกำหนดค่าเวิร์กโฟลว์ให้เรียกใช้บริการ Cloud Run แบบส่วนตัวได้ คุณต้องสร้างบัญชีบริการเพื่อให้เวิร์กโฟลว์ใช้ โดยทำดังนี้

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

มอบบทบาท run.invoker ให้กับบัญชีบริการ ซึ่งจะช่วยให้บัญชีบริการเรียกใช้บริการ Cloud Run ที่ได้รับการตรวจสอบสิทธิ์ได้

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 เพื่อรวมบริการ Cloud Run โปรดสังเกตว่าคุณยังรวมฟิลด์ auth เพื่อให้แน่ใจว่า Workflows จะส่งโทเค็นการตรวจสอบสิทธิ์ในการเรียกใช้บริการ 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}

อัปเดตเวิร์กโฟลว์ การส่งผ่านเวลานี้ในบัญชีบริการ

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

ดำเนินการเวิร์กโฟลว์

gcloud workflows execute workflow

ในอีกไม่กี่วินาที คุณจะดูการดำเนินการเวิร์กโฟลว์เพื่อดูผลลัพธ์ได้

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

เอาต์พุตจะมีจำนวนเต็ม result และ state ดังนี้

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

...
state: SUCCEEDED

10. ยินดีด้วย

ขอแสดงความยินดีที่ทำ Codelab เสร็จ

สิ่งที่เราได้พูดถึง

  • ข้อมูลพื้นฐานของเวิร์กโฟลว์
  • วิธีเชื่อมต่อ Cloud Functions สาธารณะกับเวิร์กโฟลว์
  • วิธีเชื่อมต่อบริการ Cloud Run ส่วนตัวกับเวิร์กโฟลว์
  • วิธีเชื่อมต่อ API ของ HTTP ภายนอกกับเวิร์กโฟลว์