กำหนดการส่งออกข้อมูล

หน้านี้อธิบายวิธีกำหนดเวลาการส่งออกข้อมูล Cloud Firestore ของคุณ หากต้องการดำเนินการส่งออกตามกำหนดเวลา เราขอแนะนำให้ใช้ Cloud Functions และ Cloud Scheduler

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

ก่อนที่คุณจะกำหนดเวลาการส่งออกข้อมูลที่มีการจัดการ คุณต้องทำงานต่อไปนี้:

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

สร้างงาน Cloud Function และ Cloud Scheduler

ทำตามขั้นตอนด้านล่างเพื่อสร้างฟังก์ชันคลาวด์ Node.js ที่เริ่มต้นการส่งออกข้อมูล Cloud Firestore และงาน Cloud Scheduler เพื่อเรียกใช้ฟังก์ชันนั้น:

Firebase CLI
  1. ติดตั้ง Firebase CLI ในไดเร็กทอรีใหม่ ให้เริ่มต้น CLI สำหรับ Cloud Functions:

    firebase init functions --project PROJECT_ID
    1. เลือก JavaScript สำหรับภาษา
    2. หรือเปิดใช้งาน ESLint
    3. ป้อน y เพื่อติดตั้งการขึ้นต่อกัน
  2. แทนที่โค้ดในไฟล์ functions/index.js ด้วยโค้ดต่อไปนี้:

    const functions = require('firebase-functions');
    const firestore = require('@google-cloud/firestore');
    const client = new firestore.v1.FirestoreAdminClient();
    
    // Replace BUCKET_NAME
    const bucket = 'gs://BUCKET_NAME';
    
    exports.scheduledFirestoreExport = functions.pubsub
                                                .schedule('every 24 hours')
                                                .onRun((context) => {
    
      const projectId = process.env.GCP_PROJECT;
      const databaseName = 
        client.databasePath(projectId, '(default)');
    
      return client.exportDocuments({
        name: databaseName,
        outputUriPrefix: bucket,
        // Leave collectionIds empty to export all collections
        // or set to a list of collection IDs to export,
        // collectionIds: ['users', 'posts']
        collectionIds: []
        })
      .then(responses => {
        const response = responses[0];
        console.log(`Operation Name: ${response['name']}`);
      })
      .catch(err => {
        console.error(err);
        throw new Error('Export operation failed');
      });
    });
  3. ในโค้ดด้านบน ให้แก้ไขสิ่งต่อไปนี้:
    • แทนที่ BUCKET_NAME ด้วยชื่อที่เก็บข้อมูลของคุณ
    • แก้ไข every 24 hours เพื่อกำหนดกำหนดการส่งออก ใช้ ไวยากรณ์ AppEngine cron.yaml หรือ รูปแบบ unix-cron ( * * * * * )
    • แก้ไข collectionIds: [] เพื่อส่งออกเฉพาะกลุ่มคอลเลกชันที่ระบุ ปล่อยไว้ตามเดิมเพื่อส่งออกคอลเลกชันทั้งหมด

  4. ปรับใช้ฟังก์ชันตามกำหนดเวลา:

    firebase deploy --only functions
คอนโซล GCP
สร้างฟังก์ชั่นคลาวด์
  1. ไปที่หน้า Cloud Functions ในคอนโซล GCP:

    ไปที่ฟังก์ชั่นคลาวด์

  2. คลิก สร้างฟังก์ชัน
  3. ป้อนชื่อฟังก์ชัน เช่น firestoreExport
  4. ใต้ ทริกเกอร์ ให้เลือก Cloud Pub/Sub
  5. ภายใต้ หัวข้อ เลือก สร้างหัวข้อใหม่ ป้อนชื่อสำหรับหัวข้อ pub/sub เช่น initiateFirestoreExport จดชื่อหัวข้อตามที่คุณต้องการเพื่อสร้างงาน Cloud Scheduler
  6. ภายใต้ ซอร์สโค้ด ให้เลือก ตัวแก้ไขแบบอินไลน์ ป้อนรหัสต่อไปนี้ภายใต้ index.js :
    const firestore = require('@google-cloud/firestore');
    const client = new firestore.v1.FirestoreAdminClient();
    // Replace BUCKET_NAME
    const bucket = 'gs://BUCKET_NAME'
    
    exports.scheduledFirestoreExport = (event, context) => {
      const databaseName = client.databasePath(
        process.env.GCP_PROJECT,
        '(default)'
      );
    
      return client
        .exportDocuments({
          name: databaseName,
          outputUriPrefix: bucket,
          // Leave collectionIds empty to export all collections
          // or define a list of collection IDs:
          // collectionIds: ['users', 'posts']
          collectionIds: [],
        })
        .then(responses => {
          const response = responses[0];
          console.log(`Operation Name: ${response['name']}`);
          return response;
        })
        .catch(err => {
          console.error(err);
        });
    };
    ในโค้ดข้างต้น ให้แก้ไขสิ่งต่อไปนี้:
    • แทนที่ BUCKET_NAME ด้วยชื่อที่เก็บข้อมูลของคุณ
    • แก้ไข collectionIds: [] เพื่อส่งออกเฉพาะกลุ่มคอลเลกชันที่ระบุ ปล่อยไว้ตามเดิมเพื่อส่งออกคอลเลกชันทั้งหมด

  7. ภายใต้ package.json เพิ่มการพึ่งพาต่อไปนี้:
    {
      "dependencies": {
        "@google-cloud/firestore": "^1.3.0"
      }
    }
  8. ภายใต้ Function to Execution ให้ป้อน scheduledFirestoreExport ชื่อของฟังก์ชันใน index.js
  9. คลิก สร้าง เพื่อปรับใช้ฟังก์ชันคลาวด์
สร้างงาน Cloud Scheduler

จากนั้น สร้างงาน Cloud Scheduler ที่เรียกใช้ Cloud Function ของคุณ:

  1. ไปที่หน้า Cloud Scheduler ในคอนโซล GCP:

    ไปที่ตัวกำหนดเวลาคลาวด์

  2. คลิก สร้างงาน
  3. ป้อน ชื่อ สำหรับงาน เช่น scheduledFirestoreExport
  4. ป้อน ความถี่ เช่น every 24 hours
  5. เลือก เขตเวลา
  6. ใต้ เป้าหมาย เลือก Pub/Sub ในช่อง หัวข้อ ให้ป้อนชื่อของหัวข้อ pub/sub ที่คุณกำหนดไว้ข้าง Cloud Function ของคุณ initiateFirestoreExport ในตัวอย่างด้านบน
  7. ในฟิลด์ Payload ให้ป้อน start export งานต้องมีการกำหนดเพย์โหลด แต่ฟังก์ชันคลาวด์ด้านบนไม่ได้ใช้ค่านี้จริงๆ
  8. คลิก สร้าง
ณ จุดนี้ คุณได้ใช้งาน Cloud Function และ Cloud Scheduler แล้ว แต่ Cloud Function ของคุณยังคงต้องการสิทธิ์การเข้าถึงเพื่อดำเนินการส่งออก

กำหนดค่าสิทธิ์การเข้าถึง

จากนั้น ให้สิทธิ์ Cloud Function เพื่อเริ่มดำเนินการส่งออกและเขียนลงในที่เก็บข้อมูล GCS

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

PROJECT_ID@appspot.gserviceaccount.com

บัญชีบริการนี้ต้องได้รับสิทธิ์เพื่อเริ่มการดำเนินการส่งออกและเขียนลงในที่เก็บข้อมูล Cloud Storage ของคุณ หากต้องการให้สิทธิ์เหล่านี้ ให้กำหนดบทบาท IAM ต่อไปนี้ให้กับบัญชีบริการเริ่มต้น:

  • Cloud Datastore Import Export Admin
  • บทบาท Owner หรือ Storage Admin ในที่เก็บข้อมูล

คุณสามารถใช้เครื่องมือบรรทัดคำสั่ง gcloud และ gsutil เพื่อกำหนดบทบาทเหล่านี้ได้

หากยังไม่ได้ติดตั้ง คุณจะเข้าถึงเครื่องมือเหล่านี้ได้จาก Cloud Shell ในคอนโซล Google Cloud Platform:
เริ่มคลาวด์เชลล์

  1. มอบหมายบทบาท ผู้ดูแลระบบ Cloud Datastore Import Export แทนที่ PROJECT_ID และรันคำสั่งต่อไปนี้:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member serviceAccount:PROJECT_ID@appspot.gserviceaccount.com \
        --role roles/datastore.importExportAdmin
    
  2. มอบหมายบทบาท ผู้ดูแลระบบพื้นที่เก็บข้อมูล ในบัคเก็ตของคุณ แทนที่ PROJECT_ID และ BUCKET_NAME และรันคำสั่งต่อไปนี้:

    gsutil iam ch serviceAccount:PROJECT_ID@appspot.gserviceaccount.com:admin \
        gs://BUCKET_NAME
    

หากคุณปิดใช้งานหรือลบบัญชีบริการเริ่มต้นของ App Engine แอป App Engine ของคุณจะสูญเสียการเข้าถึงฐานข้อมูล Cloud Firestore ของคุณ หากคุณปิดใช้งานบัญชีบริการ App Engine ของคุณ คุณสามารถเปิดใช้งานได้อีกครั้ง โปรดดูที่ การเปิดใช้งานบัญชีบริการ หากคุณลบบัญชีบริการ App Engine ภายใน 30 วันที่ผ่านมา คุณสามารถกู้คืนบัญชีบริการของคุณได้ โปรดดูที่ การยกเลิกการลบบัญชีบริการ

ทดสอบงาน Cloud Scheduler และ Cloud Function ของคุณ

คุณสามารถทดสอบงาน Cloud Scheduler ได้ในหน้า Cloud Scheduler ของคอนโซล Google Cloud Platform

  1. ไปที่หน้า Cloud Scheduler ในคอนโซล GCP
    ไปที่ตัวกำหนดเวลาคลาวด์

  2. ในแถวสำหรับงาน Cloud Scheduler ใหม่ของคุณ ให้คลิก Run now

    หลังจากนั้นไม่กี่วินาที งาน Cloud Scheduler ควรอัปเดตคอลัมน์ผลลัพธ์เป็น Success และ Last run เป็นเวลาปัจจุบัน คุณอาจต้องคลิก รีเฟรช

หน้า Cloud Scheduler จะยืนยันเฉพาะงานที่เรียกว่า Cloud Function ของคุณเท่านั้น เปิดหน้าฟังก์ชันคลาวด์เพื่อดูบันทึกฟังก์ชันของคุณ

ดูบันทึกฟังก์ชันคลาวด์

หากต้องการดูว่าฟังก์ชันคลาวด์เริ่มดำเนินการส่งออกได้สำเร็จหรือไม่ ให้เปิดบันทึกของฟังก์ชัน:

คอนโซล Firebase

ไปที่หน้า ฟังก์ชั่นคลาวด์ ในคอนโซล Firebase

ไปที่บันทึกฟังก์ชัน

คอนโซล GCP

ไปที่หน้า Cloud Functions ในคอนโซล GCP

ไปที่โปรแกรมดูบันทึก

ดูความคืบหน้าการส่งออก

คุณสามารถใช้คำสั่ง gcloud firestore operations list เพื่อดูความคืบหน้าของการดำเนินการส่งออก โปรดดูที่ การจัดการการดำเนินการส่งออกและนำเข้า

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

เปิดเบราว์เซอร์ Cloud Storage