תזמון של ייצוא נתונים

בדף הזה מוסבר איך לתזמן את הייצוא של נתוני Cloud Firestore. כדי להריץ פעולות ייצוא לפי לוח זמנים, מומלץ להשתמש ב-Cloud Functions וב-Cloud Scheduler.

לפני שמתחילים

לפני שמתזמנים ייצוא של נתונים מנוהלים, צריך לבצע את המשימות הבאות:

  1. מפעילים את החיוב בפרויקט Google Cloud. אפשר להשתמש בתכונות הייצוא והייבוא רק בפרויקטים של Google Cloud שהחיוב בהם מופעל.
  2. כדי לבצע פעולות ייצוא, נדרש קטגוריה Cloud Storage של יעד. יוצרים קטגוריה Cloud Storage במיקום קרוב למיקום של מסד הנתונים Cloud Firestore. אי אפשר להשתמש בקטגוריה של 'מגיש הבקשה משלם' לצורך פעולות ייצוא.

יצירת פונקציה של Cloud Functions ומשימות Cloud Scheduler

כדי ליצור פונקציית Cloud Functions ב-Node.js שמפעילה ייצוא נתונים של Cloud Firestore ומשימות Cloud Scheduler כדי לקרוא לפונקציה הזו:

Firebase CLI
  1. מתקינים את ה-CLI של 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
יצירת פונקציה של Cloud Functions
  1. נכנסים לדף Cloud Functions במסוף Google Cloud:

    כניסה לדף Cloud Functions

  2. לוחצים על Create Function (יצירת פונקציה).
  3. מזינים שם פונקציה, למשל firestoreExport
  4. בקטע Trigger בוחרים באפשרות 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. בקטע Function to execute, מזינים את הערך scheduledFirestoreExport, שהוא שם הפונקציה ב-index.js.
  9. לוחצים על Create כדי לפרוס את הפונקציה של Cloud Functions.
יצירת משימה מסוג Cloud Scheduler

בשלב הבא יוצרים משימה Cloud Scheduler שמפעילה את פונקציית Cloud:

  1. נכנסים לדף Cloud Scheduler במסוף Google Cloud:

    כניסה אל Cloud Scheduler

  2. לוחצים על Create Job.
  3. נותנים שם Name למשימה, למשל scheduledFirestoreExport.
  4. מזינים תדירות, למשל every 24 hours.
  5. בוחרים אזור זמן.
  6. בקטע Target בוחרים באפשרות Pub/Sub. בשדה Topic, מזינים את שם נושא ה-pub/sub שהגדרתם לצד Cloud Function, initiateFirestoreExport בדוגמה שלמעלה.
  7. בשדה Payload, מזינים start export. המשימה מחייבת הגדרה של מטען ייעודי, אבל בפועל הפונקציה של Cloud Functions שלמעלה לא משתמשת בערך הזה.
  8. לוחצים על יצירה.
בשלב הזה, פרסתם את Cloud Function ואת המשימה Cloud Scheduler, אבל עדיין נדרשות ל-Cloud Function הרשאות גישה כדי לבצע פעולות ייצוא.

הגדרת הרשאות גישה

בשלב הבא, נותנים ל-Cloud Function הרשאה להתחיל פעולות ייצוא ולכתוב בקטגוריה של GCS.

הפונקציה הזו ב-Cloud Functions משתמשת בחשבון השירות שמוגדר כברירת מחדל בפרויקט כדי לאמת ולאשר את פעולות הייצוא. כשיוצרים פרויקט, נוצר בשבילכם חשבון שירות שמוגדר כברירת מחדל עם השם הבא:

PROJECT_ID@appspot.gserviceaccount.com

לחשבון השירות הזה נדרשת הרשאה להתחיל פעולת ייצוא ולכתוב בקטגוריה Cloud Storage. כדי להקצות את ההרשאות האלה, מקצים לחשבון השירות שמוגדר כברירת מחדל את תפקידי ה-IAM הבאים:

  • Cloud Datastore Import Export Admin
  • התפקיד Owner או Storage Admin בקטגוריה

אפשר להקצות את התפקידים האלה באמצעות הכלים gcloud ו-gsutil בשורת הפקודה.

אם עדיין לא התקנתם את הכלים האלה, תוכלו לגשת אליהם דרך Cloud Shell במסוף Google Cloud:
הפעלת 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. מקצים את התפקיד Storage Admin בקטגוריה. מחליפים את 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 Functions

אפשר לבדוק את המשימה Cloud Scheduler בדף Cloud Scheduler במסוף Google Cloud.

  1. נכנסים לדף Cloud Scheduler במסוף Google Cloud.
    כניסה לדף Cloud Scheduler

  2. בשורה של המשימה החדשה מסוג Cloud Scheduler, לוחצים על הפעלה מיידית.

    אחרי כמה שניות, המשימה Cloud Scheduler אמורה לעדכן את עמודת התוצאה ל-Success ואת Last run לשעה הנוכחית. יכול להיות שתצטרכו ללחוץ על רענון.

בדף Cloud Scheduler מוצג רק אישור שהמשימה הפעילה את Cloud Function. פותחים את הדף של Cloud Function כדי לראות את היומנים של הפונקציה.

הצגת היומנים של Cloud Functions

כדי לבדוק אם הפונקציה של Cloud Functions השלימה פעולת ייצוא, פותחים את היומנים של הפונקציה:

מסוף Firebase

עוברים לדף Cloud Functions במסוף Firebase.

כניסה לדף Function Logs

קונסולת GCP

נכנסים לדף Cloud Functions במסוף Google Cloud.

כניסה לדף Logs Viewer

הצגת התקדמות הייצוא

אפשר להשתמש בפקודה gcloud firestore operations list כדי לראות את ההתקדמות של פעולות הייצוא. מידע נוסף זמין במאמר ניהול פעולות ייצוא וייבוא.

בסיום פעולת הייצוא, תוכלו לראות את קובצי הפלט בקטגוריה Cloud Storage:

פתיחת הדפדפן Cloud Storage