安排數據導出

本頁面介紹如何安排 Cloud Firestore 資料的匯出。要按計劃運行導出,我們建議使用 Cloud Functions 和 Cloud Scheduler。

在你開始之前

在規劃託管資料匯出之前,您必須完成以下任務:

  1. 為您的 Google Cloud 專案啟用結算功能。只有啟用了結算功能的 Google Cloud 專案才能使用匯出和匯入功能。
  2. 匯出操作需要目標 Cloud Storage 儲存桶。在Cloud Firestore 資料庫位置附近的位置建立 Cloud Storage 儲存桶。您不能使用請求者付款儲存桶進行匯出操作。

建立 Cloud Function 和 Cloud Scheduler 作業

請依照下列步驟建立一個 Node.js 雲端函數,該函數啟動 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
GCP 控制台
建立雲函數
  1. 前往 GCP Console 中的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替換為您的儲存桶的名稱。
    • 修改collectionIds: []以僅匯出指定的集合組。保持原樣以導出所有集合。

  7. package.json下,新增以下相依性:
    {
      "dependencies": {
        "@google-cloud/firestore": "^1.3.0"
      }
    }
  8. 要執行的函數下,輸入scheduledFirestoreExportindex.js中函數的名稱)。
  9. 按一下「建立」 ,部署雲端函數。
建立雲端排程器作業

接下來,建立一個呼叫您的雲端函數的 Cloud Scheduler 作業:

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

    進入雲端調度

  2. 點選建立作業
  3. 輸入作業的名稱,例如scheduledFirestoreExport
  4. 輸入頻率,例如every 24 hours
  5. 選擇時區
  6. Tar​​get下,選擇Pub/Sub 。在「主題」欄位中,輸入您與雲端函數一起定義的發布/訂閱主題的名稱,在上面的範例中為initiateFirestoreExport
  7. 有效負載欄位中,輸入start export 。這份作業需要定義一個有效負載,但上面的雲端功能其實並沒有使用該值。
  8. 單擊創建
此時,您已經部署了 Cloud Function 和 Cloud Scheduler 作業,但您的 Cloud Function 仍需要存取權限才能執行匯出操作。

配置存取權限

接下來,授予 Cloud Function 權限以啟動匯出操作並寫入您的 GCS 儲存桶。

此雲端函數使用您專案的預設服務帳戶來驗證和授權其匯出操作。建立專案時,系統會為您建立一個預設服務帳戶,名稱如下:

PROJECT_ID@appspot.gserviceaccount.com

此服務帳號需要取得啟動匯出操作以及寫入您的 Cloud Storage 儲存分割區的權限。若要授予這些權限,請將下列 IAM 角色指派給預設服務帳戶:

  • Cloud Datastore Import Export Admin
  • 儲存桶的OwnerStorage Admin角色

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

如果尚未安裝,您可以從 Google Cloud Platform Console 中的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 Function

您可以在 Google Cloud Platform Console 的Cloud Scheduler頁面中測試您的 Cloud Scheduler 作業。

  1. 前往 GCP Console 中的Cloud Scheduler頁面。
    進入雲端調度

  2. 在新的 Cloud Scheduler 作業所在的行中,按一下「立即執行」

    幾秒鐘後,Cloud Scheduler 作業應將結果欄位更新為Success ,並將Last run 更新為目前時間。您可能需要按一下“刷新”

Cloud Scheduler 頁面僅確認作業呼叫了您的 Cloud Function。打開雲函數頁面即可查看函數日誌。

查看雲函數日誌

若要查看雲端函數是否成功啟動匯出操作,請開啟函數的日誌:

Firebase 控制台

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

轉到功能日誌

GCP 控制台

前往 GCP Console 中的Cloud Functions頁面。

轉到日誌檢視器

查看匯出進度

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

匯出操作完成後,您可以在 Cloud Storage 儲存桶中查看輸出檔:

開啟雲端儲存瀏覽器