排定資料匯出作業

本頁說明如何排定匯出作業 Cloud Firestore 資料。如要定期執行匯出作業,建議您 即可使用 Cloud Functions 和 Cloud Scheduler

事前準備

排定受管理資料匯出作業前,必須先完成下列事項:

  1. 啟用 管理 Google Cloud 專案帳單僅限 Google Cloud 但已啟用計費功能的專案可以使用匯出與匯入功能。
  2. 匯出作業需要目的地 Cloud Storage 值區。 建立 一個 Cloud Storage 值區 您的 Cloud Firestore 資料庫位置您無法使用「要求者付費」值區執行匯出 operations.

建立 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 替換為 Cloud Storage 也提供目錄同步處理功能 方便您同步處理 VM 目錄與值區
    • 修改 every 24 hours,設定匯出時間表。請擇一使用 AppEngine cron.yaml 語法 unix-cron 格式 (* * * * *)。
    • 修改 collectionIds: [],僅匯出指定的 產品素材資源集合群組。請保持原樣,匯出所有集合。

  4. 部署排定的函式:

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

    前往「Cloud Functions」頁面

  2. 按一下「建立函式」
  3. 請輸入函式名稱,例如 firestoreExport
  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) => {
      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 替換為 Cloud Storage 也提供目錄同步處理功能 方便您同步處理 VM 目錄與值區
    • 修改 collectionIds: [],僅匯出指定的 產品素材資源集合群組。請保持原樣,匯出所有集合。

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

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

  1. 前往 GCP Console 中的「Cloud Scheduler」頁面:

    前往 Cloud Scheduler

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

設定存取權限

接下來,請授予 Cloud 函式權限以開始匯出 以及寫入您的 GCS 值區。

這個 Cloud 函式會使用專案的預設服務帳戶 驗證並授權其匯出作業建立專案時 您建立的預設服務帳戶會使用以下名稱:

PROJECT_ID@appspot.gserviceaccount.com

這個服務帳戶必須具備權限,才能開始匯出 以及寫入您的 Cloud Storage 值區。如要授予這些權限,請將下列身分與存取權管理角色指派給預設服務帳戶:

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

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

如果尚未安裝,您可以存取 Google Cloud Platform 控制台中的 Cloud Shell 工具:
啟動 Cloud Shell

  1. 指派 Cloud Datastore Import Export Admin 角色。將 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 函式

如要測試 Cloud Scheduler 工作,請前往下列網址的 Cloud Scheduler 頁面: Google Cloud Platform 控制台

  1. 前往 GCP 主控台的「Cloud Scheduler」頁面。
    前往 Cloud Scheduler

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

    幾秒後,Cloud Scheduler 工作應更新結果 欄中的「成功」和「上次執行」欄,移至目前時間。您可能需要 按一下「Refresh」(重新整理)

Cloud Scheduler 頁面只會確認該工作稱為 Cloud 函式。開啟 Cloud 函式頁面即可查看函式記錄檔。

查看 Cloud 函式記錄檔

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

Firebase 主控台

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

前往函式記錄檔頁面

GCP 控制台

前往 GCP 主控台的「Cloud Functions」頁面。

前往記錄檢視器

查看匯出進度

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

匯出作業完成後,即可在 Cloud Storage 值區:

開啟 Cloud Storage 瀏覽器