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

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

قبل البدء

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

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

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

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

Firebase CLI
  1. ثبِّت Firebase CLI. في دليل جديد، ابدأ 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 باسم الحزمة.
    • استبدِل YOUR_PROJECT_ID برقم تعريف مشروعك .
    • عدِّل every 24 hours لضبط جدول التصدير الزمني. استخدِم إما صيغة AppEngine cron.yaml أو الـ تنسيق unix-cron (* * * * *).
    • عدِّل collectionIds: [] لتصدير مجموعات قوائم التسوق المحدّدة فقط. اتركها كما هي لتصدير جميع مجموعات قوائم التسوق.

  4. تفعيل الدالة المجدولة:

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

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

  2. انقر على كتابة دالة
  3. أدخِل اسم دالة، مثل firestore-export
  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(
        YOUR_PROJECT_ID,
        '(default)'
      );
    
      return client
        .exportDocuments({
          name: databaseName,
          outputUriPrefix: bucket,
          // Leave collectionIds empty to export all collection groups
          // or define a list of collection group 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 Function.
إنشاء مهمة Cloud Scheduler

بعد ذلك، أنشِئ مهمة على Cloud Scheduler تستدعي الدالة على Cloud Function:

  1. انتقِل إلى صفحة Cloud Scheduler في Google Cloud Console:

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

  2. انقر على إنشاء مهمة.
  3. أدخِل اسمًا للمهمة، مثل scheduledFirestoreExport.
  4. أدخِل تكرارًا، مثلاً every 24 hours.
  5. اختَر منطقة زمنية.
  6. ضِمن الهدف ، اختَر Pub/Sub. في حقل الموضوع، أدخِل اسم موضوع Pub/Sub الذي حدّدته بجانب الدالة على Cloud Function، initiateFirestoreExport في المثال أعلاه.
  7. في حقل الحمولة ، أدخِل 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. أسنِد دور مشرف استيراد وتصدير Cloud Datastore. استبدِل 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 Console.

  1. انتقِل إلى صفحة Cloud Scheduler في Google Cloud Console.
    الانتقال إلى Cloud Scheduler

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

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

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

عرض سجلّات الدالة على Cloud Function

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

وحدة تحكُّم Firebase

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

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

Google Cloud Console

انتقِل إلى صفحة Cloud Functions في Google Cloud Console.

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

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

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

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

فتح متصفّح Cloud Storage