本頁說明如何使用匯入和匯出代管功能,將 Cloud Firestore 資料從一個專案移至另一個專案。這項功能可用於設定開發環境,或將應用程式永久遷移至其他專案。本頁面的範例示範如何從來源專案匯出資料,然後將該資料匯入目的地專案。在專案之間移動資料的步驟如下:
- 建立 Cloud Storage 值區,用來存放來源專案的資料。
- 將來源專案的資料匯出至值區。
- 授予目的地專案從值區讀取的權限。
- 將 bucket 中的資料匯入目的地專案。
事前準備
您必須先完成下列步驟,才能使用匯出與匯入代管服務:
- 為來源專案和目的地專案啟用計費功能。只有啟用計費功能的 Google Cloud 專案才能使用匯出與匯入功能。
-
請確認您的帳戶在來源專案和目的地專案中,都具備必要的 Cloud IAM 權限。如果您是這兩個專案的擁有者,您的帳戶必須擁有必要權限。否則,下列 Cloud IAM 角色會授予 Cloud Firestore 匯出和匯入作業的必要權限:
Owner
、Cloud Datastore Owner
或Cloud Datastore Import Export Admin
專案擁有者可以按照授予存取權一節的步驟,授予其中一個角色權限。
-
設定
gcloud
指令列工具,並透過下列其中一種方式連線至專案:-
使用 Cloud Shell 從 Google Cloud 控制台存取
gcloud
。確保將
gcloud
設定為正確的專案:gcloud config set project [SOURCE_PROJECT_ID]
-
-
在新專案中設定索引。來源和目的地專案的複合索引應相符。請先設定索引,避免多次處理每份文件。
從來源專案匯出資料
建立 Cloud Storage bucket 來存放匯出檔案,然後啟動匯出作業,即可匯出資料。Cloud Firestore
建立 Cloud Storage bucket
在與Cloud Firestore資料庫相同的位置,建立 Cloud Storage 值區。如要查看資料庫位置,請參閱專案位置設定。 匯出與匯入作業不適用於要求者付費值區。
如果 Cloud Storage 值區不在來源專案中,您必須授予來源專案的預設服務帳戶存取該值區的權限。每個 Google Cloud 專案都會自動建立名為 PROJECT_ID@appspot.gserviceaccount.com
的預設服務帳戶。Cloud Firestore
匯出作業會使用這個預設服務帳戶授權 Cloud Storage
bucket 作業。如要授予預設服務帳戶來源 bucket 的存取權,請將 Storage Admin
角色授予該帳戶。
您可以使用 Cloud Shell 中的 gsutil
工具授予這個角色:
gsutil iam ch serviceAccount:[service-PROJECT_NUMBER]@gcp-sa-firestore.iam.gserviceaccount.com :roles/storage.admin\ gs://[BUCKET_NAME]@
您也可以在 Google Cloud 控制台中授予這個角色。
停用寫入作業 (選用)
如果您在執行匯出作業時,應用程式持續寫入資料庫,匯出檔案可能不會擷取所有寫入內容。如要從一致的狀態匯出資料,請更新安全規則並停止所有 Admin SDK 作業,藉此停用資料庫的寫入作業。
更新安全性規則
在主控台的「規則」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 } }
停止透過 Admin SDK 寫入資料
安全性規則不會停止來自特權伺服器環境的寫入作業,這些環境是使用 Firebase Admin SDK 或 Google Cloud Server Client Library 建立。請務必停止管理伺服器的寫入作業,方法是關閉或更新伺服器。
開始匯出作業
使用 gcloud firestore export
指令從來源專案匯出資料。您可以匯出所有資料,或只匯出特定集合。將 [SOURCE_BUCKET]
替換為您的Cloud Storage bucket 名稱:
- 匯出所有資料
-
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資料檔案。
將資料檔案移至本機 bucket
如果來源值區位置與目的地專案的 Cloud Firestore 位置不同,您必須將資料檔案移至與目的地專案位於相同位置的 Cloud Storage 值區。
按照「移動及重新命名值區」一文中的步驟,將資料檔案移至其他 Cloud Storage 值區。在後續所有步驟中,請使用這個新 bucket 做為 [SOURCE_BUCKET]
。
授予專案服務帳戶來源 bucket 的存取權
如果來源 bucket 不在目標專案中,則必須授予目標專案的預設服務帳戶來源 bucket 的存取權。預設服務帳戶名稱為 [DESTINATION_PROJECT_ID]@appspot.gserviceaccount.com
。如要授予預設服務帳戶來源 bucket 的存取權,請授予適當的 bucket 存取權。
您可以使用 Cloud Shell 中的 gsutil
工具授予必要角色:
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
指令,將來源 bucket 中的資料匯入目標專案:
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