תזמון של ייצוא נתונים
בדף הזה מוסבר איך לתזמן ייצוא של נתוני Firestore. כדי להפעיל ייצוא לפי לוח זמנים, מומלץ להשתמש בפונקציות Cloud Run וב-Cloud Scheduler.
לפני שמתחילים
לפני שמתזמנים ייצוא מנוהל של נתונים, צריך לבצע את המשימות הבאות:
- מפעילים את החיוב בפרויקט Google Cloud . אפשר להשתמש בתכונת הייצוא והייבוא רק בפרויקטים שמופעל בהם חיוב. Google Cloud
- פעולות ייצוא דורשות קטגוריה של Cloud Storage כיעד. יוצרים קטגוריה של Cloud Storage במיקום שקרוב למיקום של מסד הנתונים של Firestore. אי אפשר להשתמש בקטגוריה שבה מופעלת התכונה 'מגיש הבקשה משלם' לצורך פעולות ייצוא.
יצירת פונקציה של Cloud Functions ומשימה של Cloud Scheduler
כדי ליצור פונקציית Node.js Cloud Functions שמפעילה ייצוא של נתוני Firestore ומשימה של Cloud Scheduler לקריאה לפונקציה הזו:
Firebase CLI
-
מתקינים את Firebase CLI. בספרייה חדשה, מפעילים את ה-CLI עבור פונקציות Cloud Run:
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
יצירת פונקציה של Cloud Functions
-
נכנסים לדף Cloud Functions במסוף Google Cloud :
- לוחצים על כתיבת פונקציה.
- מזינים שם לפונקציה, למשל
firestore-export. - בקטע Trigger בוחרים באפשרות 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" } } - בקטע Function to execute, מזינים את
scheduledFirestoreExport, שם הפונקציה ב-index.js. - לוחצים על יצירה כדי לפרוס את הפונקציה של Cloud Functions.
יצירת משימה ב-Cloud Scheduler
בשלב הבא, יוצרים משימה ב-Cloud Scheduler שמפעילה את הפונקציה של Cloud Functions:
-
נכנסים לדף Cloud Scheduler במסוף Google Cloud :
- לוחצים על יצירת משימה.
- מזינים שם למשימה, למשל
scheduledFirestoreExport. - מזינים תדירות, למשל
every 24 hours. - בוחרים אזור זמן.
- בקטע Target בוחרים באפשרות Pub/Sub. בשדה Topic, מזינים את השם של נושא ה-pub/sub שהגדרתם לצד פונקציית Cloud,
initiateFirestoreExportבדוגמה הקודמת. - בשדה Payload, מזינים
start export. העבודה דורשת מטען ייעודי (payload) מוגדר, אבל הפונקציה הקודמת של Cloud Functions לא משתמשת בפועל בערך הזה. - לוחצים על יצירה.
הגדרת הרשאות גישה
בשלב הבא, נותנים לפונקציית Cloud הרשאה להתחיל פעולות ייצוא ולכתוב לקטגוריית GCS.
פונקציית Cloud Run הזו משתמשת בחשבון שירות כדי לבצע אימות ולאשר את פעולות הייצוא שלה. חשבון השירות שבו נעשה שימוש תלוי בהגדרות של פונקציות Cloud Run:
- Cloud Functions (דור ראשון): משתמש בחשבון השירות שמוגדר כברירת מחדל ב-App Engine:
PROJECT_ID@appspot.gserviceaccount.com - פונקציות Cloud Run (דור שני): משתמשות בחשבון השירות שמוגדר כברירת מחדל ב-Compute Engine:
PROJECT_NUMBER-compute@developer.gserviceaccount.com
חשבון השירות הזה צריך הרשאה כדי להתחיל פעולת ייצוא וכדי לכתוב בקטגוריה שלכם ב-Cloud Storage. כדי לתת את ההרשאות האלה, צריך להקצות לחשבון השירות את תפקידי ה-IAM הבאים:
Cloud Datastore Import Export Admin- תפקיד
Storage Adminבקטגוריית היעד -
Cloud Run Invoker(נדרש עבור פונקציות Cloud Run (דור שני) כדי לאפשר לשירות המפעיל להפעיל את הפונקציה)
אפשר להשתמש בכלים של שורת הפקודה gcloud ו-gsutil כדי להקצות את התפקידים האלה.
אם הם עדיין לא מותקנים, אפשר לגשת לכלי האלה מ-Cloud Shell במסוף Google Cloud :
הפעלת Cloud Shell
-
מקצים את התפקיד Cloud Datastore Import Export Admin. מחליפים את 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 -
מקצים את התפקיד Storage Admin בקטגוריה. מחליפים את SERVICE_ACCOUNT ואת BUCKET_NAME, ומריצים את הפקודה הבאה:
gsutil iam ch serviceAccount:SERVICE_ACCOUNT:admin \ gs://BUCKET_NAME -
(לפונקציות Cloud Run (דור שני)) מקצים לחשבון השירות את התפקיד Cloud Run Invoker. מחליפים את PROJECT_ID ואת SERVICE_ACCOUNT, ומריצים את הפקודה הבאה:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:SERVICE_ACCOUNT \ --role roles/run.invoker
אם משביתים או מוחקים את חשבון השירות שמוגדר כברירת מחדל ב-App Engine, לאפליקציית App Engine לא תהיה יותר גישה למסד הנתונים של Firestore. אם השבתתם את חשבון השירות של App Engine, תוכלו להפעיל אותו מחדש. כך מפעילים חשבון שירות. אם מחקתם את חשבון השירות של App Engine ב-30 הימים האחרונים, תוכלו לשחזר אותו. מידע נוסף זמין במאמר בנושא ביטול מחיקה של חשבון שירות.
בדיקה של משימת Cloud Scheduler ושל פונקציית Cloud
אפשר לבדוק את המשימה של Cloud Scheduler בדף Cloud Scheduler במסוף Google Cloud .
נכנסים לדף Cloud Scheduler במסוף Google Cloud .
כניסה ל-Cloud Schedulerבשורה של משימת Cloud Scheduler החדשה, לוחצים על Run now (הפעלה עכשיו).
אחרי כמה שניות, העבודה ב-Cloud Scheduler אמורה לעדכן את העמודה Result לערך Success ואת העמודה Last run לזמן הנוכחי. יכול להיות שתצטרכו ללחוץ על רענון.
בדף Cloud Scheduler מוצג רק אישור לכך שהמשימה קראה לפונקציה של Cloud Functions. פותחים את הדף Cloud Function כדי לראות את היומנים של הפונקציה.
צפייה ביומנים של Cloud Functions
כדי לבדוק אם הפונקציה של Cloud Functions התחילה בהצלחה פעולת ייצוא, פותחים את היומנים של הפונקציה:
מסוף Firebase
במסוף Firebase, עוברים אל Hosting & Serverless (אירוח ושרתים וירטואליים) > Functions (פונקציות).
קונסולת GCP
נכנסים לדף Cloud Run functions במסוף Google Cloud .
צפייה בהתקדמות הייצוא
אפשר להשתמש בפקודה gcloud firestore operations list כדי לראות את ההתקדמות של פעולות הייצוא. מידע נוסף זמין במאמר בנושא ניהול פעולות ייצוא וייבוא.
אחרי שפעולת הייצוא מסתיימת, אפשר לראות את קובצי הפלט בקטגוריה של Cloud Storage: