在項目之間移動數據

本頁面介紹如何使用託管匯入和匯出功能將 Cloud Firestore 資料從一個專案移至另一個專案。這對於設定開發環境或作為將應用程式永久遷移到另一個專案的一部分非常有用。本頁上的範例示範如何從來源項目匯出數據,然後將該數據匯入目標專案。在專案之間移動資料涉及以下步驟:

  1. 建立 Cloud Storage 儲存桶來保存來源項目中的資料。
  2. 將資料從來源項目匯出到儲存桶。
  3. 授予您的目標項目從儲存桶中讀取資料的權限。
  4. 將資料從儲存桶匯入到目標專案中。

在你開始之前

在使用託管匯出和匯入服務之前,您必須完成以下任務:

  1. 為來源項目和目標項目啟用計費。只有啟用了結算功能的 Google Cloud 專案才能使用匯出和匯入功能。
  2. 確保您的帳戶在來源專案和目標專案中擁有必要的 Cloud IAM 權限。如果您是這兩個項目的專案擁有者,則您的帳戶擁有所需的權限。否則,以下 Cloud IAM 角色會授予 Cloud Firestore 匯出和匯入操作所需的權限:

    OwnerCloud Datastore OwnerCloud Datastore Import Export Admin

    專案擁有者可以按照授予存取權限中的步驟授予這些角色之一。

  3. 設定gcloud命令列工具並透過以下方式之一連接到您的專案:

  4. 在新項目中設定索引。來源項目和目標項目之間的複合索引應匹配。應先設定索引以避免多次處理每個文件。

從來源項目匯出數據

透過為 Cloud Firestore 匯出檔案建立 Cloud Storage 儲存桶並開始匯出操作來匯出資料。

建立 Cloud Storage 儲存分區

在與 Cloud Firestore 資料庫相同的位置建立 Cloud Storage 儲存分區。若要查看您的資料庫位置,請參閱您的項目位置設定。您不能使用請求者付款儲存桶進行匯出和匯入操作。

如果您的 Cloud Storage 儲存桶不在來源專案中,您必須向來源專案的預設服務帳號授予該儲存桶的存取權限。每個 Google Cloud 專案都有一個自動建立的預設服務帳號,其名稱為PROJECT_ID @appspot.gserviceaccount.com 。 Cloud Firestore 匯出作業使用此預設服務帳號來授權 Cloud Storage 儲存桶操作。若要授予預設服務帳戶存取來源儲存桶的權限,請授予其Storage Admin角色。

您可以使用 Cloud Shell 中提供的gsutil工具來授予此角色:

啟動 Cloud Shell

gsutil iam ch serviceAccount:[service-PROJECT_NUMBER]@gcp-sa-firestore.iam.gserviceaccount.com :roles/storage.admin\
gs://[BUCKET_NAME]@

您也可以在 Google Cloud 控制台中授予此角色

停用寫入操作(可選)

如果您的應用程式在執行匯出操作時繼續寫入資料庫,您可能無法在匯出檔案中擷取所有這些寫入。若要從一致狀態匯出數據,請透過更新安全性規則並停止任何 Admin SDK 操作來停用對資料庫的寫入。

  1. 更新安全規則

    在控制台的 Cloud Firestore規則標籤中,更新來源專案安全規則以拒絕所有寫入。例如:

      // Deny write access to all users under any conditions
      service cloud.firestore {
        match /databases/{database}/documents {
          match /{document=**} {
            allow write: if false;
          }
          // Reads do not affect export operations
          // Add your read rules here
        }
      }
    
  2. 停止從管理 SDK 寫入

    安全性規則不會阻止來自使用Firebase Admin SDKGoogle Cloud Server Client Library建立的特權伺服器環境的寫入。確保透過關閉或更新伺服器來停止管理伺服器的寫入操作。

開始出口操作

使用gcloud firestore export指令從來源專案匯出資料。您可以匯出所有資料或僅匯出特定集合。將[SOURCE_BUCKET]替換為您的 Cloud Storage 儲存分區的名稱:

匯出所有數據
gcloud firestore export gs://[SOURCE_BUCKET] --async
導出特定集合
gcloud firestore export gs://[SOURCE_BUCKET] --collection-ids=[COLLECTION_ID_1],[COLLECTION_ID_2] --async

記下導出操作的outputURIPrefix ,稍後您將使用它。預設情況下,Cloud Firestore 會根據時間戳記為匯出檔案新增前綴:

outputUriPrefix: gs://[SOURCE_BUCKET]/2019-03-05T20:58:23_56418

當匯出操作運行時,您可以使用firestore operations list指令來查看操作的進度:

gcloud firestore operations list

將資料匯入目標專案中

接下來,授予目標專案對 Cloud Firestore 資料檔案的存取權並開始匯入操作。

允許目標項目存取您的資料文件

在開始匯入操作之前,您必須確保目標專案可以存取您的 Cloud Firestore 資料檔案。

將資料檔案移至本機儲存桶

如果您的來源儲存桶位置與目標專案的 Cloud Firestore 位置不同,您必須將資料檔案移至與目標專案位於相同位置的 Cloud Storage 儲存桶。

按照移動和重新命名儲存桶中的步驟將資料檔案移至另一個 Cloud Storage 儲存桶。對於以下所有步驟,請使用這個新儲存桶作為[SOURCE_BUCKET]

授予專案服務帳戶存取來源儲存桶的權限

如果您的來源儲存桶不在目標項目中,則您必須向目標項目的預設服務帳戶授予對來源儲存桶的存取權限。預設服務帳戶名為[DESTINATION_PROJECT_ID] @appspot.gserviceaccount.com 。若要授予預設服務帳戶存取來源儲存體桶的權限,請授予其存取儲存桶的適當權限。

您可以使用 Cloud Shell 中提供的gsutil工具來授予必要的角色:

啟動 Cloud Shell

gsutil iam ch serviceAccount:[DESTINATION_PROJECT_ID]@appspot.gserviceaccount.com:legacyBucketReader,legacyObjectReader \
gs://[SOURCE_BUCKET]

您也可以在 Google Cloud 控制台中授予此角色

開始導入操作

在開始匯入操作之前,請確保為正確的專案配置了gcloud

gcloud config set project [DESTINATION_PROJECT_ID]

使用gcloud firestore import指令將來源儲存桶中的資料匯入到目標專案中:

gcloud firestore import gs://[SOURCE_BUCKET]/[EXPORT_PREFIX] --async

其中[EXPORT_PREFIX]與匯出操作的outputUriPrefix中的前綴相符。例如:

gcloud firestore import gs://[SOURCE_BUCKET]/2019-03-05T20:58:23_56418 --async

當匯出操作運行時,您可以使用firestore operations list指令來查看操作的進度:

gcloud firestore operations list