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

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

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

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

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

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

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

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

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

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

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

ส่งออกข้อมูลโดยสร้างบักเก็ต Cloud Storage สำหรับไฟล์ส่งออก Cloud Firestore และเริ่มการดำเนินการส่งออก

สร้างบักเก็ต Cloud Storage

สร้างบักเก็ต Cloud Storage ในตำแหน่งเดียวกับฐานข้อมูล Cloud Firestore หากต้องการดูตำแหน่งฐานข้อมูล ให้ดูการตั้งค่าตำแหน่งโปรเจ็กต์ คุณไม่สามารถใช้บักเก็ต Requester Pays หรือบักเก็ต Rapid สำหรับการดำเนินการส่งออกและนำเข้า

หากบักเก็ต 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. อัปเดตกฎความปลอดภัย

    ในคอนโซล Firebase ให้ไปที่แท็บฐานข้อมูลและพื้นที่เก็บข้อมูล > 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_GROUP_ID_1],[COLLECTION_GROUP_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