หน้านี้จะอธิบายวิธีใช้ฟีเจอร์การนําเข้าและส่งออกที่มีการจัดการเพื่อย้ายข้อมูล Cloud Firestore จากโปรเจ็กต์หนึ่งไปยังอีกโปรเจ็กต์หนึ่ง ซึ่งอาจมีประโยชน์สำหรับการตั้งค่าสภาพแวดล้อมการพัฒนา หรือเป็นส่วนหนึ่งของการย้ายข้อมูลแอปไปยังโปรเจ็กต์อื่นอย่างถาวร ตัวอย่างในหน้านี้แสดงวิธีส่งออกข้อมูลจากโปรเจ็กต์ต้นทาง แล้วนําเข้าข้อมูลนั้นไปยังโปรเจ็กต์ปลายทาง การย้ายข้อมูลระหว่างโปรเจ็กต์มีขั้นตอนดังนี้
- สร้างที่เก็บข้อมูล Cloud Storage เพื่อเก็บข้อมูลจากโปรเจ็กต์ต้นทาง
- ส่งออกข้อมูลจากโปรเจ็กต์ต้นทางไปยังที่เก็บข้อมูล
- ให้สิทธิ์โปรเจ็กต์ปลายทางในการอ่านจากที่เก็บข้อมูล
- นําเข้าข้อมูลจากที่เก็บข้อมูลไปยังโปรเจ็กต์ปลายทาง
ก่อนเริ่มต้น
คุณต้องทํางานต่อไปนี้ให้เสร็จสิ้นก่อนจึงจะใช้บริการส่งออกและนําเข้าที่มีการจัดการได้
- เปิดใช้การเรียกเก็บเงินสำหรับทั้งโปรเจ็กต์ต้นทางและโปรเจ็กต์ปลายทาง เฉพาะโปรเจ็กต์ Google Cloud ที่เปิดใช้การเรียกเก็บเงินเท่านั้นที่จะใช้ฟังก์ชันการส่งออกและนำเข้าได้
-
ตรวจสอบว่าบัญชีของคุณมีสิทธิ์ IAM ที่จำเป็นใน Cloud ในโปรเจ็กต์ต้นทางและโปรเจ็กต์ปลายทาง หากคุณเป็นเจ้าของโปรเจ็กต์ทั้ง 2 รายการ บัญชีของคุณจะมีสิทธิ์ที่จําเป็น หรือจะให้สิทธิ์ที่จำเป็นสำหรับCloud Firestoreการดำเนินการส่งออกและนำเข้าด้วยบทบาท Cloud IAM ต่อไปนี้ก็ได้
Owner
,Cloud Datastore Owner
หรือCloud Datastore Import Export Admin
เจ้าของโปรเจ็กต์สามารถมอบหมายบทบาทใดบทบาทหนึ่งเหล่านี้ได้โดยทำตามขั้นตอนในการให้สิทธิ์เข้าถึง
-
ตั้งค่าเครื่องมือบรรทัดคำสั่ง
gcloud
และเชื่อมต่อกับโปรเจ็กต์ด้วยวิธีใดวิธีหนึ่งต่อไปนี้-
เข้าถึง
gcloud
จากคอนโซล Google Cloud โดยใช้ Cloud Shellตรวจสอบว่าได้กําหนดค่า
gcloud
สําหรับโปรเจ็กต์ที่ถูกต้องแล้ว โดยทำดังนี้gcloud config set project [SOURCE_PROJECT_ID]
-
-
ตั้งค่าดัชนีในโปรเจ็กต์ใหม่ ดัชนีคอมโพสิตควรตรงกันระหว่างโปรเจ็กต์ต้นทางและปลายทาง คุณควรตั้งค่าดัชนีก่อนเพื่อหลีกเลี่ยงการประมวลผลเอกสารแต่ละรายการหลายครั้ง
ส่งออกข้อมูลจากโปรเจ็กต์ต้นทาง
ส่งออกข้อมูลโดยสร้างที่เก็บข้อมูล Cloud Storage สำหรับไฟล์การส่งออก Cloud Firestore แล้วเริ่มการดำเนินการส่งออก
สร้างที่เก็บข้อมูล Cloud Storage
สร้างที่เก็บข้อมูล Cloud Storage ในตำแหน่งเดียวกับฐานข้อมูล Cloud Firestore หากต้องการดูตำแหน่งฐานข้อมูล ให้ดูการตั้งค่าตำแหน่งโปรเจ็กต์ คุณใช้ที่เก็บข้อมูลแบบผู้ขอชำระเงินสําหรับการดำเนินการส่งออกและนําเข้าไม่ได้
หากที่เก็บข้อมูล Cloud Storage ไม่ได้อยู่ในโปรเจ็กต์ต้นทาง คุณต้องให้สิทธิ์เข้าถึงที่เก็บข้อมูลแก่บัญชีบริการเริ่มต้นของโปรเจ็กต์ต้นทาง โปรเจ็กต์ Google Cloud แต่ละโปรเจ็กต์จะมีบัญชีบริการเริ่มต้นชื่อ PROJECT_ID@appspot.gserviceaccount.com
ที่สร้างขึ้นโดยอัตโนมัติ Cloud Firestore
การดำเนินการส่งออกใช้บัญชีบริการเริ่มต้นนี้เพื่อให้สิทธิ์Cloud Storageการดำเนินการกับที่เก็บข้อมูล หากต้องการให้บัญชีบริการเริ่มต้นเข้าถึงที่เก็บข้อมูลต้นทาง ให้มอบบทบาท Storage Admin
แก่บัญชีดังกล่าว
คุณให้บทบาทนี้ได้โดยใช้เครื่องมือ 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
อัปเดตกฎความปลอดภัย
ใน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 อย่าลืมหยุดการดำเนินการเขียนจากเซิร์ฟเวอร์ผู้ดูแลระบบโดยปิดหรืออัปเดตเซิร์ฟเวอร์
เริ่มการดำเนินการส่งออก
ใช้คำสั่ง 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
หากต้องการให้บัญชีบริการเริ่มต้นเข้าถึงที่เก็บข้อมูลต้นทาง ให้มอบสิทธิ์ที่เหมาะสมแก่บัญชีบริการในการเข้าถึงที่เก็บข้อมูล
คุณสามารถมอบบทบาทที่จำเป็นได้ด้วยเครื่องมือ 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