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

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

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

ก่อนที่คุณจะเริ่ม

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

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

หากที่เก็บข้อมูล 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

ปิดใช้งานการดำเนินการเขียน (ไม่บังคับ)

หากแอพของคุณยังคงเขียนไปยังฐานข้อมูลของคุณในขณะที่คุณดำเนินการส่งออก คุณอาจไม่สามารถบันทึกการเขียนเหล่านั้นทั้งหมดในไฟล์ส่งออกของคุณ หากต้องการส่งออกข้อมูลจากสถานะที่สอดคล้องกัน ให้ปิดใช้การเขียนไปยังฐานข้อมูลของคุณโดยการอัปเดตกฎความปลอดภัยและหยุดการดำเนินการ 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 ดังนี้

เริ่มคลาวด์เชลล์

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