หน้านี้อธิบายวิธีตั้งเวลาการส่งออกข้อมูล Cloud Firestore เราขอแนะนำให้ใช้ Cloud Functions และ Cloud Scheduler เพื่อเรียกใช้การส่งออกตามกำหนดเวลา
ก่อนเริ่มต้น
ก่อนตั้งเวลาการส่งออกข้อมูลที่มีการจัดการ คุณต้องทำตามงานต่อไปนี้ให้เสร็จสมบูรณ์
- เปิดใช้ การเรียกเก็บเงินสำหรับโปรเจ็กต์Google Cloud เฉพาะ Google Cloud โปรเจ็กต์ที่เปิดใช้การเรียกเก็บเงินแล้วเท่านั้นจึงจะใช้ฟีเจอร์การส่งออกและนำเข้าได้
- การดำเนินการส่งออกต้องมี Bucket เป็นปลายทางCloud Storage สร้าง Bucket ในตำแหน่งที่ตั้งใกล้กับ ตำแหน่งที่ตั้งของฐานข้อมูลCloud StorageCloud Firestore คุณใช้ Bucket แบบ "ผู้ขอเป็นผู้จ่าย" สำหรับการดำเนินการส่งออก ไม่ได้
สร้าง Cloud Function และงาน Cloud Scheduler
ทำตามขั้นตอนต่อไปนี้เพื่อสร้าง Cloud Function ของ Node.js ที่ เริ่มการส่งออกข้อมูล 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ด้วยรหัสโปรเจ็กต์ - แก้ไข
every 24 hoursเพื่อตั้งเวลาการส่งออก ใช้ไวยากรณ์ AppEngine cron.yaml หรือรูปแบบ unix-cron (* * * * *) -
แก้ไข
collectionIds: []เพื่อส่งออกเฉพาะกลุ่มคอลเล็กชันที่ระบุ ปล่อยไว้ตามเดิมเพื่อส่งออกกลุ่มคอลเล็กชันทั้งหมด
- แทนที่
-
ทำให้ฟังก์ชันที่กำหนดเวลาไว้ใช้งานได้โดยทำดังนี้
firebase deploy --only functions
คอนโซล Google Cloud
สร้าง Cloud Function
-
ไปที่หน้า Cloud Functions ในคอนโซล Google Cloud
- คลิก Write a function
- ป้อนชื่อฟังก์ชัน เช่น
firestore-export - ในส่วนทริกเกอร์ ให้เลือก Cloud Pub/Sub
- ในส่วนหัวข้อ ให้เลือกสร้างหัวข้อใหม่ ป้อนชื่อหัวข้อ Pub/Sub เช่น
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) => { // Access the GCLOUD_PROJECT environment variable set by the runtime. const projectId = process.env.GOOGLE_CLOUD_PROJECT || process.env.GCLOUD_PROJECT; // Use the DATABASE_ID environment variable if set, // otherwise default to '(default)' const databaseId = process.env.DATABASE_ID || '(default)'; const databaseName = client.databasePath( projectId, databaseId ); 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ด้วยชื่อ Bucket -
แก้ไข
collectionIds: []เพื่อส่งออกเฉพาะกลุ่มคอลเล็กชันที่ระบุ ปล่อยไว้ตามเดิมเพื่อส่งออกกลุ่มคอลเล็กชันทั้งหมด -
(ไม่บังคับ) หากคุณใช้ฐานข้อมูลที่ไม่ใช่ฐานข้อมูลเริ่มต้น ให้ตรวจสอบว่าได้ตั้งค่า ตัวแปรสภาพแวดล้อม
DATABASE_IDเมื่อสร้าง Cloud Function หากคุณใช้รันไทม์ที่ไม่ได้ตั้งค่าGOOGLE_CLOUD_PROJECTโดยอัตโนมัติ คุณ อาจต้องตั้งค่าด้วยตนเองหรือแทนที่ด้วยรหัสโปรเจ็กต์ ในโค้ด
- แทนที่
- เพิ่มทรัพยากร Dependency ต่อไปนี้ในส่วน
package.json{ "dependencies": { "@google-cloud/firestore": "^1.3.0" } } - ในส่วนฟังก์ชันที่จะดำเนินการ ให้ป้อน
scheduledFirestoreExportซึ่งเป็น ชื่อฟังก์ชันในindex.js - คลิกสร้าง เพื่อทำให้ Cloud Function ใช้งานได้
สร้างงาน Cloud Scheduler
จากนั้นสร้างงาน Cloud Scheduler ที่เรียก Cloud Function โดยทำดังนี้
-
ไปที่หน้า Cloud Scheduler ในคอนโซล Google Cloud
- คลิกสร้างงาน
- ป้อนชื่อ งาน เช่น
scheduledFirestoreExport - ป้อนความถี่ เช่น
every 24 hours - เลือกเขตเวลา
- ในส่วนเป้าหมาย ให้เลือก Pub/Sub ในช่องหัวข้อ ให้ป้อนชื่อหัวข้อ Pub/Sub ที่คุณกำหนดไว้ข้าง Cloud Function ซึ่งในตัวอย่างก่อนหน้าคือ
initiateFirestoreExport - ป้อน
start exportในช่องเพย์โหลด งานต้องมีเพย์โหลดที่กำหนดไว้ แต่ Cloud Function ก่อนหน้า ไม่ได้ใช้ค่านี้ - คลิกสร้าง
กำหนดค่าสิทธิ์เข้าถึง
จากนั้นให้สิทธิ์ Cloud Function ในการเริ่มการดำเนินการส่งออกและเขียนไปยัง Bucket ของ GCS
ฟังก์ชัน Cloud Run นี้ใช้บัญชีบริการเพื่อตรวจสอบสิทธิ์และ ให้สิทธิ์การดำเนินการส่งออก บัญชีบริการที่ใช้จะขึ้นอยู่กับการกำหนดค่า Cloud Functions ดังนี้
- Cloud Functions (รุ่นที่ 1): ใช้บัญชีบริการApp Engineเริ่มต้น
ซึ่งคือ
PROJECT_ID@appspot.gserviceaccount.com - Cloud Functions (รุ่นที่ 2): ใช้บัญชีบริการCompute Engine
เริ่มต้น:
PROJECT_NUMBER-compute@developer.gserviceaccount.com
บัญชีบริการนี้ต้องมีสิทธิ์เริ่มการดำเนินการส่งออก และเขียนไปยัง Bucket ของคุณ Cloud Storage หากต้องการให้สิทธิ์เหล่านี้ ให้มอบหมายบทบาท IAM ต่อไปนี้ให้กับบัญชีบริการ
Cloud Datastore Import Export Admin- บทบาท
Storage Adminใน Bucket Cloud Run Invoker(จำเป็นสำหรับ Cloud Functions (รุ่นที่ 2) เพื่ออนุญาตให้บริการทริกเกอร์เรียกใช้ ฟังก์ชัน)
คุณสามารถใช้เครื่องมือบรรทัดคำสั่ง gcloud และ gsutil เพื่อมอบหมายบทบาทเหล่านี้
หากยังไม่ได้ติดตั้ง คุณสามารถเข้าถึงเครื่องมือเหล่านี้ได้จาก Cloud Shell ในคอนโซล Google Cloud:
เริ่ม Cloud Shell
-
มอบหมายบทบาท Cloud Datastore Import Export Admin แทนที่ PROJECT_ID และ SERVICE_ACCOUNT (เช่น
PROJECT_ID@appspot.gserviceaccount.comหรือPROJECT_NUMBER-compute@developer.gserviceaccount.com) แล้วเรียกใช้คำสั่งต่อไปนี้gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:SERVICE_ACCOUNT \ --role roles/datastore.importExportAdmin -
มอบหมายบทบาท Storage Admin ใน Bucket แทนที่ SERVICE_ACCOUNT และ BUCKET_NAME แล้วเรียกใช้คำสั่งต่อไปนี้
gsutil iam ch serviceAccount:SERVICE_ACCOUNT:admin \ gs://BUCKET_NAME -
(สำหรับ Cloud Functions (รุ่นที่ 2)) มอบหมายบทบาท Cloud Run Invoker ให้กับบัญชีบริการ แทนที่ PROJECT_ID และ SERVICE_ACCOUNT แล้วเรียกใช้คำสั่งต่อไปนี้
gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:SERVICE_ACCOUNT \ --role roles/run.invoker
หากคุณปิดใช้หรือลบบัญชีบริการเริ่มต้นของ App Engine แอป App Engine จะเสียสิทธิ์เข้าถึงฐานข้อมูล Cloud Firestore หากปิดใช้บัญชีบริการ App Engine คุณสามารถเปิดใช้อีกครั้งได้ โปรดดูหัวข้อการเปิดใช้บัญชีบริการ หากคุณลบบัญชีบริการ App Engine ภายใน 30 วันที่ผ่านมา คุณสามารถกู้คืนบัญชีบริการได้ โปรดดูหัวข้อ การยกเลิกการลบบัญชีบริการ
ทดสอบงาน Cloud Scheduler และ Cloud Function
คุณสามารถทดสอบงาน Cloud Scheduler ได้ในหน้า Cloud Scheduler ของ คอนโซล Google Cloud
ไปที่หน้า Cloud Scheduler ในคอนโซล Google Cloud
ไปที่ Cloud Schedulerในแถวของงาน Cloud Scheduler ใหม่ ให้คลิ1}เรียกใช้ตอนนี้
หลังจากผ่านไป 2-3 วินาที งาน Cloud Scheduler ควรจะอัปเดตคอลัมน์ผลลัพธ์ เป็น สำเร็จ และ เรียกใช้ล่าสุด เป็นเวลาปัจจุบัน คุณอาจต้องคลิกรีเฟรช
หน้า Cloud Scheduler จะยืนยันว่างานได้เรียก Cloud Function แล้วเท่านั้น เปิดหน้า Cloud Function เพื่อดูบันทึกของฟังก์ชัน
ดูบันทึกของ Cloud Function
หากต้องการดูว่า Cloud Function เริ่มการดำเนินการส่งออกสำเร็จหรือไม่ ให้เปิดบันทึกของฟังก์ชันโดยทำดังนี้
คอนโซล Firebase
ในคอนโซล Firebase ให้ไปที่ Hosting & Serverless > Functions
คอนโซล GCP
ไปที่หน้า Cloud Functions ในคอนโซล Google Cloud
ดูความคืบหน้าในการส่งออก
คุณสามารถใช้คำสั่ง gcloud firestore operations list เพื่อดู
ความคืบหน้าของการดำเนินการส่งออก โปรดดู
หัวข้อการจัดการการดำเนินการส่งออกและนำเข้า
หลังจากที่การดำเนินการส่งออกเสร็จสมบูรณ์แล้ว คุณจะดูไฟล์เอาต์พุตได้ใน Cloud Storage Bucket โดยทำดังนี้