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

1. نظرة عامة

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

d93345bfc235f81e.png

ما ستتعلمه

  • Cloud Run
  • Cloud Storage
  • 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 Audit Logs. عندما يتم إطلاق حدث من مصدر 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 التلقائي الدور eventarc.eventReceiver:

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

امنح حساب خدمة Cloud Storage الدور pubsub.publisher. هذا الإذن مطلوب لمشغّل 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

إذا فعّلت حساب خدمة Pub/Sub في 8 أبريل 2021 أو قبل ذلك، امنح حساب خدمة Pub/Sub الدور 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) الخاصة بـ CloudEvents ومكتبات أحداث Google لقراءة أحداث CloudEvents التي يرسلها Eventarc. ‫Express هو إطار عمل JavaScript / Node للويب. يتم استخدام 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 الذي سنستخدمه، وBluebird هي مكتبة للتعامل مع الوعود في JavaScript، وStorage وFirestore مخصّصان للعمل مع Google Cloud Storage (حِزم الصور) وCloud Firestore datastore على التوالي. بالإضافة إلى ذلك، نطلب من 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);
    }
});

في ما يلي بنية معالج Node: يستجيب تطبيقنا لطلبات 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}'.`);

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

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 Buildpacks، ثم انشر صورة الحاوية إلى 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 لإنشاء صورة الحاوية بدون Dockerfile.. تجعل العلامة --no-allow-unauthenticated خدمة Cloud Run خدمة داخلية لن يتم تشغيلها إلا من خلال حسابات خدمة معيّنة. في وقت لاحق، ستنشئ مشغّلاً باستخدام حساب خدمة Compute Engine التلقائي الذي لديه دور run.invoker لاستدعاء خدمات Cloud Run الداخلية.

9- إنشاء مشغّل

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

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

gcloud config set eventarc/location eu

أنشئ مشغّلاً من نوع AuditLog لفلترة أحداث storage.objects.delete وإرسالها إلى خدمة Cloud Run:

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 Storage
  • Cloud Firestore
  • Eventarc