ย้ายข้อมูลระหว่างโปรเจ็กต์

หน้านี้จะอธิบายวิธีใช้ฟีเจอร์การนําเข้าและส่งออกที่มีการจัดการเพื่อย้ายข้อมูล Cloud Firestore จากโปรเจ็กต์หนึ่งไปยังอีกโปรเจ็กต์หนึ่ง ซึ่งอาจมีประโยชน์สำหรับการตั้งค่าสภาพแวดล้อมการพัฒนา หรือเป็นส่วนหนึ่งของการย้ายข้อมูลแอปไปยังโปรเจ็กต์อื่นอย่างถาวร ตัวอย่างในหน้านี้แสดงวิธีส่งออกข้อมูลจากโปรเจ็กต์ต้นทาง แล้วนำเข้าข้อมูลดังกล่าวไปยังโปรเจ็กต์ปลายทาง การย้ายข้อมูลระหว่างโปรเจ็กต์มีขั้นตอนดังนี้

  1. สร้างที่เก็บข้อมูล Cloud Storage เพื่อเก็บข้อมูลจากโปรเจ็กต์ต้นทาง
  2. ส่งออกข้อมูลจากโปรเจ็กต์ต้นทางไปยังที่เก็บข้อมูล
  3. ให้สิทธิ์โปรเจ็กต์ปลายทางในการอ่านจากที่เก็บข้อมูล
  4. นำเข้าข้อมูลจากที่เก็บข้อมูลไปยังโปรเจ็กต์ปลายทาง

ก่อนเริ่มต้น

คุณต้องทำงานต่อไปนี้ให้เสร็จสมบูรณ์ก่อนจึงจะใช้บริการส่งออกและนำเข้าที่มีการจัดการได้

  1. เปิดใช้การเรียกเก็บเงินสำหรับทั้งโปรเจ็กต์ต้นทางและโปรเจ็กต์ปลายทาง มีเพียง Google Cloud โปรเจ็กต์ที่เปิดใช้การเรียกเก็บเงินเท่านั้นที่ใช้ฟังก์ชันการส่งออกและนำเข้าได้
  2. ตรวจสอบว่าบัญชีของคุณมีสิทธิ์ IAM ที่จำเป็นใน Cloud ในโปรเจ็กต์ต้นทางและโปรเจ็กต์ปลายทาง หากคุณเป็นเจ้าของโปรเจ็กต์ทั้ง 2 รายการ บัญชีของคุณจะมีสิทธิ์ที่จําเป็น หรือจะให้สิทธิ์ที่จำเป็นสำหรับCloud Firestoreการดำเนินการส่งออกและนำเข้าด้วยบทบาท Cloud IAM ต่อไปนี้ก็ได้

    Owner, Cloud Datastore Owner หรือ Cloud Datastore Import Export Admin

    เจ้าของโปรเจ็กต์สามารถมอบหมายบทบาทใดบทบาทหนึ่งเหล่านี้ได้โดยทำตามขั้นตอนในการให้สิทธิ์เข้าถึง

  3. ตั้งค่าเครื่องมือบรรทัดคำสั่ง gcloud และเชื่อมต่อกับโปรเจ็กต์ด้วยวิธีใดวิธีหนึ่งต่อไปนี้

  4. ตั้งค่าดัชนีในโปรเจ็กต์ใหม่ ดัชนีคอมโพสิตควรตรงกันระหว่างโปรเจ็กต์ต้นทางและปลายทาง คุณควรตั้งค่าดัชนีก่อนเพื่อหลีกเลี่ยงการประมวลผลเอกสารแต่ละรายการหลายครั้ง

ส่งออกข้อมูลจากโปรเจ็กต์ต้นทาง

ส่งออกข้อมูลโดยสร้างที่เก็บข้อมูล 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 ดังนี้

เริ่ม 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. หยุดการเขียนจาก 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 ดังนี้

เริ่มวันที่ 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