1. บทนำ

คุณใช้ Workflows เพื่อสร้างเวิร์กโฟลว์แบบไร้เซิร์ฟเวอร์ที่ลิงก์ชุดงานแบบไร้เซิร์ฟเวอร์เข้าด้วยกันตามลำดับที่คุณกำหนดได้ คุณสามารถผสานประสิทธิภาพของ API ของ Google Cloud, ผลิตภัณฑ์แบบ Serverless เช่น Cloud Functions และ Cloud Run รวมถึงการเรียกใช้ API ภายนอกเพื่อสร้างแอปพลิเคชันแบบ Serverless ที่ยืดหยุ่น
เวิร์กโฟลว์ไม่จำเป็นต้องมีการจัดการโครงสร้างพื้นฐานและปรับขนาดได้อย่างราบรื่นตามความต้องการ รวมถึงลดขนาดลงเป็น 0 รูปแบบการกำหนดราคาแบบจ่ายตามการใช้งานช่วยให้คุณจ่ายเฉพาะเวลาในการดำเนินการเท่านั้น
ในโค้ดแล็บนี้ คุณจะได้เรียนรู้วิธีเชื่อมต่อบริการต่างๆ ของ Google Cloud และ HTTP API ภายนอกกับเวิร์กโฟลว์ กล่าวโดยละเอียดคือ คุณจะเชื่อมต่อบริการ Cloud Functions แบบสาธารณะ 2 รายการ บริการ Cloud Run แบบส่วนตัว 1 รายการ และ HTTP API แบบสาธารณะภายนอกเข้ากับเวิร์กโฟลว์
สิ่งที่คุณจะได้เรียนรู้
- ข้อมูลเบื้องต้นเกี่ยวกับเวิร์กโฟลว์
- วิธีเชื่อมต่อ Cloud Functions สาธารณะกับเวิร์กโฟลว์
- วิธีเชื่อมต่อบริการ Cloud Run ส่วนตัวกับเวิร์กโฟลว์
- วิธีเชื่อมต่อ API ของ HTTP ภายนอกกับเวิร์กโฟลว์
2. การตั้งค่าและข้อกำหนด
การตั้งค่าสภาพแวดล้อมแบบเรียนรู้ด้วยตนเอง
- ลงชื่อเข้าใช้ Cloud Console แล้วสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่ซ้ำ (หากยังไม่มีบัญชี Gmail หรือ G Suite คุณต้องสร้างบัญชี)
โปรดจดจำรหัสโปรเจ็กต์ ซึ่งเป็นชื่อที่ไม่ซ้ำกันในโปรเจ็กต์ Google Cloud ทั้งหมด (ชื่อด้านบนมีผู้ใช้แล้วและจะใช้ไม่ได้ ขออภัย) ซึ่งจะเรียกว่า PROJECT_ID ในภายหลังใน Codelab นี้
- จากนั้นคุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร Google Cloud
การทำตาม Codelab นี้ไม่ควรมีค่าใช้จ่ายมากนัก หรืออาจไม่มีเลย โปรดทำตามวิธีการในส่วน "การล้างข้อมูล" ซึ่งจะแนะนำวิธีปิดทรัพยากรเพื่อไม่ให้มีการเรียกเก็บเงินนอกเหนือจากบทแนะนำนี้ ผู้ใช้ Google Cloud รายใหม่มีสิทธิ์เข้าร่วมโปรแกรมช่วงทดลองใช้ฟรีมูลค่า$300 USD
เริ่มต้น Cloud Shell
แม้ว่าคุณจะใช้งาน Google Cloud จากระยะไกลจากแล็ปท็อปได้ แต่ใน Codelab นี้คุณจะใช้ Google Cloud Shell ซึ่งเป็นสภาพแวดล้อมบรรทัดคำสั่งที่ทำงานในระบบคลาวด์
จาก GCP Console ให้คลิกไอคอน Cloud Shell ในแถบเครื่องมือด้านขวาบน
การจัดสรรและเชื่อมต่อกับสภาพแวดล้อมจะใช้เวลาเพียงไม่กี่นาที เมื่อเสร็จแล้ว คุณควรเห็นข้อความคล้ายกับตัวอย่างต่อไปนี้
เครื่องเสมือนนี้มาพร้อมเครื่องมือพัฒนาซอฟต์แวร์ทั้งหมดที่คุณต้องการ โดยมีไดเรกทอรีหลักแบบถาวรขนาด 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 เป็นการขึ้นต่อกัน การจัดการการขึ้นต่อกันใน 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 Console โดยทำดังนี้

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

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

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