الصورة اليومية: التمرين المعملي 5: تنظيف البيانات بعد حذف الصور

1. نظرة عامة

في هذا التمرين المعملي حول الترميز، يمكنك إنشاء خدمة Cloud Run الجديدة، وهي أداة جمع البيانات المهملة للصور، والتي سيتم تشغيلها بواسطة Eventarc، وهي خدمة جديدة لتلقي الأحداث في Cloud Run. عند حذف صورة من حزمة الصور، تتلقّى الخدمة حدثًا من Eventarc. بعد ذلك، يتم حذف الصورة من حزمة الصور المصغّرة وإزالتها من مجموعة صور Firestore.

d93345bfc235f81e.png

المعلومات التي ستطّلع عليها

  • Cloud Run
  • تخزين في السحابة الإلكترونية
  • Cloud Firestore
  • Eventarc

2. الإعداد والمتطلبات

إعداد بيئة ذاتية

  1. سجِّل الدخول إلى Google Cloud Console وأنشئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. إذا لم يكن لديك حساب على Gmail أو Google Workspace، عليك إنشاء حساب.

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

  • اسم المشروع هو الاسم المعروض للمشاركين في هذا المشروع. وهي عبارة عن سلسلة أحرف لا تستخدمها Google APIs، ويمكنك تحديثها في أي وقت.
  • يجب أن يكون رقم تعريف المشروع فريدًا في جميع مشاريع Google Cloud وغير قابل للتغيير (لا يمكن تغييره بعد ضبطه). تنشئ Cloud Console سلسلة فريدة تلقائيًا. فعادةً لا تهتم بما هو. في معظم الدروس التطبيقية حول الترميز، يجب الرجوع إلى رقم تعريف المشروع (والذي يتم تحديده عادةً على أنّه PROJECT_ID). لذلك، إذا لم يعجبك، يمكنك إنشاء رقم تعريف عشوائي آخر، أو يمكنك تجربة رقم تعريف المشروع الخاص بك ومعرفة ما إذا كان متاحًا. بعد أن يصبح "مجمّد" بعد إنشاء المشروع.
  • هناك قيمة ثالثة، وهي رقم المشروع الذي تستخدمه بعض واجهات برمجة التطبيقات. اطّلِع على مزيد من المعلومات حول هذه القيم الثلاث في المستندات.
  1. بعد ذلك، عليك تفعيل الفوترة في Cloud Console لاستخدام الموارد/واجهات برمجة التطبيقات في Cloud. إنّ تنفيذ هذا الدرس التطبيقي حول الترميز لن يكون مكلفًا أو مكلفًا على الإطلاق. لإيقاف تشغيل الموارد حتى لا تتحمل الفوترة بعد أكثر من هذا البرنامج التعليمي، اتبع أي عملية "تنظيف". التعليمات الموجودة في نهاية الدرس التطبيقي حول الترميز. يكون مستخدمو Google Cloud الجدد مؤهَّلون للانضمام إلى برنامج فترة تجريبية مجانية بقيمة 300 دولار أمريكي.

بدء Cloud Shell

مع أنّه يمكن إدارة Google Cloud عن بُعد من الكمبيوتر المحمول، ستستخدم في هذا الدرس التطبيقي Google Cloud Shell، وهي بيئة سطر أوامر يتم تشغيلها في السحابة الإلكترونية.

من وحدة تحكّم Google Cloud Platform، انقر على رمز Cloud Shell في شريط الأدوات العلوي الأيسر:

bce75f34b2c53987.png

من المفترَض أن تستغرق عملية إدارة الحسابات والاتصال بالبيئة بضع لحظات فقط. عند الانتهاء، من المفترض أن يظهر لك شيء مثل هذا:

f6ef2b5f13479f3a.png

يتم تحميل هذه الآلة الافتراضية مزوّدة بكل أدوات التطوير التي ستحتاج إليها. وتوفّر هذه الشبكة دليلاً رئيسيًا دائمًا بسعة 5 غيغابايت وتعمل على Google Cloud، ما يحسّن بشكل كبير من أداء الشبكة والمصادقة. يمكنك تنفيذ كل أعمالك في هذا التمرين من خلال متصفح.

3- مقدّمة عن Eventarc

تسهِّل شركة Eventarc ربط خدمات Cloud Run بفعاليات من مصادر متنوعة. وهي تعتني بعرض الأحداث وتسليمها والأمان والتفويض ومعالجة الأخطاء نيابةً عنك.

776ed63706ca9683.png

يمكنك الحصول على الأحداث من مصادر Google Cloud والتطبيقات المخصّصة التي يتم نشرها في Cloud Pub/Sub وتقديمها إلى مستودعات Google Cloud Run.

ويتم عرض أحداث من مجموعة متنوعة من مصادر Google Cloud باستخدام سجلات تدقيق Cloud. يرتبط وقت الاستجابة ومدى توفُّر تسليم الأحداث من هذه المصادر بسجلات تدقيق Cloud. عند تنشيط حدث من مصدر Google Cloud، يتم إنشاء إدخال مقابل في سجلّ تدقيق Cloud.

يمكن للتطبيقات المخصَّصة التي تنشر في Cloud Pub/Sub نشر الرسائل في موضوع Pub/Sub يتم تحديده بأي تنسيق.

عوامل تشغيل الأحداث هي آلية الفلترة لتحديد الأحداث التي يجب تسليمها إلى أي مصدر.

يتم عرض جميع الأحداث بتنسيق CloudEvents v1.0 من أجل إمكانية التشغيل التفاعلي على جميع الخدمات.

4. قبل البدء

تفعيل واجهات برمجة التطبيقات

ستحتاج إلى خدمة Eventarc لتشغيل خدمة Cloud Run. تأكّد من أنّه مفعَّل:

gcloud services enable eventarc.googleapis.com

من المفترض أن يتم الانتهاء من العملية بنجاح:

Operation "operations/acf.5c5ef4f6-f734-455d-b2f0-ee70b5a17322" finished successfully.

ضبط حسابات الخدمة

سيتم استخدام حساب خدمة Compute Engine التلقائي في المشغّلات. امنح الدور "eventarc.eventReceiver" إلى حساب خدمة Compute Engine التلقائي:

PROJECT_NUMBER=$(gcloud projects describe $GOOGLE_CLOUD_PROJECT --format='value(projectNumber)')

gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \
    --member serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com \
    --role roles/eventarc.eventReceiver

امنح الدور "pubsub.publisher" لحساب خدمة Cloud Storage. هذا الإجراء مطلوب لمشغِّل Eventarc Cloud Storage:

SERVICE_ACCOUNT=$(gsutil kms serviceaccount -p $PROJECT_NUMBER)

gcloud projects add-iam-policy-binding $PROJECT_NUMBER \
    --member serviceAccount:$SERVICE_ACCOUNT \
    --role roles/pubsub.publisher

في حال تفعيل حساب خدمة النشر/الاشتراك في 8 نيسان (أبريل) 2021 أو قبل ذلك، يمكنك منح الدور iam.serviceAccountTokenCreator لحساب خدمة النشر/الاشتراك:

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:service-$PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \
  --role roles/iam.serviceAccountTokenCreator

5- استنساخ الرمز

استنسِخ الرمز إذا لم يسبق لك إجراء ذلك في التمرين المعملي السابق للرموز:

git clone https://github.com/GoogleCloudPlatform/serverless-photosharing-workshop

يمكنك بعد ذلك الانتقال إلى الدليل الذي يحتوي على الخدمة:

cd serverless-photosharing-workshop/services/garbage-collector/nodejs

وسيكون لديك تنسيق الملفات التالي للخدمة:

services
 |
 ├── garbage-collector
      |
      ├── nodejs
           |
           ├── index.js
           ├── package.json

داخل المجلد، لديك 3 ملفات:

  • يحتوي index.js على رمز Node.js.
  • يحدد package.json تبعيات المكتبة

6- استكشاف الرمز البرمجي

التبعيات

يحدّد ملف package.json ملحقات المكتبة المطلوبة:

{
  "name": "garbage_collector_service",
  "version": "0.0.1",
  "main": "index.js",
  "scripts": {
    "start": "node index.js"
  },
  "dependencies": {
    "cloudevents": "^4.0.1",
    "express": "^4.17.1",
    "@google/events": "^3.1.0",
    "@google-cloud/firestore": "^4.9.9",
    "@google-cloud/storage": "^5.8.3"
  }
}

ونعتمد على مكتبة Cloud Storage لحذف الصور في Cloud Storage. صرّحنا عن اعتمادية على Cloud Firestore، وذلك لحذف البيانات الوصفية للصور التي خزّنناها سابقًا. بالإضافة إلى ذلك، نستند إلى مكتبات حزمة تطوير البرامج (SDK) الخاصة بـ Cloudالأحداث ومكتبات "أحداث Google" لقراءة أحداث Cloudالأحداث المُرسَلة من Eventarc. Express هو إطار عمل ويب لـ JavaScript أو عُقدة. يتم استخدام Bluebird للتعامل مع الوعود.

index.js

لنلقِ نظرة عن كثب على رمز index.js:

const express = require('express');
const {Storage} = require('@google-cloud/storage');
const Firestore = require('@google-cloud/firestore');
const { HTTP } = require("cloudevents");
const {toStorageObjectData} = require('@google/events/cloud/storage/v1/StorageObjectData');

نحتاج إلى الاعتماديات المختلفة اللازمة لتشغيل برنامجنا: Express هو إطار عمل Node Web الذي سنستخدمه، وBluebird عبارة عن مكتبة للتعامل مع وعود JavaScript، والتخزين وFirestore هما للعمل على التوالي مع Google Cloud Storage (مجموعات الصور الخاصة بنا) ومخزن بيانات Cloud Firestore. بالإضافة إلى ذلك، نطلب من CloudEvent قراءة CloudEvent المُرسَلة من Eventarc StoreObjectData من مكتبة "أحداث Google" لقراءة نص حدث Cloud Storage في CloudEvent.

const app = express();
app.use(express.json());

app.post('/', async (req, res) => {
    try {
        const cloudEvent = HTTP.toEvent({ headers: req.headers, body: req.body });
        console.log(cloudEvent);


        /* ... */

    } catch (err) {
        console.log(`Error: ${err}`);
        res.status(500).send(err);
    }
});

أعلاه، لدينا بنية معالج العُقد: يستجيب تطبيقنا لطلبات HTTP POST. حيث يقرأ CloudEvent من طلب HTTP ونتعامل مع بعض الأخطاء في حالة حدوث خطأ. دعونا الآن نلقي نظرة على ما بداخل هذا الهيكل.

الخطوة التالية هي استرداد نص CloudEvent وتحليله واسترداد اسم الكائن:

const storageObjectData = toStorageObjectData(cloudEvent.data);
console.log(storageObjectData);

const objectName = storageObjectData.name;

وبعد معرفة اسم الصورة، يمكننا حذفها من حزمة الصور المصغّرة:

try {
    await storage.bucket(bucketThumbnails).file(objectName).delete();
    console.log(`Deleted '${objectName}' from bucket '${bucketThumbnails}'.`);
}
catch(err) {
    console.log(`Failed to delete '${objectName}' from bucket '${bucketThumbnails}': ${err}.`);
}

كخطوة أخيرة، احذف أيضًا البيانات الوصفية للصورة من مجموعة Firestore:

try {
    const pictureStore = new Firestore().collection('pictures');
    const docRef = pictureStore.doc(objectName);
    await docRef.delete();

    console.log(`Deleted '${objectName}' from Firestore collection 'pictures'`);
}
catch(err) {
    console.log(`Failed to delete '${objectName}' from Firestore: ${err}.`);
}

res.status(200).send(`Processed '${objectName}'.`);

الآن حان الوقت لجعل نص عقدة يستجيب للطلبات الواردة. تحقق أيضًا من تعيين متغيرات البيئة المطلوبة:

app.listen(PORT, () => {
    if (!bucketThumbnails) throw new Error("BUCKET_THUMBNAILS not set");
    console.log(`Started service on port ${PORT}`);
});

7. الاختبار محليًا

اختبِر الرمز البرمجي محليًا للتأكّد من عمله قبل النشر على السحابة الإلكترونية.

في المجلد garbage-collector/nodejs، ثبِّت اعتماديات npm وابدأ تشغيل الخادم:

export BUCKET_THUMBNAILS=thumbnails-$GOOGLE_CLOUD_PROJECT

npm install; npm start

إذا سارت الأمور على ما يرام، من المفترض أن يبدأ تشغيل الخادم على المنفذ 8080:

Started service on port 8080

استخدِم CTRL-C للخروج.

8. الإنشاء والنشر في Cloud Run

قبل النشر على Cloud Run، اضبط منطقة Cloud Run على إحدى المناطق والنظام الأساسي المتوافقَين على managed:

REGION=europe-west1
gcloud config set run/region $REGION
gcloud config set run/platform managed

يمكنك التحقّق من أنّه تم ضبط الإعدادات:

gcloud config list

...
[run]
platform = managed
region = europe-west1

بدلاً من إنشاء صورة الحاوية ونشرها باستخدام Cloud Build يدويًا، يمكنك أيضًا الاعتماد على Cloud Run لإنشاء صورة الحاوية نيابةً عنك باستخدام Google Cloud Buildpacks.

نفِّذ الأمر التالي لإنشاء صورة الحاوية باستخدام Google Cloud Buildpack ثم انشر صورة الحاوية في Cloud Run:

SERVICE_NAME=garbage-collector-service

gcloud run deploy $SERVICE_NAME \
    --source . \
    --no-allow-unauthenticated \
    --update-env-vars BUCKET_THUMBNAILS=$BUCKET_THUMBNAILS

دوِّن العلامة –-source. يؤدي ذلك إلى وضع علامة على Cloud Run لاستخدام Google Cloud Buildpacks لإنشاء صورة الحاوية بدون Dockerfile. تشير العلامة --no-allow-unauthenticated إلى جعل خدمة Cloud Run خدمة داخلية يتم تشغيلها فقط من خلال حسابات خدمة محدَّدة. وفي وقت لاحق، ستنشئ مشغّلاً باستخدام حساب خدمة Compute Engine التلقائي الذي لديه الدور run.invoker لطلب خدمات تشغيل السحابة الإلكترونية الداخلية.

9. إنشاء عامل تشغيل

في Eventarc، يُحدِّد المشغِّل الخدمة التي يجب أن تتلقّى نوع الأحداث. في هذه الحالة، تريد أن تتلقّى الخدمة الأحداث عند حذف ملف في حزمة.

تعيين موقع المشغِّل في المنطقة نفسها التي توجد بها حزمة الصور التي تم تحميلها:

gcloud config set eventarc/location eu

يمكنك إنشاء مشغِّل مدقق "سجل التدقيق" لفلترة أحداث storage.objects.delete وإرسالها إلى خدمة "تشغيل السحابة الإلكترونية":

BUCKET_IMAGES=uploaded-pictures-$GOOGLE_CLOUD_PROJECT

gcloud eventarc triggers create trigger-$SERVICE_NAME \
  --destination-run-service=$SERVICE_NAME \
  --destination-run-region=$REGION \
  --event-filters="type=google.cloud.storage.object.v1.deleted" \
  --event-filters="bucket=$BUCKET_IMAGES" \
  --service-account=$PROJECT_NUMBER-compute@developer.gserviceaccount.com

يمكنك التحقّق مرة أخرى من إنشاء المشغِّل باستخدام الأمر التالي:

gcloud eventarc triggers list

10. اختبار الخدمة

لاختبار عمل الخدمة، انتقِل إلى حزمة uploaded-pictures واحذف إحدى الصور. من المفترَض أن تظهر في سجلّات الخدمة أنّها حذفت الصورة ذات الصلة في حزمة thumbnails وأنّها حذفت أيضًا المستند من مجموعة pictures Firestore.

519abf90e7ea4d12.png

11. إخلاء مساحة تخزين (اختياري)

إذا كنت لا تريد مواصلة الدروس التطبيقية الأخرى ضمن هذه السلسلة، يمكنك إخلاء بعض الموارد من أجل توفير التكاليف والتحلّي بصفات المواطنين الصالحين في السحابة الإلكترونية بشكل عام. يمكنك تنظيف الموارد بشكل فردي على النحو التالي.

حذف الخدمة:

gcloud run services delete $SERVICE_NAME -q

احذف مشغِّل Eventarc:

gcloud eventarc triggers delete trigger-$SERVICE_NAME -q

بدلاً من ذلك، يمكنك حذف المشروع بالكامل:

gcloud projects delete $GOOGLE_CLOUD_PROJECT

12. تهانينا!

تهانينا! لقد أنشأت خدمة Cloud Run ، أداة تجميع البيانات المهملة للصور، التي يتم تشغيلها من خلال Eventarc، وهي خدمة جديدة لاستقبال الأحداث في Cloud Run. عند حذف صورة من حزمة الصور، تتلقّى الخدمة حدثًا من Eventarc. بعد ذلك، يتم حذف الصورة من حزمة الصور المصغّرة وإزالتها من مجموعة صور Firestore.

المواضيع التي تناولناها

  • Cloud Run
  • تخزين في السحابة الإلكترونية
  • Cloud Firestore
  • Eventarc