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

สิ่งที่คุณจะได้เรียนรู้
ในแล็บนี้ คุณจะได้เรียนรู้วิธีทำสิ่งต่อไปนี้
- สร้างงาน Cloud Run
- เรียกใช้งานใน Cloud Run
- สร้างงาน Cloud Scheduler
- ยืนยันการเรียกใช้งานงาน
ข้อกำหนดเบื้องต้น
- แล็บนี้ถือว่าคุณคุ้นเคยกับ Cloud Console และสภาพแวดล้อมเชลล์
- ประสบการณ์การใช้งาน Cloud Run และ Cloud Scheduler ก่อนหน้านี้จะเป็นประโยชน์ แต่ไม่จำเป็น
2. การตั้งค่าและข้อกำหนด
การตั้งค่าโปรเจ็กต์ Cloud
- ลงชื่อเข้าใช้ Google Cloud Console แล้วสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่ซ้ำ หากยังไม่มีบัญชี Gmail หรือ Google Workspace คุณต้องสร้างบัญชี



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

จาก 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 โดยคลิกไอคอนบวก

ไปที่ไดเรกทอรีที่มีบริการล้างข้อมูลและตรวจสอบไฟล์ที่ประกอบกันเป็นงาน
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 แล้วตรวจสอบรูปภาพที่เผยแพร่

กลับไปที่แท็บ 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

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

(ไม่บังคับ) หากต้องการเปลี่ยนตัวแปร 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 ของบริการเมนูในบันทึก

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 ในคอนโซลเพื่อตรวจสอบงานของเครื่องจัดตารางเวลาที่สร้างขึ้น

ดูตัวเลือกที่มีในเมนูการดำเนินการ

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) เพื่อทริกเกอร์งาน
- จาก Cloud Scheduler โดยเลือก "บังคับให้เรียกใช้ชิ้นงาน" จากเมนูการดำเนินการ

- จาก Cloud Run Job โดยคลิกปุ่ม "EXECUTE"

- จาก Cloud Shell โดยเรียกใช้คำสั่งต่อไปนี้
gcloud beta run jobs execute cleanup-service --region=$REGION
ไปที่ส่วน Cloud Run JOBS เปิดแท็บLOGS แล้วตรวจสอบว่าระบบได้ลบรายการเมนูแล้ว

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

ใช้ปลายทางของบริการเมนูเพื่อตรวจสอบรายการในเมนูที่มีอยู่ผ่านปลายทาง REST
curl ${MENU_SERVICE_URL}/menu | jq
เอาต์พุต:
คุณจะเห็นรายการเมนู 2 รายการในสถานะReady
7. ยินดีด้วย
ยินดีด้วย คุณทำ Codelab เสร็จแล้ว
สิ่งที่เราได้พูดถึงไปแล้ว
- วิธีสร้างงาน Cloud Run
- วิธีเรียกใช้งาน Cloud Run Jobs
- วิธีสร้างงาน Cloud Scheduler
- วิธียืนยันการดำเนินการของงาน
ขั้นตอนต่อไปที่ทำได้
ดู Codelab อื่นๆ ของ Cymbal Eats
- ทริกเกอร์เวิร์กโฟลว์ระบบคลาวด์ด้วย Eventarc
- การทริกเกอร์การประมวลผลเหตุการณ์จาก Cloud Storage
- การเชื่อมต่อกับ Private Cloud SQL จาก Cloud Run
- การเชื่อมต่อกับฐานข้อมูลที่มีการจัดการครบวงจรจาก Cloud Run
- ปกป้องแอปพลิเคชันแบบไร้เซิร์ฟเวอร์ด้วย Identity-Aware Proxy (IAP)
- การทำให้ใช้งานได้กับ Cloud Run อย่างปลอดภัย
- การรักษาความปลอดภัยให้การรับส่งข้อมูลขาเข้าของ Cloud Run
- การเชื่อมต่อกับ AlloyDB ส่วนตัวจาก GKE Autopilot
ล้างข้อมูล
โปรดลบโปรเจ็กต์ที่มีทรัพยากรหรือเก็บโปรเจ็กต์ไว้และลบทรัพยากรแต่ละรายการเพื่อหลีกเลี่ยงการเรียกเก็บเงินจากบัญชี Google Cloud สำหรับทรัพยากรที่ใช้ในบทแนะนำนี้
การลบโปรเจ็กต์
วิธีที่ง่ายที่สุดในการยกเลิกการเรียกเก็บเงินคือการลบโปรเจ็กต์ที่คุณสร้างขึ้นสำหรับบทแนะนำ