排定資料匯出作業

本頁面說明如何排定匯出 Cloud Firestore 資料的時間。如要依時程執行匯出作業,建議您使用 Cloud FunctionsCloud Scheduler

事前準備

您必須先完成下列工作,才能排程代管資料匯出作業:

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

建立 Cloud 函式和 Cloud Scheduler 工作

請按照下列步驟建立 Node.js Cloud 函式,以便啟動 Cloud Firestore 資料匯出作業和 Cloud Scheduler 工作,以便呼叫該函式:

Firebase CLI
  1. 安裝 Firebase CLI。在新的目錄中,為 Cloud Functions 初始化 CLI:

    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 替換為您的值區名稱。
    • 修改 every 24 hours 即可設定匯出時間表。請使用 AppEngine cron.yaml 語法 Unix-Cron 格式 (* * * * *)。
    • 修改 collectionIds: [],只匯出指定的集合群組。維持原樣,即可匯出所有珍藏內容。

  4. 部署排程函式:

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

    前往「Cloud Functions」頁面

  2. 按一下「Create Function」
  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 替換為您的值區名稱。
    • 修改 collectionIds: [],只匯出指定的集合群組。維持原樣,即可匯出所有珍藏內容。

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

接下來,請建立呼叫 Cloud 函式的 Cloud Scheduler 工作:

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

    前往 Cloud Scheduler

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

設定存取權限

接著,授予 Cloud Function 權限,以便啟動匯出作業,並寫入 GCS 值區。

這個 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. 指派值區的儲存空間管理員角色。替換 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 函式

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

  1. 前往 Google Cloud 控制台的 Cloud Scheduler 頁面。
    前往 Cloud Scheduler

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

    幾秒後,Cloud Scheduler 工作應會將結果欄更新為「Success」,並將「Last run」更新為目前的時間。您可能需要按一下「重新整理」

Cloud Scheduler 頁面只會確認工作是否呼叫 Cloud Function。開啟 Cloud Functions 頁面,查看函式的記錄。

查看 Cloud Functions 記錄檔

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

Firebase 主控台

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

前往「Function Logs」

GCP 控制台

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

前往「記錄檢視器」

查看匯出進度

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

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

開啟 Cloud Storage 瀏覽器