1. نظرة عامة
في هذا التمرين العملي، ستنشئ مهمة Cloud Run وتضبط مهمة Cloud Scheduler. ستنفّذ خدمة "قائمة طعام Cymbal Eats" باستخدام نص الإعداد البرمجي. ستنشئ مهمة Cloud Run تُجري طلبات بيانات من واجهة برمجة التطبيقات إلى خدمة قائمة الطعام في Cymbal Eats. ستنفّذ المهمة باستخدام Google Cloud CLI وتضبط جدولاً زمنيًا لها. يمكنك التحقّق من التنفيذ من خلال مراجعة السجلات وإجراء طلبات بيانات من واجهة برمجة التطبيقات إلى "خدمة القائمة" للتأكّد من حذف عناصر القائمة.
ما هي مهام Cloud Run؟
يشغّل Cloud Run Job حاوية لا تعالج طلبات الويب، بل تنفّذ مهام تشغيلية أو تعالج البيانات. سيشغّل الحاوية المهمة ويخرج عند الانتهاء.
مهمة خدمة التنظيف
ستسترد مهمة خدمة التنظيف عناصر القائمة التي تحمل الحالة "تعذّر" وتحذفها. عند إنشاء عناصر قائمة جديدة، يتم تحليل الصور باستخدام 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 تلقائيًا سلسلة فريدة، ولا يهمّك عادةً ما هي. في معظم دروس البرمجة، عليك الرجوع إلى رقم تعريف المشروع (يتم تحديده عادةً على أنّه
PROJECT_ID). إذا لم يعجبك رقم التعريف الذي تم إنشاؤه، يمكنك إنشاء رقم تعريف عشوائي آخر. يمكنك بدلاً من ذلك تجربة اسم مستخدم من اختيارك لمعرفة ما إذا كان متاحًا. لا يمكن تغيير هذا الخيار بعد هذه الخطوة وسيظل ساريًا طوال مدة المشروع. - للعلم، هناك قيمة ثالثة، وهي رقم المشروع الذي تستخدمه بعض واجهات برمجة التطبيقات. يمكنك الاطّلاع على مزيد من المعلومات عن كل هذه القيم الثلاث في المستندات.
- بعد ذلك، عليك تفعيل الفوترة في Cloud Console لاستخدام موارد/واجهات برمجة تطبيقات Cloud. لن تكلفك تجربة هذا الدرس التطبيقي حول الترميز الكثير من المال، إن لم تكلفك شيئًا على الإطلاق. لإيقاف الموارد كي لا يتم تحصيل رسوم منك بعد هذا البرنامج التعليمي، يمكنك حذف الموارد التي أنشأتها أو حذف المشروع بأكمله. يمكن لمستخدمي Google Cloud الجدد الاستفادة من برنامج الفترة التجريبية المجانية بقيمة 300 دولار أمريكي.
إعداد البيئة
فعِّل 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 كخادم خلفي. خدمة القائمة هي تبعية وقت التشغيل لمهمة Cloud Run التي ستنشئها في الخطوات التالية.
./setup.sh
سيستغرق النشر حوالي 10 دقائق لإنشاء جميع المكوّنات المطلوبة.
تابِع الخطوات التالية بعد تنفيذ الأمر أعلاه.
3- استكشاف رمز Cloud Run Job
افتح علامة تبويب جديدة في Cloud Shell من خلال النقر على رمز علامة الجمع.

انتقِل إلى الدليل الذي يحتوي على خدمة التنظيف وراجِع الملفات التي تشكّل المهمة:
cd ~/cymbal-eats/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"]
يحتوي برنامج التنظيف الفعلي النصي، المدرَج أدناه، على أوامر للحصول على قائمة بعناصر القائمة التي تعذّر تشغيلها وحذفها من خلال إجراء طلبات إلى واجهة برمجة التطبيقات لخدمة "القائمة".
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 Job. FAILED_ITEM_AGE: عدد الدقائق قبل حذف العنصر الذي تعذّر تحميله-
MENU_SERVICE_URL- عنوان URL لخدمة قائمة Cymbal Eats
4. إنشاء مهمة Cloud Run
بعد ذلك، ستنشئ صورة حاوية وتنشرها في Artifact Registry.
سيتم استخدام صورة الحاوية هذه لإنشاء مهمة Cloud Run.
فعِّل واجهات برمجة التطبيقات للخدمة:
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. نفِّذ الأمر التالي لوصف خدمة "القائمة" وحفظ عنوان URL في متغيّر البيئة. سيتم استخدام متغيّر البيئة هذا لإعداد مهمة Cloud Run.
MENU_SERVICE_URL=$(gcloud run services describe $MENU_SERVICE_NAME \
--region=$REGION \
--format=json | jq \
--raw-output ".status.url")
أنشئ مهمة Cloud Run لتنظيف عناصر القائمة التي تعذّر تنفيذها والتي مرّ عليها أكثر من دقيقة واحدة [تم ضبطها بواسطة 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 في وحدة التحكّم وراجِع المهمة التي تم إنشاؤها.
انقر على المهمة واستكشِف علامات التبويب المتاحة: HISTORY وLOGS وCONFIGURATION وYAML.

تأكَّد من ضبط متغيرات البيئة من خلال مراجعة قسم الإعدادات (CONFIGURATION) الخاص بالمهمة في وحدة التحكّم:

(اختياري) إذا أردت تغيير متغيّرات "عمر العنصر الذي تعذّر تحميله" أو "عنوان 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 Jobs.
امنح حساب الخدمة المستخدَم في مهمة Cloud Scheduler الدور Cloud Run Invoker:
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
- نشر/اشتراك
- 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
انتظِر لمدة دقيقة واحدة. يجب أن يمرّ دقيقة واحدة على إضافة عنصر القائمة حتى يمكن حذفه، وذلك وفقًا لما تم ضبطه في المَعلمة FAILED_ITEM_AGE.
يمكنك انتظار عملية التنفيذ المُجدوَلة التالية أو فرض تنفيذ المهمة من وحدة التحكّم.
هناك طرق متعددة لتشغيل مهمة، سواء من خلال واجهة المستخدم أو من سطر الأوامر.
في هذا المثال، نفِّذ الأمر في Cloud Shell(الخيار 3) لتشغيل المهمة.
- من Cloud Scheduler، اختَر "فرض تشغيل مهمة" من قائمة "الإجراءات".

- من مهمة Cloud Run بالنقر على الزر "تنفيذ"

- من Cloud Shell عن طريق تنفيذ الأمر التالي:
gcloud beta run jobs execute cleanup-service --region=$REGION
انتقِل إلى قسم JOBS في Cloud Run، وافتح علامة التبويب السجلّات وتأكَّد من حذف عنصر القائمة.

فلتر السجلات حسب الكلمة الرئيسية "حذف" للعثور على السجلات

استخدِم نقاط نهاية "خدمة القائمة" للتحقّق من عناصر القائمة الحالية من خلال نقطة نهاية REST.
curl ${MENU_SERVICE_URL}/menu | jq
إخراج:
سيظهر لك عنصران في القائمة بحالة Ready.
7. تهانينا!
تهانينا، لقد أكملت درس البرمجة.
المواضيع التي تناولناها:
- كيفية إنشاء مهام Cloud Run
- كيفية تنفيذ مهام Cloud Run
- كيفية إنشاء مهام Cloud Scheduler
- كيفية التحقّق من تنفيذ المهام
الخطوة التالية:
استكشِف دروسًا تطبيقية أخرى حول Cymbal Eats:
- تشغيل Cloud Workflows باستخدام Eventarc
- بدء معالجة الأحداث من Cloud Storage
- الاتصال بخدمة Private CloudSQL من Cloud Run
- الاتصال بقواعد البيانات المُدارة بالكامل من Cloud Run
- تأمين التطبيقات التي لا تستخدم خوادم من خلال خدمة Identity-Aware Proxy (IAP)
- النشر بشكل آمن على Cloud Run
- تأمين حركة بيانات الدخول في Cloud Run
- الاتصال بـ AlloyDB الخاص من GKE Autopilot
تَنظيم
لتجنُّب تحمّل رسوم في حسابك على Google Cloud مقابل الموارد المستخدَمة في هذا البرنامج التعليمي، احذف المشروع الذي يحتوي على الموارد أو احتفظ بالمشروع واحذف الموارد الفردية.
حذف المشروع
أسهل طريقة لإيقاف الفوترة هي حذف المشروع الذي أنشأته لتنفيذ البرنامج التعليمي.