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

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

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

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

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

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

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

Firebase CLI
  1. מתקינים את Firebase CLI. בספרייה חדשה, מפעילים את ה-CLI עבור פונקציות Cloud Run:

    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 כדי להגדיר את לוח הזמנים לייצוא. משתמשים ב תחביר AppEngine cron.yaml או ב פורמט 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. בקטע קוד מקור, בוחרים באפשרות עורך מוטבע. מזינים את הקוד הבא מתחת ל-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 לא מוגדר באופן אוטומטי, יכול להיות שתצטרכו להגדיר אותו באופן ידני או להחליף אותו במזהה הפרויקט בקוד.

  7. בקטע package.json, מוסיפים את יחסי התלות הבאים:
    {
      "dependencies": {
        "@google-cloud/firestore": "^1.3.0"
      }
    }
  8. בקטע Function to execute, מזינים את scheduledFirestoreExport, שם הפונקציה ב-index.js.
  9. לוחצים על יצירה כדי לפרוס את הפונקציה של Cloud Functions.
יצירת משימה ב-Cloud Scheduler

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

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

    כניסה ל-Cloud Scheduler

  2. לוחצים על יצירת משימה.
  3. מזינים שם למשימה, למשל scheduledFirestoreExport.
  4. מזינים תדירות, למשל every 24 hours.
  5. בוחרים אזור זמן.
  6. בקטע Target בוחרים באפשרות Pub/Sub. בשדה Topic, מזינים את השם של נושא ה-pub/sub שהגדרתם לצד פונקציית Cloud, initiateFirestoreExport בדוגמה הקודמת.
  7. בשדה Payload, מזינים start export. העבודה דורשת מטען ייעודי (payload) מוגדר, אבל הפונקציה הקודמת של Cloud Functions לא משתמשת בפועל בערך הזה.
  8. לוחצים על יצירה.
בשלב הזה, פרסתם את הפונקציה של Cloud Functions ואת המשימה של Cloud Scheduler, אבל עדיין צריך להגדיר לפונקציה של 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

  1. מקצים את התפקיד 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
  2. מקצים את התפקיד Storage Admin בקטגוריה. מחליפים את SERVICE_ACCOUNT ואת BUCKET_NAME, ומריצים את הפקודה הבאה:

    gsutil iam ch serviceAccount:SERVICE_ACCOUNT:admin \
        gs://BUCKET_NAME
  3. (לפונקציות 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 .

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

  2. בשורה של משימת 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 .

כניסה לדף Logs Viewer

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

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

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

פתיחת Cloud Storage browser