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. การตั้งค่าและข้อกําหนด
การตั้งค่าโปรเจ็กต์ที่อยู่ในระบบคลาวด์
- ลงชื่อเข้าใช้ Google Cloud Console และสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่ซ้ำ หากยังไม่มีบัญชี Gmail หรือ Google Workspace คุณต้องสร้างบัญชี
- ชื่อโปรเจ็กต์คือชื่อที่แสดงสำหรับผู้เข้าร่วมโปรเจ็กต์นี้ ซึ่งเป็นสตริงอักขระที่ Google APIs ไม่ได้ใช้ โดยคุณจะอัปเดตได้ทุกเมื่อ
- รหัสโปรเจ็กต์จะต้องไม่ซ้ำกันสำหรับโปรเจ็กต์ Google Cloud ทั้งหมดและจะเปลี่ยนแปลงไม่ได้ (เปลี่ยนแปลงไม่ได้หลังจากตั้งค่าแล้ว) คอนโซล Cloud จะสร้างสตริงที่ไม่ซ้ำกันโดยอัตโนมัติ ซึ่งปกติแล้วคุณไม่จำเป็นต้องสนใจว่าสตริงนั้นจะเป็นอะไร ในโค้ดแล็บส่วนใหญ่ คุณจะต้องอ้างอิงรหัสโปรเจ็กต์ (โดยปกติจะระบุเป็น
PROJECT_ID
) หากไม่ชอบรหัสที่สร้างขึ้น คุณก็สร้างรหัสอื่นแบบสุ่มได้ หรือจะลองใช้อุปกรณ์ของคุณเองเพื่อดูว่าฟีเจอร์นี้พร้อมใช้งานหรือไม่ก็ได้ คุณจะเปลี่ยนแปลงชื่อหลังจากขั้นตอนนี้ไม่ได้ และชื่อดังกล่าวจะคงอยู่ตลอดระยะเวลาของโปรเจ็กต์ - โปรดทราบว่ามีค่าที่ 3 ซึ่งเป็นหมายเลขโปรเจ็กต์ที่ API บางรายการใช้ ดูข้อมูลเพิ่มเติมเกี่ยวกับค่าทั้ง 3 รายการนี้ได้ในเอกสารประกอบ
- ถัดไป คุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร/API ของ Cloud การทำตามโค้ดแล็บนี้ไม่น่าจะเสียค่าใช้จ่ายมากนัก หากต้องการปิดใช้ทรัพยากรเพื่อไม่ให้มีการเรียกเก็บเงินหลังจากบทแนะนำนี้ คุณสามารถลบทรัพยากรที่สร้างไว้หรือลบทั้งโปรเจ็กต์ได้ ผู้ใช้ใหม่ของ 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 เป็นแบ็กเอนด์ บริการ Menu เป็นทรัพยากรรันไทม์สำหรับงาน 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
หลังจากเผยแพร่แล้ว ให้ไปที่ที่เก็บอาร์ติแฟกต์และตรวจสอบรูปภาพที่เผยแพร่
เปลี่ยนกลับไปที่แท็บ 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
ตรวจสอบว่าได้ตั้งค่าตัวแปรสภาพแวดล้อมแล้วโดยดูที่ส่วนการกําหนดค่าของงานในคอนโซล
(ไม่บังคับ) หากต้องการเปลี่ยนตัวแปรอายุของรายการที่ดำเนินการไม่สำเร็จหรือ 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 ของบริการเมนูในบันทึก
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 ในคอนโซลเพื่อตรวจสอบงานที่กําหนดเวลาไว้ซึ่งสร้างขึ้น
ตรวจสอบตัวเลือกที่มีอยู่ในเมนูการดําเนินการ
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 โดยคลิกปุ่ม "ดำเนินการ"
- จาก Cloud Shell โดยเรียกใช้คำสั่งต่อไปนี้
gcloud beta run jobs execute cleanup-service --region=$REGION
ไปที่ส่วน "งาน" ของ Cloud Run เปิดแท็บบันทึก และตรวจสอบว่ารายการเมนูถูกลบแล้ว
กรองบันทึกสำหรับคีย์เวิร์ด "deleting" เพื่อค้นหาบันทึก
ใช้ปลายทางบริการเมนูเพื่อตรวจสอบรายการเมนูที่มีอยู่ผ่านปลายทาง REST
curl ${MENU_SERVICE_URL}/menu | jq
เอาต์พุต:
คุณจะเห็นรายการเมนู 2 รายการในสถานะ Ready
7. ยินดีด้วย
ยินดีด้วย คุณทำ Codelab เสร็จแล้ว
สิ่งที่เราได้พูดถึง
- วิธีสร้างงาน Cloud Run
- วิธีเรียกใช้งาน Cloud Run
- วิธีสร้างงาน Cloud Scheduler
- วิธียืนยันการดําเนินงานของงาน
ขั้นตอนต่อไปที่ทำได้
สำรวจ Codelab อื่นๆ ของ Cymbal Eats
- การทริกเกอร์เวิร์กโฟลว์ระบบคลาวด์ด้วย Eventarc
- การเรียกให้ประมวลผลเหตุการณ์จาก Cloud Storage
- การเชื่อมต่อกับ Private CloudSQL จาก Cloud Run
- การเชื่อมต่อกับฐานข้อมูลที่จัดการครบวงจรจาก Cloud Run
- แอปพลิเคชันแบบเซิร์ฟเวอร์เสมือนที่ปลอดภัยด้วย Identity-Aware Proxy (IAP)
- ทำให้ใช้งานได้กับ Cloud Run อย่างปลอดภัย
- การรักษาความปลอดภัยของการรับส่งข้อมูลขาเข้าใน Cloud Run
- การเชื่อมต่อกับ AlloyDB ส่วนตัวจาก GKE Autopilot
ล้างข้อมูล
โปรดลบโปรเจ็กต์ที่มีทรัพยากรดังกล่าวหรือเก็บโปรเจ็กต์ไว้และลบทรัพยากรแต่ละรายการเพื่อเลี่ยงไม่ให้เกิดการเรียกเก็บเงินกับบัญชี Google Cloud สำหรับทรัพยากรที่ใช้ในบทแนะนำนี้
การลบโปรเจ็กต์
วิธีที่ง่ายที่สุดในการหยุดการเรียกเก็บเงินคือการลบโปรเจ็กต์ที่คุณสร้างสำหรับบทแนะนำ