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

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. การตั้งค่าและข้อกำหนด

การตั้งค่าโปรเจ็กต์ Cloud

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • ชื่อโปรเจ็กต์คือชื่อที่แสดงสำหรับผู้เข้าร่วมโปรเจ็กต์นี้ ซึ่งเป็นสตริงอักขระที่ Google APIs ไม่ได้ใช้ โดยคุณจะอัปเดตได้ทุกเมื่อ
  • รหัสโปรเจ็กต์จะไม่ซ้ำกันในโปรเจ็กต์ Google Cloud ทั้งหมดและเปลี่ยนแปลงไม่ได้ (เปลี่ยนไม่ได้หลังจากตั้งค่าแล้ว) Cloud Console จะสร้างสตริงที่ไม่ซ้ำกันโดยอัตโนมัติ ซึ่งโดยปกติแล้วคุณไม่จำเป็นต้องสนใจว่าสตริงนั้นคืออะไร ใน Codelab ส่วนใหญ่ คุณจะต้องอ้างอิงรหัสโปรเจ็กต์ (โดยปกติจะระบุเป็น PROJECT_ID) หากไม่ชอบรหัสที่สร้างขึ้น คุณก็สร้างรหัสแบบสุ่มอีกรหัสหนึ่งได้ หรือคุณจะลองใช้ชื่อของคุณเองเพื่อดูว่าพร้อมใช้งานหรือไม่ก็ได้ คุณจะเปลี่ยนแปลงรหัสนี้หลังจากขั้นตอนนี้ไม่ได้ และรหัสจะยังคงอยู่ตลอดระยะเวลาของโปรเจ็กต์
  • โปรดทราบว่ายังมีค่าที่ 3 ซึ่งคือหมายเลขโปรเจ็กต์ที่ API บางตัวใช้ ดูข้อมูลเพิ่มเติมเกี่ยวกับค่าทั้ง 3 นี้ได้ในเอกสารประกอบ
  1. จากนั้นคุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร/API ของ Cloud การทำตาม Codelab นี้ไม่ควรมีค่าใช้จ่ายมากนัก หรืออาจไม่มีเลย หากต้องการปิดทรัพยากรเพื่อไม่ให้มีการเรียกเก็บเงินนอกเหนือจากบทแนะนำนี้ คุณสามารถลบทรัพยากรที่สร้างขึ้นหรือลบทั้งโปรเจ็กต์ได้ ผู้ใช้ 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 สำหรับแบ็กเอนด์ บริการเมนูเป็นทรัพยากร Dependency ของรันไทม์สำหรับงาน 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

หลังจากเผยแพร่แล้ว ให้ไปที่ Artifact Registry แล้วตรวจสอบรูปภาพที่เผยแพร่

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.

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

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

b12c8e312de3b66.png

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

724c2919d05349c8.png

(ไม่บังคับ) หากต้องการเปลี่ยนตัวแปร Failed Item Age หรือ Menu Service 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 Job โดยเรียกใช้คำสั่งต่อไปนี้

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 Jobs

มอบบทบาท 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 Job

  • 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 Job โดยคลิกปุ่ม "EXECUTE"

229c22288882b5c3.png

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

ไปที่ส่วน Cloud Run JOBS เปิดแท็บLOGS แล้วตรวจสอบว่าระบบได้ลบรายการเมนูแล้ว

50829ae27b135b2d.png

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

d94fb9e444b1c1b8.png

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

curl ${MENU_SERVICE_URL}/menu | jq

เอาต์พุต:

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

7. ยินดีด้วย

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

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

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

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

ดู Codelab อื่นๆ ของ Cymbal Eats

ล้างข้อมูล

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

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

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