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

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

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

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

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

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

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

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

    firebase init functions --project PROJECT_ID
    1. เลือก JavaScript เป็นภาษา
    2. เปิดใช้ ESLint (ไม่บังคับ)
    3. ป้อน y เพื่อติดตั้งทรัพยากร Dependency
  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 ด้วยชื่อที่เก็บข้อมูลของคุณ
    • แทนที่ YOUR_PROJECT_ID ด้วยรหัสโปรเจ็กต์
    • แก้ไข every 24 hours เพื่อตั้งค่ากำหนดเวลาการส่งออก ใช้ ไวยากรณ์ cron.yaml ของ AppEngine หรือ รูปแบบ unix-cron (* * * * *)
    • แก้ไข collectionIds: [] เพื่อส่งออกเฉพาะกลุ่มคอลเล็กชันที่ระบุ ปล่อยไว้ตามเดิมเพื่อส่งออกกลุ่มคอลเล็กชันทั้งหมด

  4. ติดตั้งใช้งานฟังก์ชันที่กำหนดเวลาไว้โดยทำดังนี้

    firebase deploy --only functions
คอนโซล Google Cloud
สร้าง Cloud Function
  1. ไปที่หน้า Cloud Functions ในคอนโซล Google Cloud

    ไปที่ Cloud Functions

  2. คลิกเขียนฟังก์ชัน
  3. ป้อนชื่อฟังก์ชัน เช่น firestore-export
  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) => {
      // Access the GCLOUD_PROJECT environment variable set by the runtime.
      const projectId =
        process.env.GOOGLE_CLOUD_PROJECT || process.env.GCLOUD_PROJECT;
      // Use the DATABASE_ID environment variable if set,
      // otherwise default to '(default)'
      const databaseId = process.env.DATABASE_ID || '(default)';
      const databaseName = client.databasePath(
        projectId,
        databaseId
      );
    
      return client
        .exportDocuments({
          name: databaseName,
          outputUriPrefix: bucket,
          // Leave collectionIds empty to export all collection groups
          // or define a list of collection group 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: [] เพื่อส่งออกเฉพาะกลุ่มคอลเล็กชันที่ระบุ ปล่อยไว้ตามเดิมเพื่อส่งออกกลุ่มคอลเล็กชันทั้งหมด

    • (ไม่บังคับ) หากใช้ฐานข้อมูลที่ไม่ใช่ค่าเริ่มต้น ให้ตรวจสอบว่าคุณได้ตั้งค่าตัวแปรสภาพแวดล้อม DATABASE_ID เมื่อสร้าง Cloud Function หากคุณใช้รันไทม์ที่ไม่ได้ตั้งค่า GOOGLE_CLOUD_PROJECT โดยอัตโนมัติ คุณอาจต้องตั้งค่าด้วยตนเองหรือแทนที่ด้วยรหัสโปรเจ็กต์ในโค้ด

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

ถัดไป ให้สร้างงาน Cloud Scheduler ที่เรียกใช้ Cloud Function ดังนี้

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

    ไปที่ Cloud Scheduler

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

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

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

ฟังก์ชัน Cloud Run นี้ใช้บัญชีบริการเพื่อตรวจสอบสิทธิ์และให้สิทธิ์การดำเนินการส่งออก บัญชีบริการที่ใช้จะขึ้นอยู่กับการกำหนดค่า Cloud Functions ดังนี้

  • Cloud Functions (รุ่นที่ 1): ใช้บัญชีบริการเริ่มต้นของ App Engine ดังนี้ PROJECT_ID@appspot.gserviceaccount.com
  • Cloud Functions (รุ่นที่ 2): ใช้บัญชีบริการ Compute Engine เริ่มต้น: PROJECT_NUMBER-compute@developer.gserviceaccount.com

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

  • Cloud Datastore Import Export Admin
  • บทบาท Storage Admin ในที่เก็บข้อมูล
  • Cloud Run Invoker (จำเป็นสำหรับ Cloud Functions (รุ่นที่ 2) เพื่ออนุญาตให้บริการที่ทริกเกอร์เรียกใช้ฟังก์ชัน)

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

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

  1. มอบหมายบทบาทผู้ดูแลระบบการนำเข้าและส่งออก Cloud Datastore แทนที่ PROJECT_ID และ SERVICE_ACCOUNT (เช่น PROJECT_ID@appspot.gserviceaccount.com หรือ PROJECT_NUMBER-compute@developer.gserviceaccount.com) แล้วเรียกใช้คำสั่งต่อไปนี้

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

    gsutil iam ch serviceAccount:SERVICE_ACCOUNT:admin \
        gs://BUCKET_NAME
  3. (สําหรับ Cloud Functions (รุ่นที่ 2)) มอบหมายบทบาท Cloud Run Invoker ให้กับบัญชีบริการ แทนที่ PROJECT_ID และ SERVICE_ACCOUNT แล้วเรียกใช้คำสั่งต่อไปนี้

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member serviceAccount:SERVICE_ACCOUNT \
        --role roles/run.invoker

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

ทดสอบงาน Cloud Scheduler และ Cloud Function

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

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

  2. ในแถวของงาน Cloud Scheduler ใหม่ ให้คลิกเรียกใช้เลย

    หลังจากผ่านไป 2-3 วินาที งาน Cloud Scheduler ควรอัปเดตคอลัมน์ผลลัพธ์เป็นสำเร็จ และการเรียกใช้ครั้งล่าสุดเป็นเวลาปัจจุบัน คุณอาจต้องคลิกรีเฟรช

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

ดูบันทึก Cloud Function

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

คอนโซล Firebase

ในคอนโซล Firebase ให้ไปที่โฮสติ้งและแบบไม่ใช้เซิร์ฟเวอร์ > ฟังก์ชัน

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

คอนโซล GCP

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

ไปที่ผู้ดูบันทึก

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

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

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

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