安排數據導出

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

在你開始之前

在計劃託管數據導出之前,您必須完成以下任務:

  1. 為您的 Google Cloud 項目啟用結算功能。只有啟用了結算功能的 Google Cloud 項目才能使用導出和導入功能。
  2. 導出操作需要目標 Cloud Storage 存儲分區。在您的 Cloud Firestore 數據庫位置附近的位置創建一個 Cloud Storage 存儲分區。您不能將請求者付款存儲桶用於導出操作。

創建 Cloud Function 和 Cloud Scheduler 作業

按照以下步驟創建啟動 Cloud Firestore 數據導出的 Node.js 雲函數和調用該函數的 Cloud Scheduler 作業:

Firebase 命令行界面
  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 || process.env.GCLOUD_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. Trigger下,選擇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.GCLOUD_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. Function to execute下,輸入scheduledFirestoreExport ,即index.js中函數的名稱。
  9. 單擊創建以部署雲函數。
創建 Cloud Scheduler 作業

接下來,創建一個調用 Cloud Functions 的 Cloud Scheduler 作業:

  1. 在 GCP Console 中打開Cloud Scheduler頁面:

    打開 Cloud Scheduler 頁面

  2. 單擊創建作業
  3. 輸入作業的名稱,例如scheduledFirestoreExport
  4. 輸入頻率,例如, every 24 hours
  5. 選擇一個時區
  6. Target下,選擇Pub/Sub 。在主題字段中,輸入您在雲函數旁邊定義的發布/訂閱主題的名稱,在上面的示例中initiateFirestoreExport FirestoreExport。
  7. 有效負載字段中,輸入start export 。該作業需要定義一個有效負載,但上面的雲函數實際上並沒有使用這個值。
  8. 單擊創建
此時,您已經部署了 Cloud Function 和 Cloud Scheduler 作業,但您的 Cloud Function 仍需要訪問權限才能執行導出操作。

配置訪問權限

接下來,授予 Cloud Function 開始導出操作和寫入 GCS 存儲桶的權限。

此 Cloud Function 使用您項目的默認服務帳戶對其導出操作進行身份驗證和授權。創建項目時,系統會為您創建一個默認服務帳戶,其名稱如下:

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 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. 在您的存儲桶上分配Storage Admin角色。替換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頁面。
    打開 Cloud Scheduler 頁面

  2. 在新 Cloud Scheduler 作業所在的行中,單擊立即運行

    幾秒鐘後,Cloud Scheduler 作業應將結果列更新為Success並將Last run更新為當前時間。您可能需要單擊刷新

Cloud Scheduler 頁面僅確認該作業調用了您的 Cloud Function。打開 Cloud Function 頁面以查看您的函數的日誌。

查看 Cloud Function 日誌

要查看 Cloud Function 是否成功啟動了導出操作,請打開該函數的日誌:

Firebase 控制台

在 Firebase 控制台中打開Cloud Functions頁面。

打開功能日誌頁面

GCP 控制台

在 GCP Console 中打開Cloud Functions頁面。

打開日誌查看器頁面

查看導出進度

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

導出操作完成後,您可以查看 Cloud Storage 存儲分區中的輸出文件:

打開雲存儲瀏覽器