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

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

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

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

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

  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 Bucket สำหรับไฟล์ส่งออก Cloud Firestore แล้วเริ่มการดำเนินการส่งออก

สร้าง Cloud Storage Bucket

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

หาก Cloud Storage Bucket ไม่ได้อยู่ใน โปรเจ็กต์ต้นทาง คุณต้องให้สิทธิ์เข้าถึง Bucket แก่ บัญชีบริการเริ่มต้นของโปรเจ็กต์ต้นทาง โปรเจ็กต์ Google Cloud แต่ละโปรเจ็กต์ มีบัญชีบริการเริ่มต้นที่สร้างขึ้นโดยอัตโนมัติซึ่งมีชื่อว่า PROJECT_ID@appspot.gserviceaccount.com Cloud Firestore การดำเนินการส่งออกจะใช้บัญชีบริการเริ่มต้นนี้เพื่อให้สิทธิ์Cloud Storage การดำเนินการ Bucket หากต้องการให้สิทธิ์เข้าถึง Bucket ต้นทางแก่บัญชีบริการเริ่มต้น ให้มอบบทบาท 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 bucket:

ส่งออกข้อมูลทั้งหมด
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 ได้ก่อนที่จะเริ่มการดำเนินการนำเข้า

ย้ายไฟล์ข้อมูลไปยัง Bucket ในเครื่อง

หากตำแหน่ง Bucket ต้นทางแตกต่างจาก Cloud Firestore ตำแหน่งของโปรเจ็กต์ปลายทาง คุณต้องย้าย ไฟล์ข้อมูลไปยัง Cloud Storage Bucket ในตำแหน่งเดียวกับโปรเจ็กต์ปลายทาง

ย้ายไฟล์ข้อมูลไปยัง Cloud Storage Bucket อื่นโดยทำตามขั้นตอน ใน การย้ายและเปลี่ยนชื่อ Bucket ใช้ Bucket ใหม่นี้เป็น [SOURCE_BUCKET] สำหรับขั้นตอนทั้งหมดต่อไปนี้

ให้สิทธิ์เข้าถึง Bucket ต้นทางแก่บัญชีบริการของโปรเจ็กต์

หาก Bucket ต้นทางไม่ได้อยู่ในโปรเจ็กต์ปลายทาง คุณต้องให้สิทธิ์เข้าถึง Bucket ต้นทางแก่บัญชีบริการเริ่มต้นของโปรเจ็กต์ปลายทาง บัญชีบริการเริ่มต้นจะมีชื่อว่า [DESTINATION_PROJECT_ID]@appspot.gserviceaccount.com หากต้องการให้สิทธิ์เข้าถึง Bucket ต้นทางแก่บัญชีบริการเริ่มต้น ให้มอบสิทธิ์ที่เหมาะสมในการเข้าถึง Bucket แก่บัญชีดังกล่าว

คุณสามารถมอบบทบาทที่จำเป็นด้วยเครื่องมือ 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 เพื่อนำเข้าข้อมูลใน Bucket ต้นทางไปยังโปรเจ็กต์ปลายทาง

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