การทริกเกอร์งาน Cloud Run ด้วย Cloud Scheduler

การทริกเกอร์งาน Cloud Run ด้วย Cloud Scheduler

เกี่ยวกับ Codelab นี้

subjectอัปเดตล่าสุดเมื่อ ม.ค. 24, 2023
account_circleเขียนโดย Andrey Shakirov

1 ภาพรวม

ในบทแนะนำนี้ คุณจะได้สร้างงาน Cloud Run และตั้งค่างาน Cloud Scheduler คุณจะติดตั้งใช้งานบริการเมนูของ Cymbal Eats โดยใช้สคริปต์การตั้งค่า คุณจะต้องสร้างงาน Cloud Run ที่เรียก API ไปยังบริการเมนูของ Cymbal Eats คุณจะเรียกใช้งานโดยใช้ Google Cloud CLI และตั้งเวลาสำหรับงาน คุณจะยืนยันการดำเนินการได้โดยการตรวจสอบบันทึกและการเรียก API ไปยังบริการเมนูเพื่อยืนยันว่าระบบได้ลบรายการเมนูแล้ว

งาน Cloud Run คืออะไร

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

งานบริการทำความสะอาด

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

d74200f0bd14d350.png

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

ในบทแนะนำนี้ คุณจะได้เรียนรู้วิธีดำเนินการต่อไปนี้

  • สร้างงาน Cloud Run
  • เรียกใช้งาน Cloud Run
  • สร้างงาน Cloud Scheduler
  • ยืนยันการดําเนินงานของงาน

ข้อกำหนดเบื้องต้น

  • กิจกรรมนี้ถือว่าคุณคุ้นเคยกับ Cloud Console และสภาพแวดล้อมเชลล์
  • ประสบการณ์การใช้งาน Cloud Run และ Cloud Scheduler มาก่อนจะเป็นประโยชน์ แต่ไม่จำเป็นต้องมี

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

การตั้งค่าโปรเจ็กต์ที่อยู่ในระบบคลาวด์

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • ชื่อโปรเจ็กต์คือชื่อที่แสดงสำหรับผู้เข้าร่วมโปรเจ็กต์นี้ ซึ่งเป็นสตริงอักขระที่ Google APIs ไม่ได้ใช้ โดยคุณจะอัปเดตได้ทุกเมื่อ
  • รหัสโปรเจ็กต์จะต้องไม่ซ้ำกันสำหรับโปรเจ็กต์ Google Cloud ทั้งหมดและจะเปลี่ยนแปลงไม่ได้ (เปลี่ยนแปลงไม่ได้หลังจากตั้งค่าแล้ว) คอนโซล Cloud จะสร้างสตริงที่ไม่ซ้ำกันโดยอัตโนมัติ ซึ่งปกติแล้วคุณไม่จำเป็นต้องสนใจว่าสตริงนั้นจะเป็นอะไร ในโค้ดแล็บส่วนใหญ่ คุณจะต้องอ้างอิงรหัสโปรเจ็กต์ (โดยปกติจะระบุเป็น PROJECT_ID) หากไม่ชอบรหัสที่สร้างขึ้น คุณก็สร้างรหัสอื่นแบบสุ่มได้ หรือจะลองใช้อุปกรณ์ของคุณเองเพื่อดูว่าฟีเจอร์นี้พร้อมใช้งานหรือไม่ก็ได้ คุณจะเปลี่ยนแปลงชื่อหลังจากขั้นตอนนี้ไม่ได้ และชื่อดังกล่าวจะคงอยู่ตลอดระยะเวลาของโปรเจ็กต์
  • โปรดทราบว่ามีค่าที่ 3 ซึ่งเป็นหมายเลขโปรเจ็กต์ที่ API บางรายการใช้ ดูข้อมูลเพิ่มเติมเกี่ยวกับค่าทั้ง 3 รายการนี้ได้ในเอกสารประกอบ
  1. ถัดไป คุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร/API ของ Cloud การทำตามโค้ดแล็บนี้ไม่น่าจะเสียค่าใช้จ่ายมากนัก หากต้องการปิดใช้ทรัพยากรเพื่อไม่ให้มีการเรียกเก็บเงินหลังจากบทแนะนำนี้ คุณสามารถลบทรัพยากรที่สร้างไว้หรือลบทั้งโปรเจ็กต์ได้ ผู้ใช้ใหม่ของ Google Cloud มีสิทธิ์เข้าร่วมโปรแกรมช่วงทดลองใช้ฟรีมูลค่า$300 USD

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

เปิดใช้งาน Cloud Shell โดยคลิกไอคอนทางด้านขวาของแถบค้นหา

eb0157a992f16fa3.png

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

git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git && cd cymbal-eats/menu-service

ติดตั้งใช้งานบริการเมนูโดยใช้สคริปต์การตั้งค่าใน Cloud Run บริการเมนูเป็น Microservice ที่ใช้ Java ซึ่งสร้างขึ้นด้วยเฟรมเวิร์ก Quarkus โดยใช้ฐานข้อมูล Cloud SQL Postgres เป็นแบ็กเอนด์ บริการ Menu เป็นทรัพยากรรันไทม์สำหรับงาน Cloud Run ที่คุณกำลังจะสร้างในขั้นตอนต่อไปนี้

./setup.sh

การทำให้ใช้งานได้จะใช้เวลาประมาณ 10 นาทีในการสร้างคอมโพเนนต์ที่จำเป็นทั้งหมด

ดำเนินการต่อในขั้นตอนถัดไปหลังจากเรียกใช้คำสั่งข้างต้น

3 สํารวจโค้ดงาน Cloud Run

เปิดแท็บใหม่ใน Cloud Shell โดยคลิกไอคอนเครื่องหมายบวก

45f480cd1b9a995.png

ไปที่ไดเรกทอรีที่มีบริการล้างข้อมูลและตรวจสอบไฟล์ที่ประกอบกันเป็นงาน

cd ~/cymbal-eats/cleanup-service

cleanup-service ในไดเรกทอรีนี้มี Dockerfile ที่กำหนดอิมเมจคอนเทนเนอร์สำหรับงานบริการล้างข้อมูลซึ่งมีไลบรารีที่ต้องพึ่งพา(httpie, jq)

Dockerfile

FROM ubuntu:latest 
RUN apt
-get update && apt-get install -y httpie jq && apt-get clean
COPY script
.sh /
RUN chmod
+x /script.sh
CMD
["/script.sh"]
ENTRYPOINT
["/bin/bash"]

สคริปต์การล้างข้อมูลจริงที่แสดงด้านล่างมีคำสั่งในการรับรายการเมนูที่มีสถานะ "ไม่สําเร็จ" และลบรายการเหล่านั้นโดยการเรียก API ไปยังบริการเมนู

script.sh

echo "FAILED_ITEM_AGE=$FAILED_ITEM_AGE"
echo
"MENU_SERVICE_URL=$MENU_SERVICE_URL"
# Failed items older than FAILED_ITEM_AGE in minutes
for id in $(http GET $MENU_SERVICE_URL/menu/failed | jq '[.[] | select(.updateDateTime < ((now - 60 * (env.FAILED_ITEM_AGE | tonumber) )| strftime("%Y-%m-%dT%H:%M:%S.%f")))]'| jq '.[].id'); do
  echo
"Deleting Menu Item : $MENU_SERVICE_URL/menu/$id"
  http GET $MENU_SERVICE_URL
/menu/$id
  http DELETE $MENU_SERVICE_URL
/menu/$id
done

# Processing items older than FAILED_ITEM_AGE in minutes
for id in $(http GET $MENU_SERVICE_URL/menu/processing | jq '[.[] | select(.updateDateTime < ((now - 60 * (env.FAILED_ITEM_AGE | tonumber))| strftime("%Y-%m-%dT%H:%M:%S.%f")))]'| jq '.[].id'); do
  echo
"Deleting Menu Item : $MENU_SERVICE_URL/menu/$id"
  http GET $MENU_SERVICE_URL
/menu/$id
  http DELETE $MENU_SERVICE_URL
/menu/$id
done

โปรดสังเกตสิ่งต่อไปนี้เกี่ยวกับสคริปต์

  • ระบบจะตั้งค่าตัวแปรสภาพแวดล้อม FAILED_ITEM_AGE และ MENU_SERVICE_URL ในระหว่างการติดตั้งใช้งานและส่งผ่านโดยงาน Cloud Run
  • FAILED_ITEM_AGE - จำนวนนาทีก่อนที่ระบบจะลบรายการที่ดำเนินการไม่สำเร็จ
  • MENU_SERVICE_URL - URL บริการเมนู Cymbal Eats

4 สร้างงาน Cloud Run

ถัดไป คุณจะต้องสร้างอิมเมจคอนเทนเนอร์และเผยแพร่ไปยัง Artifact Registry

ระบบจะใช้อิมเมจคอนเทนเนอร์นี้เพื่อสร้างงาน Cloud Run

เปิดใช้ API ของบริการ

gcloud services enable \
    run
.googleapis.com \
    artifactregistry
.googleapis.com \
    cloudscheduler
.googleapis.com \
   
--quiet

ตั้งค่าตัวแปรสภาพแวดล้อม

export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
export PROJECT_NAME=$(gcloud projects describe $PROJECT_ID --format='value(name)')
export REGION=us-east1
export MENU_SERVICE_NAME=menu-service

สร้างที่เก็บ Artifact Registry ใหม่เพื่อจัดเก็บอิมเมจ Docker สำหรับงานล้างข้อมูล

gcloud artifacts repositories create cymbal-eats --repository-format=docker --location=$REGION

สร้างอิมเมจคอนเทนเนอร์โดยใช้ Cloud Build และพุชไปยัง Artifact Registry ด้วยคำสั่งเดียว

gcloud builds submit -t $REGION-docker.pkg.dev/$PROJECT_NAME/cymbal-eats/cleanup-service:latest

ตัวอย่างเอาต์พุต

DURATION: 35S
SOURCE: gs://cymbal-eats-14906-569_cloudbuild/source/1657126400.933586-dc3e91ec85934a55bb6d2f7012611365.tgz
IMAGES: us-east1-docker.pkg.dev/cymbal-eats-14906-569/cymbal-eats/cleanup-service (+1 more)
STATUS: SUCCESS

หลังจากเผยแพร่แล้ว ให้ไปที่ที่เก็บอาร์ติแฟกต์และตรวจสอบรูปภาพที่เผยแพร่

fb95ae38baa7c543.png

เปลี่ยนกลับไปที่แท็บ Cloud Shell ที่ 2 เรียกใช้คําสั่งต่อไปนี้เพื่ออธิบายบริการเมนูและบันทึก URL ลงในตัวแปรสภาพแวดล้อม ระบบจะใช้ตัวแปรสภาพแวดล้อมนี้เพื่อกําหนดค่างาน Cloud Run

MENU_SERVICE_URL=$(gcloud run services describe $MENU_SERVICE_NAME \
 
--region=$REGION \
 
--format=json | jq \
 
--raw-output ".status.url")

สร้างงาน Cloud Run เพื่อล้างรายการเมนูที่ดำเนินการไม่สำเร็จซึ่งมีอายุมากกว่า 1 นาที [กำหนดโดย FAILED_ITEM_AGE]

gcloud beta run jobs create cleanup-service \
 
--image=$REGION-docker.pkg.dev/$PROJECT_NAME/cymbal-eats/cleanup-service:latest \
 
--set-env-vars MENU_SERVICE_URL=$MENU_SERVICE_URL \
 
--set-env-vars FAILED_ITEM_AGE=1 \
 
--region $REGION

ตัวอย่างเอาต์พุต

Creating Cloud Run job [cleanup-service] in project [cymbal-eats] region [us-east1]
OK Creating job... Done.
Done.
Job [cleanup-service] has successfully been created.

ไปที่ส่วน JOBS ของ Cloud Run ในคอนโซล และตรวจสอบงานที่สร้างขึ้น

คลิกงานและสำรวจแท็บที่มี ได้แก่ ประวัติ บันทึก การกำหนดค่า และ YAML

b12c8e312de3b66.png

ตรวจสอบว่าได้ตั้งค่าตัวแปรสภาพแวดล้อมแล้วโดยดูที่ส่วนการกําหนดค่าของงานในคอนโซล

724c2919d05349c8.png

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

gcloud beta run jobs update cleanup-service \
 
--image=$REGION-docker.pkg.dev/$PROJECT_NAME/cymbal-eats/cleanup-service:latest \
 
--set-env-vars MENU_SERVICE_URL=$MENU_SERVICE_URL \
 
--set-env-vars FAILED_ITEM_AGE=1 \
 
--region $REGION

หากต้องการตรวจสอบงาน ให้เรียกใช้งาน Cloud Run โดยเรียกใช้คําสั่งต่อไปนี้

gcloud beta run jobs execute cleanup-service --region=$REGION

ตัวอย่างเอาต์พุต

OK Creating execution... Done.                                   
  OK Provisioning resources...
Done.
Execution [cleanup-service-rlxs4] has successfully started running.

View details about this execution by running:
gcloud beta run jobs executions describe cleanup-service-rlxs4
 

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

518cb00036a2561f.png

5 ตั้งค่ากำหนดเวลาสำหรับงาน Cloud Run

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

แนวทางปฏิบัติแนะนำด้านความปลอดภัยอย่างหนึ่งเมื่อทำงานกับงาน Cloud Scheduler คือให้เรียกใช้แต่ละงานด้วยข้อมูลเข้าสู่ระบบแยกกัน ในขั้นตอนนี้ ให้สร้างบัญชีบริการเพื่อใช้กับงานกำหนดเวลาการล้างข้อมูล

export SCHEDULER_SERVICE_ACCOUNT=cleanup-scheduler-job-sa

gcloud iam service
-accounts create ${SCHEDULER_SERVICE_ACCOUNT}

งาน Cloud Scheduler จะต้องมีสิทธิ์ในการเรียกใช้งาน Cloud Run

มอบบทบาท Cloud Run Invoker ให้กับบัญชีบริการที่ใช้ในงาน Cloud Scheduler โดยทำดังนี้

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

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

Cloud Scheduler รองรับเป้าหมายหลายประเภท

  • HTTP
  • Pub/Sub
  • App Engine HTTP

คุณจะต้องสร้างงานกำหนดเวลาโดยใช้ประเภทเป้าหมาย HTTP

คุณจะตั้งเวลาให้ทำงานทุกๆ 5 นาทีเพื่อวัตถุประสงค์ในการสาธิต

gcloud scheduler jobs create http cleanup-schedule \
   
--location $REGION \
   
--schedule="*/5 * * * *" \
   
--uri="https://$REGION-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/$PROJECT_ID/jobs/cleanup-service:run" \
   
--http-method POST \
   
--oauth-service-account-email ${SCHEDULER_SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com

ตรวจสอบพารามิเตอร์ uri ที่ใช้ในการเรียกใช้งาน Cloud Run

  • REGION และ PROJECT_ID - ภูมิภาคและรหัสโปรเจ็กต์ Cloud Run ที่ติดตั้งใช้งานงานบริการล้างข้อมูล
  • cleanup-service - ชื่อของงาน Cloud Run

ไปที่ Cloud Scheduler ในคอนโซลเพื่อตรวจสอบงานที่กําหนดเวลาไว้ซึ่งสร้างขึ้น

3bc9120df7fc6ed.png

ตรวจสอบตัวเลือกที่มีอยู่ในเมนูการดําเนินการ

7945908025dd2f2b.png

6 ทดสอบงาน Cloud Run

ใช้ปลายทางบริการเมนูเพื่อตรวจสอบรายการเมนูที่มีอยู่และสถานะ

curl ${MENU_SERVICE_URL}/menu | jq

เอาต์พุต:

คุณจะเห็นรายการเมนู 3 รายการในสถานะ Ready

เปลี่ยนสถานะของรายการเมนู #1 เป็น Failed

curl -X PUT "${MENU_SERVICE_URL}/menu/1" \
 
-H 'Content-Type: application/json' \
 
-d '{"status": "Failed"}' | jq

รอ 1 นาที รายการในเมนูต้องมีอายุ 1 นาทีตามที่พารามิเตอร์ FAILED_ITEM_AGE กำหนดไว้จึงจะลบได้

คุณสามารถรอการเรียกใช้ตามกำหนดการครั้งถัดไปหรือบังคับให้งานทำงานจากคอนโซลก็ได้

การเรียกใช้งานทำได้หลายวิธี ไม่ว่าจะเป็นผ่าน UI หรือจากบรรทัดคำสั่ง

ในตัวอย่างนี้ ให้เรียกใช้คําสั่งใน Cloud Shell(ตัวเลือก #3) เพื่อทริกเกอร์งาน

  1. จาก Cloud Scheduler โดยเลือก "บังคับให้งานทํางาน" จากเมนูการดําเนินการ

6c8cbeae6165ba4a.png

  1. จากงาน Cloud Run โดยคลิกปุ่ม "ดำเนินการ"

229c22288882b5c3.png

  1. จาก Cloud Shell โดยเรียกใช้คำสั่งต่อไปนี้
gcloud beta run jobs execute cleanup-service --region=$REGION

ไปที่ส่วน "งาน" ของ Cloud Run เปิดแท็บบันทึก และตรวจสอบว่ารายการเมนูถูกลบแล้ว

50829ae27b135b2d.png

กรองบันทึกสำหรับคีย์เวิร์ด "deleting" เพื่อค้นหาบันทึก

d94fb9e444b1c1b8.png

ใช้ปลายทางบริการเมนูเพื่อตรวจสอบรายการเมนูที่มีอยู่ผ่านปลายทาง REST

curl ${MENU_SERVICE_URL}/menu | jq

เอาต์พุต:

คุณจะเห็นรายการเมนู 2 รายการในสถานะ Ready

7 ยินดีด้วย

ยินดีด้วย คุณทำ Codelab เสร็จแล้ว

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

  • วิธีสร้างงาน Cloud Run
  • วิธีเรียกใช้งาน Cloud Run
  • วิธีสร้างงาน Cloud Scheduler
  • วิธียืนยันการดําเนินงานของงาน

ขั้นตอนต่อไปที่ทำได้

สำรวจ Codelab อื่นๆ ของ Cymbal Eats

ล้างข้อมูล

โปรดลบโปรเจ็กต์ที่มีทรัพยากรดังกล่าวหรือเก็บโปรเจ็กต์ไว้และลบทรัพยากรแต่ละรายการเพื่อเลี่ยงไม่ให้เกิดการเรียกเก็บเงินกับบัญชี Google Cloud สำหรับทรัพยากรที่ใช้ในบทแนะนำนี้

การลบโปรเจ็กต์

วิธีที่ง่ายที่สุดในการหยุดการเรียกเก็บเงินคือการลบโปรเจ็กต์ที่คุณสร้างสำหรับบทแนะนำ