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

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

  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 สำหรับทรัพยากรที่ใช้ในบทแนะนำนี้

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

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