排定資料匯出作業

本頁面說明如何排定匯出 Cloud Firestore 資料的排程。如要排定匯出時程,建議使用 Cloud FunctionsCloud Scheduler

事前準備

排定代管資料匯出作業前,請先完成下列工作:

  1. Google Cloud 專案啟用計費功能。只有啟用計費服務的專案才能使用匯出及匯入功能。Google Cloud
  2. 匯出作業需要 Cloud Storage 值區做為目的地。 在靠近資料庫位置的位置建立 Cloud Storage 值區Cloud Firestore匯出作業不適用於要求者付費值區。

建立 Cloud 函式和 Cloud Scheduler 工作

請按照下列步驟建立 Node.js Cloud 函式,以啟動 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 替換為您的 bucket 名稱。
    • 修改 every 24 hours 即可設定匯出時間表。使用 App Engine cron.yaml 語法 unix-cron 格式 (* * * * *)。
    • 修改 collectionIds: [],只匯出指定的集合群組。如要匯出所有集合,請維持原狀。

  4. 部署排定時間執行的函式:

    firebase deploy --only functions
Google Cloud 控制台
建立 Cloud 函式
  1. 前往 Google Cloud 控制台的「Cloud Functions」頁面:

    前往「Cloud Functions」頁面

  2. 按一下「建立函式」
  3. 輸入函式名稱,例如 firestoreExport
  4. 在「Trigger」(觸發條件)下方,選取「Cloud Pub/Sub」
  5. 在「主題」下方,選取「建立新主題」。輸入 Pub/Sub 主題的名稱,例如 initiateFirestoreExport。請記下主題名稱,因為您需要這個名稱才能建立 Cloud Scheduler 工作。
  6. 在「Source code」(原始碼) 下,選取「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) => {
      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 替換為您的 bucket 名稱。
    • 修改 collectionIds: [],只匯出指定的集合群組。如要匯出所有集合,請維持原狀。

  7. package.json 下方新增下列依附元件:
    {
      "dependencies": {
        "@google-cloud/firestore": "^1.3.0"
      }
    }
  8. 在「Function to execute」(要執行的函式) 底下,輸入 scheduledFirestoreExport,也就是 index.js 中的函式名稱。
  9. 按一下「建立」,部署 Cloud 函式。
建立 Cloud Scheduler 工作

接著,建立呼叫 Cloud Function 的 Cloud Scheduler 工作:

  1. 前往 Google Cloud 控制台的「Cloud Scheduler」頁面:

    前往 Cloud Scheduler

  2. 按一下 [Create Job] (建立工作)
  3. 輸入工作「名稱」,例如 scheduledFirestoreExport
  4. 輸入「頻率」,例如 every 24 hours
  5. 選取「時區」
  6. 在「目標」下方,選取「Pub/Sub」。在「Topic」(主題) 欄位中,輸入您在 Cloud Function 旁定義的 Pub/Sub 主題名稱,如上例中的 initiateFirestoreExport
  7. 在「Payload」(酬載) 欄位中輸入 start export。 這項作業需要定義酬載,但上述 Cloud 函式實際上並未使用這個值。
  8. 點選「建立」
此時您已部署 Cloud Function 和 Cloud Scheduler 作業,但 Cloud Function 仍需存取權限才能執行 匯出作業。

設定存取權限

接著,授予 Cloud Function 啟動匯出作業和寫入 GCS bucket 的權限。

這項 Cloud Function 會使用專案的預設服務帳戶進行驗證,並授權匯出作業。建立專案時,系統會為您建立預設服務帳戶,名稱如下:

PROJECT_ID@appspot.gserviceaccount.com

這個服務帳戶需要權限才能啟動匯出作業,以及寫入 Cloud Storage 值區。如要授予這些權限,請將下列身分與存取權管理角色指派給預設服務帳戶:

  • Cloud Datastore Import Export Admin
  • 值區的 OwnerStorage Admin 角色

您可以使用 gcloudgsutil 指令列工具指派這些角色。

如果尚未安裝,您可以在 Google Cloud 控制台中,透過 Cloud Shell 存取這些工具:
啟動 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 管理員」角色。取代 PROJECT_IDBUCKET_NAME,然後執行下列 指令:

    gsutil iam ch serviceAccount:PROJECT_ID@appspot.gserviceaccount.com:admin \
        gs://BUCKET_NAME

如果停用或刪除App Engine預設服務帳戶,App Engine應用程式將無法存取 Cloud Firestore 資料庫。如果停用了App Engine服務帳戶,可以重新啟用,請參閱啟用服務帳戶。如果您在過去 30 天內刪除了 App Engine 服務帳戶,可以還原該帳戶,請參閱取消刪除服務帳戶

測試 Cloud Scheduler 作業和 Cloud Function

您可以在 Google Cloud 控制台的「Cloud SchedulerCloud Scheduler頁面中測試工作。

  1. 前往 Google Cloud 控制台��「Cloud Scheduler」頁面。
    前往 Cloud Scheduler

  2. 在新的 Cloud Scheduler 工作資料列中,按一下「立即執行」

    幾秒後,Cloud Scheduler 工作應會將結果欄更新為「成功」,並將「上次執行時間」更新為目前時間。你可能需要按一下「重新整理」

Cloud Scheduler 頁面只會確認作業已呼叫 Cloud Function。開啟 Cloud Functions 頁面,即可查看函式的記錄。

查看 Cloud Functions 記錄檔

如要查看 Cloud Function 是否成功啟動匯出作業,請開啟函式的記錄:

Firebase 主控台

前往 Firebase 控制台的「Cloud Functions」頁面。

前往函式記錄

GCP 控制台

前往 Google Cloud 控制台的「Cloud Functions」頁面。

前往記錄檢視器

查看匯出進度

您可以使用 gcloud firestore operations list 指令查看匯出作業的進度,請參閱管理匯出與匯入作業

匯出作業完成後,您可以在 Cloud Storage bucket 中查看輸出檔案:

開啟 Cloud Storage 瀏覽器