排定資料匯出作業

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

事前準備

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

  1. Google Cloud 專案啟用計費功能。只有啟用計費服務的專案才能使用匯出及匯入功能。Google Cloud
  2. 匯出作業需要目的地 Cloud Storage 值區。 在靠近資料庫位置的位置建立 Cloud Storage bucketCloud 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」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 名稱。
    • YOUR_PROJECT_ID 替換為您的專案 ID
    • 修改 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. 輸入函式名稱,例如 firestore-export
  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) => {
      // 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 替換為您的 bucket 名稱。
    • 修改 collectionIds: [],只匯出指定的集合群組。如要匯出所有集合群組,請保留預設設定。

    • (選用) 如果您使用非預設資料庫,請務必在建立 Cloud Function 時設定 DATABASE_ID 環境變數。如果您使用的執行階段不會自動設定 GOOGLE_CLOUD_PROJECT,您可能也需要手動設定,或在程式碼中將其替換為專案 ID。

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

接著,建立會呼叫 Cloud 函式的 Cloud Scheduler 工作:

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

    前往「Cloud Scheduler

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

設定存取權限

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

這個 Cloud Run 函式會使用服務帳戶驗證及授權匯出作業。使用的服務帳戶取決於您的Cloud Functions設定:

  • Cloud Functions (第 1 代):使用App Engine預設服務帳戶:PROJECT_ID@appspot.gserviceaccount.com
  • Cloud Functions (第 2 代):使用預設Compute Engine 服務帳戶:PROJECT_NUMBER-compute@developer.gserviceaccount.com

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

  • Cloud Datastore Import Export Admin
  • 值區的 Storage Admin 角色
  • Cloud Run Invoker (如要允許觸發服務叫用函式,Cloud Functions (第 2 代) 必須具備這項權限)

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

如果尚未安裝,您可以在 Google Cloud 控制台中,透過 Cloud Shell 存取這些工具:
啟動 Cloud Shell

  1. 指派 Cloud Datastore 匯入匯出管理員角色。將 PROJECT_IDSERVICE_ACCOUNT 替換為適當的名稱 (例如 PROJECT_ID@appspot.gserviceaccount.comPROJECT_NUMBER-compute@developer.gserviceaccount.com),然後執行下列指令:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member serviceAccount:SERVICE_ACCOUNT \
        --role roles/datastore.importExportAdmin
  2. 指派值區的「Storage 管理員」角色。取代 SERVICE_ACCOUNTBUCKET_NAME,然後執行下列指令:

    gsutil iam ch serviceAccount:SERVICE_ACCOUNT:admin \
        gs://BUCKET_NAME
  3. (適用於 Cloud Functions 第 2 代) 將「叫用者」Cloud Run角色指派給服務帳戶。取代 PROJECT_IDSERVICE_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 服務帳戶,可以重新啟用,請參閱啟用服務帳戶。如果您在過去 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 控制台中,依序前往「Hosting & Serverless」(託管與無伺服器) >「Functions」(函式)

前往函式記錄

GCP 控制台

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

前往記錄檢視器

查看匯出進度

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

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

開啟 Cloud Storage 瀏覽器