جدولة عمليات تصدير البيانات

توضّح هذه الصفحة كيفية جدولة عمليات تصدير بيانات Cloud Firestore. لتنفيذ عمليات التصدير وفقًا لجدول زمني، ننصحك باستخدامCloud Functions وCloud Scheduler.

قبل البدء

قبل جدولة عمليات تصدير البيانات المُدارة، عليك إكمال المهام التالية:

  1. فعِّل الفوترة لمشروعك على Google Cloud. لا يمكن استخدام ميزة التصدير والاستيراد إلا في Google Cloud المشاريع التي تم تفعيل الفوترة فيها.
  2. تتطلّب عمليات التصدير حزمة Cloud Storage وجهة. أنشئ حزمة Cloud Storage في موقع جغرافي قريب من موقع قاعدة بيانات Cloud Firestore. لا يمكنك استخدام حزمة "يدفع المرسِل" لإجراء عمليات التصدير.

إنشاء دالة Cloud Function وعمل Cloud Scheduler

اتّبِع الخطوات التالية لإنشاء دالة Cloud Function في Node.js تهدف إلى بدء عملية تصدير بيانات Cloud Firestore وإنشاء وظيفة Cloud Scheduler لاستدعاء هذه الدالة:

Firebase CLI
  1. ثبِّت Firebase CLI. في دليل جديد، ابدأ واجهة سطر الأوامر لتطبيق Cloud Functions:

    firebase init functions --project PROJECT_ID
    1. اختَر JavaScript للغة.
    2. يمكنك اختياريًا تفعيل ESLint.
    3. أدخِل y لتثبيت التبعيات.
  2. استبدِل الرمز في ملف functions/index.js بما يلي:

    const functions = require('firebase-functions');
    const firestore = require('@google-cloud/firestore');
    const client = new firestore.v1.FirestoreAdminClient();
    
    // Replace BUCKET_NAME
    const bucket = 'gs://BUCKET_NAME';
    
    exports.scheduledFirestoreExport = functions.pubsub
                                                .schedule('every 24 hours')
                                                .onRun((context) => {
    
      const projectId = process.env.GCP_PROJECT;
      const databaseName = 
        client.databasePath(projectId, '(default)');
    
      return client.exportDocuments({
        name: databaseName,
        outputUriPrefix: bucket,
        // Leave collectionIds empty to export all collections
        // or set to a list of collection IDs to export,
        // collectionIds: ['users', 'posts']
        collectionIds: []
        })
      .then(responses => {
        const response = responses[0];
        console.log(`Operation Name: ${response['name']}`);
      })
      .catch(err => {
        console.error(err);
        throw new Error('Export operation failed');
      });
    });
  3. في الرمز البرمجي أعلاه، عدِّل ما يلي:
    • استبدِل BUCKET_NAME باسم حزمة التخزين.
    • عدِّل every 24 hours لضبط الجدول الزمني للتصدير. استخدِم إما بنية cron.yaml في AppEngine أو تنسيق unix-cron (* * * * *).
    • عدِّل collectionIds: [] لتصدير مجموعات المجموعات المحدّدة فقط. اترك الخيار كما هو لتصدير جميع المجموعات.

  4. يمكنك نشر الدالة المُجدوَلة باتّباع الخطوات التالية:

    firebase deploy --only functions
Google Cloud Console
إنشاء دالة Cloud
  1. انتقِل إلى صفحة Cloud Functions في وحدة تحكّم Google Cloud:

    الانتقال إلى Cloud Functions

  2. انقر على إنشاء دالة.
  3. أدخِل اسم دالة، مثل firestoreExport.
  4. ضمن العامل المشغِّل، اختَر Cloud Pub/Sub.
  5. ضمن الموضوع، اختَر إنشاء موضوع جديد. أدخِل اسمًا لموضوع Pub/Sub، مثل initiateFirestoreExport. دوِّن اسم الموضوع لأنّك تحتاج إليه لإنشاء وظيفة Cloud Scheduler.
  6. ضمن الرمز المصدر، اختَر المحرِّر المضمّن. أدخِل الرمز التالي ضمن index.js:
    const firestore = require('@google-cloud/firestore');
    const client = new firestore.v1.FirestoreAdminClient();
    // Replace BUCKET_NAME
    const bucket = 'gs://BUCKET_NAME'
    
    exports.scheduledFirestoreExport = (event, context) => {
      const databaseName = client.databasePath(
        process.env.GCP_PROJECT,
        '(default)'
      );
    
      return client
        .exportDocuments({
          name: databaseName,
          outputUriPrefix: bucket,
          // Leave collectionIds empty to export all collections
          // or define a list of collection IDs:
          // collectionIds: ['users', 'posts']
          collectionIds: [],
        })
        .then(responses => {
          const response = responses[0];
          console.log(`Operation Name: ${response['name']}`);
          return response;
        })
        .catch(err => {
          console.error(err);
        });
    };
    في الرمز أعلاه، عدِّل ما يلي:
    • استبدِل BUCKET_NAME باسم حزمة التخزين.
    • عدِّل collectionIds: [] لتصدير مجموعات المجموعات المحدّدة فقط. اترك الخيار كما هو لتصدير جميع المجموعات.

  7. ضمن package.json، أضِف التبعية التالية:
    {
      "dependencies": {
        "@google-cloud/firestore": "^1.3.0"
      }
    }
  8. ضمن الدالة المطلوب تنفيذها، أدخِل scheduledFirestoreExport، وهو اسم الدالة في index.js.
  9. انقر على إنشاء لنشر دالة Cloud.
إنشاء وظيفة Cloud Scheduler

بعد ذلك، أنشئ وظيفة Cloud Scheduler تستدعي دالة Cloud:

  1. انتقِل إلى صفحة Cloud Scheduler في وحدة تحكّم Google Cloud:

    الانتقال إلى Cloud Scheduler

  2. انقر على إنشاء وظيفة.
  3. أدخِل اسمًا للوظيفة، مثل scheduledFirestoreExport.
  4. أدخِل معدّل التكرار، على سبيل المثال، every 24 hours.
  5. اختَر المنطقة الزمنية.
  6. ضمن الاستهداف، اختَر Pub/Sub. في حقل Topic (الموضوع)، أدخِل اسم موضوع pub/sub الذي حدّدته مع دالة السحابة الإلكترونية، initiateFirestoreExport في المثال أعلاه.
  7. في حقل Payload (الحمولة)، أدخِل start export. تتطلّب الوظيفة تحديد حمولة، ولكن دالة Cloud Function أعلاه لا تستخدم هذه القيمة في الواقع.
  8. انقر على إنشاء.
في هذه المرحلة، تكون قد نشرت وظيفتك على Cloud Function وCloud Scheduler المهمة، ولكن لا تزال وظيفة Cloud Function بحاجة إلى أذونات وصول لتنفيذ عمليات التصدير.

ضبط أذونات الوصول

بعد ذلك، امنح Cloud Function الإذن ببدء عمليات التصدير والكتابة في حزمة GCS.

تستخدِم دالة Cloud Function هذه حساب الخدمة التلقائي لمشروعك للقيام بمهام مصادقة عمليات التصدير وتفويضها. عند إنشاء مشروع، يتم إنشاء حساب خدمة تلقائي بالاسم التالي:

PROJECT_ID@appspot.gserviceaccount.com

يتطلّب حساب الخدمة هذا إذنًا لبدء عملية تصدير والكتابة في حزمة Cloud Storage. لمنح هذه الأذونات، يجب إسناد أدوار "إدارة الهوية وإمكانية الوصول" التالية إلى حساب الخدمة التلقائي:

  • Cloud Datastore Import Export Admin
  • دور Owner أو Storage Admin في الحزمة

يمكنك استخدام أداتَي سطر الأوامر gcloud وgsutil لمنح هذين الدورَين.

يمكنك الوصول إلى هذه الأدوات من Cloud Shell في Google Cloud Console إذا لم تكن مثبّتة:
البدء Cloud Shell

  1. اسنِد دور مشرف استيراد وتصدير "تخزين البيانات في Google Cloud". استبدِل PROJECT_ID، ونفِّذ الأمر التالي:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member serviceAccount:PROJECT_ID@appspot.gserviceaccount.com \
        --role roles/datastore.importExportAdmin
    

  2. منح دور مشرف مساحة التخزين في حِزمك استبدِل PROJECT_ID وBUCKET_NAME، وشغِّل الأمر التالي:

    gsutil iam ch serviceAccount:PROJECT_ID@appspot.gserviceaccount.com:admin \
        gs://BUCKET_NAME
    

في حال إيقاف حساب الخدمة التلقائي على App Engine أو حذفه، سيفقد تطبيق App Engine إمكانية الوصول إلى قاعدة بيانات Cloud Firestore. إذا أوقفت حساب الخدمة على App Engine، يمكنك إعادة تفعيله، راجِع تفعيل حساب خدمة. إذا حذفت حساب الخدمة على App Engine خلال آخر 30 يومًا، يمكنك استعادة حساب الخدمة، اطّلِع على مقالة إلغاء حذف حساب خدمة.

اختبار وظيفة Cloud Scheduler وCloud Function

يمكنك اختبار مهمة Cloud Scheduler في صفحة Cloud Scheduler في وحدة تحكّم Google Cloud.

  1. انتقِل إلى صفحة Cloud Scheduler في وحدة تحكّم Google Cloud.
    الانتقال إلى Cloud Scheduler

  2. في صفّ وظيفة Cloud Scheduler الجديدة، انقر على التشغيل الآن.

    بعد بضع ثوانٍ، من المفترض أن تعدّل وظيفة Cloud Scheduler عمود نتيجة إلى نجاح وآخر عملية تشغيل إلى الوقت الحالي. قد تحتاج إلى النقر على إعادة التحميل.

لا تؤكّد صفحة Cloud Scheduler سوى أنّ المهمة قد نادَت وظيفة Cloud. افتح صفحة Cloud Function للاطّلاع على سجلّات الدالة.

عرض سجلّات وظائف السحابة الإلكترونية

لمعرفة ما إذا كانت دالة Cloud Function قد بدأت عملية تصدير بنجاح، افتح سجلّات الدالة:

وحدة تحكُّم Firebase

انتقِل إلى صفحة Cloud Functions في وحدة تحكُّم Firebase.

الانتقال إلى "سجلّات الدوال"

وحدة تحكّم Google Cloud Platform

انتقِل إلى صفحة Cloud Functions في وحدة تحكّم Google Cloud.

الانتقال إلى "عارض السجلّات"

عرض مستوى تقدّم عملية التصدير

يمكنك استخدام الأمر gcloud firestore operations list لعرض مستوى تقدّم عمليات التصدير، اطّلِع على إدارة عمليات التصدير والاستيراد.

بعد اكتمال عملية تصدير، يمكنك عرض ملفات الإخراج في حزمة Cloud Storage:

افتح متصفّح Cloud Storage.