توضّح هذه الصفحة كيفية جدولة عمليات تصدير بيانات Cloud Firestore. لتنفيذ عمليات التصدير وفقًا لجدول زمني، ننصحك باستخدام Cloud Functions وCloud Scheduler.
قبل البدء
قبل جدولة عمليات تصدير البيانات المُدارة، عليك إكمال المهام التالية:
- فعِّل الفوترة لمشروعك على Google Cloud. يمكن فقط لمشاريع Google Cloud التي تم تفعيل الفوترة فيها استخدام ميزة التصدير والاستيراد.
- تتطلّب عمليات التصدير استخدام حزمة Cloud Storage وجهة. أنشئ حزمة Cloud Storage في موقع جغرافي قريب من موقع قاعدة بيانات Cloud Firestore. لا يمكنك استخدام حزمة "يدفع مقدّم الطلب" لعمليات التصدير.
إنشاء دالة Cloud Function ووظيفة Cloud Scheduler
اتّبِع الخطوات التالية لإنشاء دالة Node.js Cloud Function تبدأ عملية تصدير بيانات Cloud Firestore ومهمة Cloud Scheduler لاستدعاء هذه الدالة:
Firebase CLI
-
ثبِّت Firebase CLI. في دليل جديد، افتح واجهة سطر الأوامر (CLI) لـ Cloud Functions:
firebase init functions --project PROJECT_ID
- اختَر JavaScript للغة.
- يمكنك تفعيل ESLint اختياريًا.
- أدخِل
yلتثبيت التبعيات.
-
استبدِل الرمز في ملف
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'); }); });
-
في الرمز السابق، عدِّل ما يلي:
- استبدِل
BUCKET_NAMEباسم الحزمة. - استبدِل
YOUR_PROJECT_IDبرقم تعريف مشروعك - عدِّل
every 24 hoursلضبط جدول التصدير. استخدِم بنية AppEngine cron.yaml أو تنسيق unix-cron (* * * * *). -
عدِّل
collectionIds: []لتصدير مجموعات المجموعات المحدّدة فقط. اترك هذا الحقل فارغًا لتصدير جميع مجموعات المجموعات.
- استبدِل
-
انشر الدالة المجدوَلة:
firebase deploy --only functions
Google Cloud Console
إنشاء دالة Cloud
-
انتقِل إلى صفحة Cloud Functions في وحدة تحكّم Google Cloud:
- انقر على كتابة دالة
- أدخِل اسم دالة، مثل
firestore-export - ضمن عامل التشغيل، اختَر Cloud Pub/Sub.
- ضِمن الموضوع، اختَر إنشاء موضوع جديد. أدخِل اسمًا لموضوع Pub/Sub، مثل
initiateFirestoreExport. سجِّل اسم الموضوع لأنّك ستحتاج إليه لإنشاء مهمة Cloud Scheduler. - ضمن الرمز المصدر، اختَر محرِّر مضمّن. أدخِل الرمز التالي ضمن
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تلقائيًا، قد تحتاج أيضًا إلى ضبطه يدويًا أو استبداله برقم تعريف مشروعك في الرمز البرمجي.
- استبدِل
- ضمن
package.json، أضِف التبعية التالية:{ "dependencies": { "@google-cloud/firestore": "^1.3.0" } } - ضمن الدالة المطلوب تنفيذها، أدخِل
scheduledFirestoreExport، وهو اسم الدالة فيindex.js. - انقر على إنشاء لنشر دالة Cloud.
إنشاء وظيفة Cloud Scheduler
بعد ذلك، أنشئ وظيفة Cloud Scheduler تستدعي دالة Cloud:
-
انتقِل إلى صفحة Cloud Scheduler في وحدة تحكّم Google Cloud:
- انقر على إنشاء مهمة.
- أدخِل اسمًا للمهمة، مثل
scheduledFirestoreExport. - أدخِل التكرار، على سبيل المثال،
every 24 hours. - اختَر منطقة زمنية.
- ضمن الهدف، اختَر Pub/Sub. في حقل الموضوع،
أدخِل اسم موضوع pub/sub الذي حدّدته مع
دالة Cloud، وهو
initiateFirestoreExportفي المثال السابق. - في حقل الحمولة، أدخِل
start export. تتطلّب المهمة تحديد حمولة، ولكنّ دالة Cloud السابقة لا تستخدم هذه القيمة فعليًا. - انقر على إنشاء.
ضبط أذونات الوصول
بعد ذلك، امنح 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
-
امنح دور مشرف الاستيراد والتصدير في 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 -
امنح دور مشرف مساحة التخزين في حزمتك. استبدِل SERVICE_ACCOUNT وBUCKET_NAME، وشغِّل الأمر التالي:
gsutil iam ch serviceAccount:SERVICE_ACCOUNT:admin \ gs://BUCKET_NAME -
(بالنسبة إلى 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.
انتقِل إلى صفحة Cloud Scheduler في وحدة تحكّم Google Cloud.
الانتقال إلى Cloud Schedulerفي صف مهمة 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: