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

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

قبل البدء

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

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

إنشاء دالة Cloud Function ووظيفة Cloud Scheduler

اتّبِع الخطوات التالية لإنشاء دالة Node.js Cloud Function تبدأ عملية تصدير بيانات 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
  1. انتقِل إلى صفحة Cloud Functions في وحدة تحكّم Google Cloud:

    الانتقال إلى 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) => {
      // Access the GCLOUD_PROJECT environment variable set by the runtime.
      const projectId =
        process.env.GOOGLE_CLOUD_PROJECT || process.env.GCLOUD_PROJECT;
      // Use the DATABASE_ID environment variable if set,
      // otherwise default to '(default)'
      const databaseId = process.env.DATABASE_ID || '(default)';
      const databaseName = client.databasePath(
        projectId,
        databaseId
      );
    
      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: [] لتصدير مجموعات المجموعات المحدّدة فقط. اترك هذا الحقل فارغًا لتصدير جميع مجموعات المجموعات.

    • (اختياري) إذا كنت تستخدم قاعدة بيانات غير تلقائية، تأكَّد من ضبط متغيّر البيئة DATABASE_ID عند إنشاء دالة Cloud. إذا كنت تستخدم بيئة تشغيل لا يتم فيها ضبط GOOGLE_CLOUD_PROJECT تلقائيًا، قد تحتاج أيضًا إلى ضبطه يدويًا أو استبداله برقم تعريف مشروعك في الرمز البرمجي.

  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. في حقل الموضوع، أدخِل اسم موضوع pub/sub الذي حدّدته مع دالة Cloud، وهو initiateFirestoreExport في المثال السابق.
  7. في حقل الحمولة، أدخِل start export. تتطلّب المهمة تحديد حمولة، ولكنّ دالة Cloud السابقة لا تستخدم هذه القيمة فعليًا.
  8. انقر على إنشاء.
في هذه المرحلة، تكون قد نشرت دالة Cloud Function ومهمة Cloud Scheduler، ولكن لا تزال دالة Cloud Function بحاجة إلى أذونات الوصول لتنفيذ عمليات التصدير.

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

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

تستخدم دالة Cloud Run هذه حساب خدمة لمصادقة عمليات التصدير وتفويضها. يعتمد حساب الخدمة المستخدَم على إعدادات Cloud Functions:

  • ‫Cloud Functions (الجيل الأول): تستخدم حساب الخدمة التلقائي App Engine: PROJECT_ID@appspot.gserviceaccount.com
  • Cloud Functions (الجيل الثاني): يستخدم حساب الخدمة التلقائي Compute Engine: PROJECT_NUMBER-compute@developer.gserviceaccount.com

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

  • Cloud Datastore Import Export Admin
  • دور "Storage Admin" في الحزمة
  • Cloud Run Invoker (مطلوب لـ Cloud Functions (الجيل الثاني) للسماح لخدمة التشغيل باستدعاء الدالة)

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

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

  1. امنح دور مشرف الاستيراد والتصدير في Cloud Datastore. استبدِل PROJECT_ID وSERVICE_ACCOUNT (مثلاً، PROJECT_ID@appspot.gserviceaccount.com أو PROJECT_NUMBER-compute@developer.gserviceaccount.com)، وشغِّل الأمر التالي:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member serviceAccount:SERVICE_ACCOUNT \
        --role roles/datastore.importExportAdmin
  2. امنح دور مشرف مساحة التخزين في حزمتك. استبدِل SERVICE_ACCOUNT وBUCKET_NAME، وشغِّل الأمر التالي:

    gsutil iam ch serviceAccount:SERVICE_ACCOUNT:admin \
        gs://BUCKET_NAME
  3. (بالنسبة إلى Cloud Functions (الجيل الثاني)) يجب إسناد دور مستدعي Cloud Run إلى حساب الخدمة. استبدِل PROJECT_ID وSERVICE_ACCOUNT، وشغِّل الأمر التالي:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member serviceAccount:SERVICE_ACCOUNT \
        --role roles/run.invoker

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

اختبِر وظيفة Cloud Scheduler ودالة Cloud

يمكنك اختبار مهمة 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

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

وحدة تحكُّم Firebase

في وحدة تحكُّم Firebase، انتقِل إلى الاستضافة والحوسبة بدون خادم > الدوال.

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

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

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

الانتقال إلى واجهة عرض السجلّات

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

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

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

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