本頁面介紹如何安排匯出您的Cloud Firestore資料。如要排定匯出作業的執行時間,建議使用 Cloud Functions 和 Cloud Scheduler。
事前準備
在安排託管資料匯出之前,您必須完成以下任務:
- 為 Google Cloud 專案啟用計費功能。只有啟用計費服務的專案才能使用匯出及匯入功能。Google Cloud
- 匯出作業需要目的地 Cloud Storage 值區。 在靠近資料庫位置的區域建立 Cloud Storage 值區。Cloud Firestore匯出作業不適用於要求者付費值區。
建立 Cloud 函式和 Cloud Scheduler 工作
請按照下列步驟建立 Node.js Cloud 函式,啟動 Cloud Firestore 資料匯出作業和 Cloud Scheduler 工作,以呼叫該函式:
Firebase CLI
-
安裝 Firebase CLI。 在新目錄中,初始化 CLI 以進行 Cloud Functions:
firebase init functions --project PROJECT_ID
- 選取「JavaScript」做為語言。
- 視需要啟用 ESLint。
- 輸入
y安裝依附元件。
-
將
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'); }); });
-
在上面的程式碼中,修改以下內容:
- 將
BUCKET_NAME替換為您的 bucket 名稱。 - 請將
YOUR_PROJECT_ID替換為您的項目 ID - 修改
every 24 hours以設定導出計劃。 使用 AppEngine cron.yaml 語法 或 unix-cron 格式 (* * * * *)。 -
修改
collectionIds: [],只匯出指定的集合群組。保持原樣導出所有集合組。
- 將
-
部署計劃功能:
firebase deploy --only functions
Google Cloud 控制台
建立雲函數
-
前往 Google Cloud 控制台中的 Cloud Functions 頁面:
- 點選 編寫函數
- 輸入函數名稱,例如
firestore-export - 在 觸發器 下,選擇 雲端發布/訂閱
- 在「主題」下方,選取「建立新主題」。輸入發布/訂閱主題的名稱,例如
initiateFirestoreExport。請記下主題名稱,因為您需要這個名稱才能建立 Cloud Scheduler 工作。 - 在 原始碼 下,選擇 內嵌編輯器。在
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( YOUR_PROJECT_ID, '(default)' ); return client .exportDocuments({ name: databaseName, outputUriPrefix: bucket, // Leave collectionIds empty to export all collection groups // or define a list of collection group 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: [],只匯出指定的集合群組。如要匯出所有集合群組,請保留預設設定。
- 將
- 在
package.json下,新增以下相依性:{ "dependencies": { "@google-cloud/firestore": "^1.3.0" } } - 在 要執行的函數 下,輸入
scheduledFirestoreExport,在index.js中輸入函數名稱。 - 按一下「建立」,部署 Cloud Function。
建立一份 Cloud Scheduler 工作
接下來,建立一個呼叫您的雲函數的 Cloud Scheduler 作業:
-
前往 Google Cloud 控制台中的 Cloud Scheduler 頁面:
- 按一下 [Create Job] (建立工作)。
- 輸入工作「名稱」,例如
scheduledFirestoreExport。 - 輸入 頻率,例如,
every 24 hours。 - 選取一個時區。
- 在 Target 下,選擇 Pub/Sub。在「主題」欄位中,輸入您與 Cloud Function 一併定義的 Pub/Sub 主題名稱,如上例中的
initiateFirestoreExport。 - 在 有效載荷 欄位中,輸入
start export。 這份作業需要定義有效負載,但上面的雲端函數實際上並沒有使用此值。 - 點選「建立」。
設定存取權限
接下來,授予雲端函數啟動匯出操作並寫入您的 GCS 儲存桶的權限。
這項 Cloud Function 會使用專案的預設服務帳戶,驗證及授權匯出作業。建立專案時,系統會為您建立預設服務帳戶,名稱如下:
PROJECT_ID@appspot.gserviceaccount.com
服務帳戶需要權限才能啟動匯出作業,以及寫入 Cloud Storage 值區。如要授予這些權限,請將下列身分與存取權管理角色指派給預設服務帳戶:
Cloud Datastore Import Export Admin-
桶上的
Owner或Storage Admin角色
您可以使用 gcloud 和 gsutil 指令列工具指派這些角色。
如果尚未安裝,您可以在 Google Cloud 控制台中,透過 Cloud Shell 存取這些工具:
啟動 Cloud Shell
-
指派 Cloud Datastore 匯入匯出管理員角色。取代 PROJECT_ID,然後執行下列指令:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:PROJECT_ID@appspot.gserviceaccount.com \ --role roles/datastore.importExportAdmin
-
指派值區的「Storage 管理員」角色。取代 PROJECT_ID 和 BUCKET_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 控制台的「Cloud Scheduler」Cloud Scheduler頁面中測試工作。
前往 Google Cloud 控制台的「Cloud Scheduler」頁面。
前往 Cloud Scheduler在新的 Cloud Scheduler 工作資料列中,按一下「立即執行」。
幾秒鐘後,Cloud Scheduler 作業應將結果欄位更新為 成功,並將 上次執行 更新為目前時間。您可能需要點擊刷新。
Cloud Scheduler 頁面僅確認作業已呼叫您的雲端函數。打開雲函數頁面以查看函數日誌。
查看 Cloud Functions 記錄檔
若要查看雲端函數是否成功啟動匯出操作,請開啟函數的日誌:
Firebase 主控台
前往 Firebase 控制台中的 Cloud Functions 頁面。
GCP 控制台
前往 Google Cloud 控制台中的 Cloud Functions 頁面。
查看匯出進度
您可以使用 gcloud firestore operations list 指令查看匯出操作的進度,請參閱 管理匯出和匯入操作。
匯出操作完成後,您可以在 Cloud Storage 儲存桶中查看輸出檔案: