زمان‌بندی صادر کردن داده‌ها

این صفحه نحوه زمان‌بندی صادر کردن داده‌های Cloud Firestore را شرح می‌دهد. برای اجرای صادر کردن‌ها طبق زمان‌بندی، توصیه می‌کنیم از Cloud Functions و Cloud Scheduler استفاده کنید.

قبل از شروع

قبل‌از زمان‌بندی صادر کردن داده‌های مدیریت‌شده، باید کارهای زیر را انجام دهید:

  1. صدور صورت‌حساب را برای پروژه Google Cloud فعال کنید. فقط پروژه‌های Google Cloud که صورت‌حساب برای آن‌ها فعال شده است می‌توانند از ویژگی صادر و وارد کردن استفاده کنند.
  2. عملیات صادر کردن به یک مخزن Cloud Storage مقصد نیاز دارد. یک Cloud Storage دسته در مکانی نزدیک مکان Cloud Firestore پایگاه داده‌تان ایجاد کنید. نمی‌توانید از سطل «درخواست‌کننده پرداخت می‌کند» برای عملیات صادر کردن استفاده کنید.

ایجاد کردن Cloud Function و کار Cloud Scheduler

این مراحل را دنبال کنید تا یک Node.js Cloud Function ایجاد کنید که یک صادر کردن داده Cloud Firestore و یک کار Cloud Scheduler را برای فراخوانی آن تابع آغاز می‌کند:

واسط خط فرمان Firebase
  1. واسط خط فرمان Firebase را نصب کنید. در دایرکتوری جدید، CLI را برای Cloud Functions مقداردهی اولیه کنید:

    firebase init functions --project PROJECT_ID
    1. جاوا اسکریپت را به‌عنوان زبان انتخاب کنید.
    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
ایجاد کردن تابع ابری
  1. به صفحه Cloud Functions در کنسول Google Cloud بروید:

    رفتن به Cloud Functions

  2. روی نوشتن تابع کلیک کنید
  3. نام تابع را وارد کنید، مثلاً firestore-export
  4. در بخش راه‌انداز، 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 Function تنظیم کرده‌اید. اگر از زمان اجرایی استفاده می‌کنید که GOOGLE_CLOUD_PROJECT به‌طور خودکار تنظیم نشده است، ممکن است لازم باشد آن را به‌صورت دستی تنظیم کنید یا آن را با شناسه پروژه خود در کد جایگزین کنید.

  7. در بخش package.json، وابستگی زیر را اضافه کنید:
    {
      "dependencies": {
        "@google-cloud/firestore": "^1.3.0"
      }
    }
  8. در بخش تابع برای اجرا، scheduledFirestoreExport، نام تابع در index.js را وارد کنید.
  9. برای استقرار Cloud Function، روی ایجاد کلیک کنید.
ایجاد شغل Cloud Scheduler

سپس، کار Cloud Scheduler ایجاد کنید که Cloud Function شما را فراخوانی کند:

  1. به صفحه Cloud Scheduler در کنسول Google Cloud بروید:

    رفتن به Cloud Scheduler

  2. روی ایجاد شغل کلیک کنید.
  3. نامی برای کار وارد کنید، مثلاً scheduledFirestoreExport.
  4. بسامد را وارد کنید، برای مثال every 24 hours.
  5. منطقه زمانی را انتخاب کنید.
  6. در بخش هدف، Pub/Sub را انتخاب کنید. در فیلد موضوع، نام موضوع pub/sub را که در کنار «تابع ابری» خود تعریف کرده‌اید وارد کنید، initiateFirestoreExport در مثال قبلی.
  7. در فیلد بار داده، start export را وارد کنید. این کار به محموله تعریف‌شده نیاز دارد، اما Cloud Function قبلی درواقع از این مقدار استفاده نمی‌کند.
  8. روی ایجاد کردن کلیک کنید.
در این مرحله، Cloud Function و کار Cloud Scheduler را مستقر کرده‌اید، اما Cloud Function شما همچنان برای اجرای عملیات صادر کردن به اجازه‌های دسترسی نیاز دارد.

پیکربندی اجازه‌های دسترسی

سپس، به Cloud Function اجازه دهید عملیات صادر کردن را شروع کند و در مخزن GCS شما بنویسد.

این تابع Cloud Run از حساب سرویس برای اصالت‌سنجی و مجاز کردن عملیات صادر کردن استفاده می‌کند. حساب سرویس مورداستفاده به پیکربندی 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. نقش سرپرست فضای ذخیره‌سازی را به دسته خود اختصاص دهید. 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 را در ۳۰ روز گذشته حذف کرده‌اید، می‌توانید حساب سرویس را بازیابی کنید، لغو حذف حساب سرویس را ببینید.

آزمایش کردن کار Cloud Scheduler و Cloud Function

می‌توانید کار Cloud Scheduler را در صفحه Cloud Scheduler در کنسول Google Cloud آزمایش کنید.

  1. به صفحه Cloud Scheduler در کنسول Google Cloud بروید.
    رفتن به Cloud Scheduler

  2. در ردیف مربوط به کار Cloud Scheduler جدیدتان، روی اکنون اجرا شود کلیک کنید.

    پس‌از چند ثانیه، کار Cloud Scheduler باید ستون نتیجه را به موفقیت‌آمیز و آخرین اجرا را به زمان فعلی به‌روز کند. شاید لازم باشد روی بازآوری کلیک کنید.

صفحه Cloud Scheduler فقط تأیید می‌کند که کار، Cloud Function شما را فراخوانی کرده است. صفحه Cloud Function را باز کنید تا گزارش‌های تابع خود را ببینید.

مشاهده گزارش‌های Cloud Function

برای اینکه ببینید Cloud Function عملیات صادر کردن را با موفقیت شروع کرده است یا نه، گزارش‌های تابع را باز کنید:

کنسول Firebase

در کنسول Firebase، به Hosting & Serverless > Functions بروید.

رفتن به گزارش‌های تابع

کنسول GCP

به صفحه Cloud Functions در کنسول Google Cloud بروید.

رفتن به «نمایشگر گزارش‌ها»

مشاهده پیشرفت صادر کردن

می‌توانید از فرمان gcloud firestore operations list برای مشاهده پیشرفت عملیات صادر کردن استفاده کنید، به مدیریت عملیات صادر کردن و وارد کردن مراجعه کنید.

پس‌از تکمیل عملیات صادر کردن، می‌توانید فایل‌های خروجی را در Cloud Storage bucket مشاهده کنید:

مرورگر Cloud Storage را باز کنید