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

1. บทนำ

c9b0cc839df0bb8f.png

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

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

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

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

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

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

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

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

H_hgylo4zxOllHaAbPKJ7VyqCKPDUnDhkr-BsBIFBsrB6TYSisg6LX-uqmMhh4sXUy_hoa2Qv87C2nFmkg-QAcCiZZp0qtpf6VPaNEEfP_iqt29KVLD-gklBWugQVeOWsFnJmNjHDw

dcCPqfBIwNO4R-0fNQLUC4aYXOOZhKhjUnakFLZJGeziw2ikOxGjGkCHDwN5x5kCbPFB8fiOzZnX-GfuzQ8Ox-UU15BwHirkVPR_0RJwl0oXrhqZmMIvZMa_uwHugBJIdx5-bZ6Z8Q

jgLzVCxk93d6E2bbonzATKA4jFZReoQ-fORxZZLEi5C3D-ubnv6nL-eP-iyh7qAsWyq_nyzzuEoPFD1wFOFZOe4FWhPBJjUDncnTxTImT3Ts9TM54f4nPpsAp52O0y3Cb19IceAEgQ

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

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

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

เริ่ม Cloud Shell

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

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

STgwiN06Y0s_gL7i9bTed8duc9tWOIaFw0z_4QOjc-jeOmuH2TBK8l4udei56CKPLoM_i1yEF6pn5Ga88eniJQoEh8cAiTH79gWUHJdKOw0oiBZfBpOdcEOl6p29i4mvPe_A6UMJBQ

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

r6WRHJDzL-GdB5VDxMWa67_cQxRR_x_xCG5xdt9Nilfuwe9fTGAwM9XSZbNPWvDSFtrZ7DDecKqR5_pIq2IJJ9puAMkC3Kt4JbN9jfMX3gAwTNHNqFmqOJ-3iIX5HSePO4dNVZUkNA

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

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

พื้นฐาน

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

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

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

ในโค้ดแล็บนี้ คุณจะเชื่อมต่อ 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 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 Function 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 และคอนเทนเนอร์ต้องเชื่อมโยงกับตัวแปร env 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

คุณต้องสร้างบัญชีบริการสำหรับ Workflows เพื่อใช้ก่อนจึงจะกำหนดค่า Workflows ให้เรียกใช้บริการ 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 

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

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

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

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

10. ยินดีด้วย

ขอแสดงความยินดีที่ทํา Codelab จนเสร็จสมบูรณ์

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

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