1. نظرة عامة
في هذا الدرس التطبيقي، ستنشئ وظيفة Cloud Run وتُعدّ وظيفتَي Cloud Scheduler. ستنشر Cymbal Eats Menu Service باستخدام نص الإعداد. ستنشئ مهمة Cloud Run تُجري طلبات بيانات من واجهة برمجة التطبيقات إلى Cymbal Eats Menu Service. ستنفِّذ المهمة باستخدام واجهة سطر أوامر Google Cloud وإعداد جدول زمني لها. يمكنك التحقّق من التنفيذ من خلال مراجعة السجلات وإجراء طلبات بيانات من واجهة برمجة التطبيقات إلى Menu Service لتأكيد حذف عناصر القائمة.
ما هي مهام 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. ويمكنك تعديله في أي وقت.
- يكون معرّف المشروع فريدًا في جميع مشاريع 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
يمكنك نشر خدمة Menu باستخدام النص البرمجي للإعداد في Cloud Run. خدمة Menu هي خدمة صغيرة مستندة إلى 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"]
يحتوي النص البرمجي الفعلي للتنظيف، المدرَج أدناه، على أوامر للحصول على قائمة بعناصر القائمة التي تتضمّن حالة تعذُّر وحذفها من خلال إجراء طلبات بيانات من واجهة برمجة التطبيقات إلى خدمة "القائمة".
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 Menu
4. إنشاء مهمة Cloud Run
بعد ذلك، عليك إنشاء صورة حاوية ونشرها في "مستودع العناصر".
سيتم استخدام صورة الحاوية هذه لإنشاء وظيفة في 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
بعد الانتهاء من النشر، انتقِل إلى سجلّ العناصر وراجِع الصورة المنشورة:
ارجع إلى علامة التبويب الثانية في 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 في وحدة التحكّم وراجِع المهمة التي تم إنشاؤها.
انقر على المهمة واستكشِف علامات التبويب المتاحة: "السجلّ" و"السجلّات" و"الإعداد" و"YAML".
تأكَّد من ضبط متغيّرات البيئة من خلال مراجعة قسم الإعداد في المهمة في وحدة التحكّم:
(اختياري) إذا كنت تريد تغيير متغيّري "عمر العنصر الذي تعذّر تحميله" أو "عنوان URL لخدمة القائمة"، يمكنك استخدام الأمر update بعد إنشاء وظيفة 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
- نشر/اشتراك
- 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
يُرجى الانتظار لمدة دقيقة واحدة. لكي يتم حذف عنصر القائمة، يجب أن يكون قد مرّت دقيقة واحدة على إنشائه، كما تم ضبطه بواسطة المَعلمة FAILED_ITEM_AGE
.
يمكنك انتظار التنفيذ التالي المقرّر أو فرض تنفيذ المهمة من وحدة التحكّم.
هناك طرق متعدّدة لبدء مهمة، إما من خلال واجهة المستخدم أو من سطر الأوامر.
في هذا المثال، يمكنك تنفيذ الأمر في Cloud Shell(الخيار 3) لبدء المهمة.
- من Cloud Scheduler من خلال اختيار "فرض تنفيذ مهمة" من قائمة "الإجراءات"
- من Cloud Run Job بالنقر على الزر "تنفيذ"
- من Cloud Shell، يمكنك تنفيذ الأمر التالي:
gcloud beta run jobs execute cleanup-service --region=$REGION
انتقِل إلى قسم "وظائف Cloud Run"، وافتح علامة التبويب السجلّات وتأكَّد من حذف عنصر القائمة.
فلتِر السجلّات بحثًا عن الكلمة الرئيسية "حذف" للعثور على السجلّات.
استخدِم نقاط نهاية "خدمة القائمة" للاطّلاع على عناصر القائمة الحالية من خلال نقطة نهاية REST.
curl ${MENU_SERVICE_URL}/menu | jq
إخراج:
سيظهر لك عنصران من قائمة الطعام في حالة Ready
.
7- تهانينا!
تهانينا، لقد أكملت دورة codelab.
في ما يلي المواضيع التي تناولناها:
- كيفية إنشاء مهام Cloud Run
- كيفية تنفيذ مهام Cloud Run
- كيفية إنشاء مهام Cloud Scheduler
- كيفية التحقّق من تنفيذ المهام
الخطوة التالية:
استكشاف الدروس التطبيقية الأخرى حول ترميز Cymbal Eats:
- بدء سير عمل Cloud باستخدام Eventarc
- بدء معالجة الأحداث من Cloud Storage
- الاتصال بخدمة CloudSQL الخاصة من Cloud Run
- الاتصال بقواعد البيانات المُدارة بالكامل من Cloud Run
- تطبيق آمن بدون خادم باستخدام وكيل يراعي الهوية (IAP)
- النشر بأمان على Cloud Run
- تأمين حركة مرور الإدخال في Cloud Run
- الربط بخدمة AlloyDB الخاصة من GKE Autopilot
تَنظيم
لتجنُّب تحصيل رسوم من حسابك على Google Cloud مقابل الموارد المستخدَمة في هذا الدليل التعليمي، يمكنك إما حذف المشروع الذي يحتوي على الموارد أو الاحتفاظ بالمشروع وحذف الموارد الفردية.
حذف المشروع
إنّ أسهل طريقة لإيقاف الفوترة هي حذف المشروع الذي أنشأته للدليل التعليمي.