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

בדף הזה מוסבר איך לתזמן ייצוא של נתוני 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. מתקינים את 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 כדי להגדיר את לוח הזמנים של הייצוא. משתמשים ב תחביר cron.yaml של AppEngine או ב פורמט unix-cron ‏ (* * * * *).
    • משנים את collectionIds: [] כדי לייצא רק את קבוצות האוספים שצוינו. כדי לייצא את כל קבוצות האוספים, משאירים את השדה כמו שהוא.

  4. פורסים את הפונקציה המתוזמנת:

    firebase deploy --only functions
מסוף Google Cloud
יצירת פונקציה של Cloud Functions
  1. נכנסים לדף Cloud Functions במסוף Google Cloud:

    כניסה לדף Cloud Functions

  2. לוחצים על כתיבת פונקציה.
  3. מזינים שם לפונקציה, למשל firestore-export
  4. בקטע Trigger, בוחרים באפשרות Cloud Pub/Sub.
  5. בקטע נושא, בוחרים באפשרות יצירת נושא חדש. מזינים שם לנושא Pub/Sub, למשל initiateFirestoreExport. שימו לב לשם הנושא, כי תצטרכו אותו כדי ליצור את משימת Cloud Scheduler.
  6. בקטע קוד מקור, בוחרים באפשרות Inline editor. מזינים את הקוד הבא בקטע 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 Functions. אם אתם משתמשים בסביבת זמן ריצה שבה המשתנה GOOGLE_CLOUD_PROJECT לא מוגדר באופן אוטומטי, יכול להיות שתצטרכו להגדיר אותו ידנית או להחליף אותו במזהה הפרויקט בקוד.

  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 Functions, ‏initiateFirestoreExport בדוגמה הקודמת.
  7. בשדה Payload, מזינים start export. המשימה דורשת הגדרה של מטען ייעודי (payload), אבל הפונקציה הקודמת של Cloud Functions לא משתמשת בערך הזה בפועל.
  8. לוחצים על יצירה.
בשלב הזה, פרסתם את הפונקציה של Cloud Functions ואת המשימה ב-Cloud Scheduler, אבל עדיין צריך לתת לפונקציה של Cloud Functions הרשאות גישה כדי לבצע פעולות ייצוא.

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

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

  • Cloud Datastore Import Export Admin
  • התפקיד Storage Admin בקטגוריה
  • ‫Cloud Run Invoker (נדרש ל-Cloud Functions (דור שני) כדי לאפשר לשירות הטריגר להפעיל את הפונקציה)

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

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

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

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

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

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

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

צפייה ביומנים של הפונקציה של Cloud Functions

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

מסוף Firebase

במסוף Firebase, עוברים אל Hosting & Serverless (אירוח ובלי שרת) > Functions (פונקציות).

מעבר ליומני הפונקציות

קונסולת GCP

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

כניסה לדף Logs Viewer

צפייה בהתקדמות הייצוא

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

אחרי שפעולת הייצוא מסתיימת, אפשר לראות את קובצי הפלט בקטגוריית Cloud Storage:

פותחים את הדפדפן Cloud Storage.