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

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

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

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

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

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

כדי ליצור פונקציית Cloud של 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 בשם הקטגוריה.
    • משנים את 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 Functions:

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

    כניסה אל Cloud Scheduler

  2. לוחצים על Create Job.
  3. נותנים שם למשימה, למשל 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 Functions הרשאה להתחיל פעולות ייצוא ולכתוב לקטגוריה שלכם ב-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, לוחצים על Run now (הפעלה).

    אחרי כמה שניות, המשימה 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