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

1. ภาพรวม

ในห้องทดลองนี้ คุณจะสร้างงาน Cloud Run และตั้งค่างาน Cloud Scheduler คุณจะทำให้ Cymbal Eats Menu Service ใช้งานได้โดยใช้สคริปต์การตั้งค่า คุณจะสร้างงาน 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 และสภาพแวดล้อมของ Shell
  • ประสบการณ์การใช้งาน Cloud Run และ Cloud Scheduler แบบเดิมมีประโยชน์แต่ไม่บังคับ

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

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

  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 ของระบบคลาวด์ การใช้งาน 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 บริการเมนูเป็นไมโครเซอร์วิสที่ใช้ Java ซึ่งสร้างขึ้นด้วยเฟรมเวิร์ก Quarkus โดยใช้ฐานข้อมูล Cloud SQL Postgres สำหรับแบ็กเอนด์ของบริการ บริการเมนูคือทรัพยากร Dependency ของรันไทม์สำหรับงาน Cloud Run ที่คุณสร้างในขั้นตอนต่อไปนี้

./setup.sh

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

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

3. สำรวจรหัสงาน Cloud Run

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

45f480cd1b9a995.png

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

cd ~/cymbal-eats/cleanup-service

บริการทำความสะอาดในไดเรกทอรีนี้มี Dockerfile ที่กำหนดอิมเมจคอนเทนเนอร์สำหรับงานบริการล้างด้วยทรัพยากร Dependency ที่จำเป็น(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

(ไม่บังคับ) หากต้องการเปลี่ยนตัวแปรอายุรายการที่ไม่สำเร็จหรือตัวแปร 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 อายุของรายการที่ไม่สำเร็จและ 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 Job โดยคลิก "EXECUTE"

229c22288882b5c3.png

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

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

50829ae27b135b2d.png

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

d94fb9e444b1c1b8.png

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

curl ${MENU_SERVICE_URL}/menu | jq

เอาต์พุต:

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

7. ยินดีด้วย

ยินดีด้วย คุณศึกษา Codelab จบแล้ว

สิ่งที่เราได้พูดคุยกันมีดังนี้

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

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

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

ล้างข้อมูล

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

กำลังลบโปรเจ็กต์

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