1. ภาพรวม
ในห้องทดลองนี้ คุณจะสร้างงาน Cloud Run และตั้งค่างาน Cloud Scheduler คุณจะทำให้ Cymbal Eats Menu Service ใช้งานได้โดยใช้สคริปต์การตั้งค่า คุณจะสร้างงาน Cloud Run ที่เรียก API ไปยังบริการเมนู Cymbal Eats คุณจะเรียกใช้งานโดยใช้ Google Cloud CLI และตั้งค่ากำหนดเวลาสำหรับงาน คุณจะยืนยันการดำเนินการโดยตรวจสอบบันทึกและเรียกใช้ API ที่บริการเมนู เพื่อยืนยันว่ารายการในเมนูถูกลบออกแล้ว
งาน Cloud Run คืออะไร
งาน Cloud Run เรียกใช้คอนเทนเนอร์ที่ไม่ให้บริการคำขอเว็บ แต่จะดำเนินการกับงานด้านการดำเนินการหรือการประมวลผลข้อมูลแทน คอนเทนเนอร์จะเรียกใช้งานและออกเมื่อเสร็จสิ้น
งานบริการล้างข้อมูล
งานบริการทำความสะอาดจะเรียกข้อมูลรายการในเมนูในสถานะ "ล้มเหลว" แล้วลบออก เมื่อสร้างรายการในเมนูใหม่ ระบบจะวิเคราะห์รูปภาพโดยใช้ Vision API เพื่อตรวจหาว่าเป็นรายการอาหารหรือไม่ สำหรับรูปภาพที่ไม่ผ่านการตรวจสอบนี้ สถานะรายการในเมนูจะอัปเดตเป็น "ไม่ผ่าน" และหลังจากนั้นจะลบออกตามงานการทำความสะอาด
สิ่งที่คุณจะได้เรียนรู้
ในห้องทดลองนี้ คุณจะได้ศึกษาวิธีทำสิ่งต่อไปนี้
- สร้างงาน Cloud Run
- เรียกใช้งาน Cloud Run
- สร้างงาน Cloud Scheduler
- ยืนยันการเรียกใช้งาน
ข้อกำหนดเบื้องต้น
- ห้องทดลองนี้จะถือว่ามีความคุ้นเคยกับ Cloud Console และสภาพแวดล้อมของ Shell
- ประสบการณ์การใช้งาน Cloud Run และ Cloud Scheduler แบบเดิมมีประโยชน์แต่ไม่บังคับ
2. การตั้งค่าและข้อกำหนด
ตั้งค่าโปรเจ็กต์ที่อยู่ในระบบคลาวด์
- ลงชื่อเข้าใช้ Google Cloud Console และสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่อีกครั้ง หากยังไม่มีบัญชี Gmail หรือ Google Workspace คุณต้องสร้างบัญชี
- ชื่อโครงการคือชื่อที่แสดงของผู้เข้าร่วมโปรเจ็กต์นี้ เป็นสตริงอักขระที่ Google APIs ไม่ได้ใช้ โดยคุณจะอัปเดตได้ทุกเมื่อ
- รหัสโปรเจ็กต์จะไม่ซ้ำกันในทุกโปรเจ็กต์ของ Google Cloud และจะเปลี่ยนแปลงไม่ได้ (เปลี่ยนแปลงไม่ได้หลังจากตั้งค่าแล้ว) Cloud Console จะสร้างสตริงที่ไม่ซ้ำกันโดยอัตโนมัติ ปกติแล้วคุณไม่สนว่าอะไรเป็นอะไร ใน Codelab ส่วนใหญ่ คุณจะต้องอ้างอิงรหัสโปรเจ็กต์ (โดยปกติจะระบุเป็น
PROJECT_ID
) หากคุณไม่ชอบรหัสที่สร้างขึ้น คุณสามารถสร้างรหัสแบบสุ่มอื่นได้ หรือคุณจะลองดำเนินการเองแล้วดูว่าพร้อมให้บริการหรือไม่ และไม่สามารถเปลี่ยนแปลงได้หลังจากขั้นตอนนี้และจะยังคงอยู่ตลอดระยะเวลาของโปรเจ็กต์ - สำหรับข้อมูลของคุณ ค่าที่ 3 คือหมายเลขโปรเจ็กต์ที่ API บางตัวใช้ ดูข้อมูลเพิ่มเติมเกี่ยวกับค่าทั้ง 3 ค่าเหล่านี้ในเอกสารประกอบ
- ถัดไป คุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร/API ของระบบคลาวด์ การใช้งาน 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 บริการเมนูเป็นไมโครเซอร์วิสที่ใช้ Java ซึ่งสร้างขึ้นด้วยเฟรมเวิร์ก Quarkus โดยใช้ฐานข้อมูล Cloud SQL Postgres สำหรับแบ็กเอนด์ของบริการ บริการเมนูคือทรัพยากร Dependency ของรันไทม์สำหรับงาน Cloud Run ที่คุณสร้างในขั้นตอนต่อไปนี้
./setup.sh
การทำให้ใช้งานได้จะใช้เวลาประมาณ 10 นาทีในการสร้างคอมโพเนนต์ที่จำเป็นทั้งหมด
ทำขั้นตอนถัดไปหลังจากเรียกใช้คำสั่งข้างต้น
3. สำรวจรหัสงาน Cloud Run
เปิดแท็บใหม่ใน Cloud Shell ด้วยการคลิกไอคอนเครื่องหมายบวก
ไปที่ไดเรกทอรีที่มีบริการทำความสะอาดและตรวจสอบไฟล์ที่ประกอบกันเป็นงาน ดังนี้
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 และตรวจสอบอิมเมจที่เผยแพร่แล้ว ดังนี้
เปลี่ยนกลับไปใช้แท็บ 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
ยืนยันว่ามีการตั้งค่าตัวแปรสภาพแวดล้อมโดยตรวจสอบส่วนการกำหนดค่าของงานในคอนโซล โดยทำดังนี้
(ไม่บังคับ) หากต้องการเปลี่ยนตัวแปรอายุรายการที่ไม่สำเร็จหรือตัวแปร 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 บริการเมนูในบันทึก
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 Job โดยคลิก "EXECUTE"
- จาก Cloud Shell โดยเรียกใช้คำสั่งต่อไปนี้
gcloud beta run jobs execute cleanup-service --region=$REGION
ไปที่ส่วน Cloud Run JOBS จากนั้นเปิดแท็บบันทึก และยืนยันว่ารายการในเมนูถูกลบออกแล้ว
กรองบันทึกสำหรับ "การลบ" คีย์เวิร์ดเพื่อค้นหาบันทึก
ใช้ปลายทางบริการเมนูเพื่อตรวจสอบรายการในเมนูที่มีอยู่ผ่านปลายทาง 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
- แอปพลิเคชัน Serverless ที่ปลอดภัยด้วย Identity Aware Proxy (IAP)
- การทำให้ Cloud Run ใช้งานได้อย่างปลอดภัย
- การรักษาความปลอดภัยการรับส่งข้อมูลขาเข้าของ Cloud Run
- การเชื่อมต่อกับ AlloyDB แบบส่วนตัวจาก GKE Autopilot
ล้างข้อมูล
เพื่อหลีกเลี่ยงไม่ให้เกิดการเรียกเก็บเงินกับบัญชี Google Cloud สำหรับทรัพยากรที่ใช้ในบทแนะนำนี้ โปรดลบโปรเจ็กต์ที่มีทรัพยากรดังกล่าวหรือเก็บโปรเจ็กต์ไว้และลบทรัพยากรแต่ละรายการ
กำลังลบโปรเจ็กต์
วิธีที่ง่ายที่สุดในการยกเลิกการเรียกเก็บเงินคือการลบโปรเจ็กต์ที่คุณสร้างไว้สำหรับบทแนะนำ