Menjadwalkan ekspor data

Halaman ini menjelaskan cara menjadwalkan ekspor data Cloud Firestore Anda. Untuk menjalankan ekspor sesuai jadwal, sebaiknya gunakan Cloud Functions dan Cloud Scheduler.

Sebelum memulai

Sebelum menjadwalkan ekspor data terkelola, Anda harus menyelesaikan tugas-tugas berikut:

  1. Mengaktifkan penagihan untuk project Google Cloud Platform Anda. Hanya project GCP dengan penagihan aktif yang dapat menggunakan fungsi ekspor dan impor.
  2. Operasi ekspor memerlukan bucket Cloud Storage tujuan. Buat bucket Cloud Storage di lokasi dekat lokasi database Cloud Firestore. Anda tidak dapat menggunakan bucket Requester Pays untuk operasi ekspor.

Buat Cloud Functions dan tugas Cloud Scheduler

Ikuti langkah-langkah di bawah ini untuk membuat Node.js Cloud Function yang memulai ekspor data Cloud Firestore dan tugas Cloud Scheduler untuk memanggil fungsi tersebut:

Firebase CLI
  1. Instal Firebase CLI. Di direktori baru, inisialisasi CLI untuk Cloud Functions:

    firebase init functions --project PROJECT_ID
    1. Pilih JavaScript untuk bahasa.
    2. Jika ingin, aktifkan ESLint.
    3. Masukkan y untuk menginstal dependensi.
  2. Ganti kode dalam file functions/index.js dengan hal berikut ini:

    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 databaseName =
        client.databasePath(process.env.GCP_PROJECT, '(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']}`);
        return response;
      })
      .catch(err => {
        console.error(err);
        throw new Error('Export operation failed');
      });
    });
    
  3. Dalam kode di atas, ubah hal berikut ini:
    • Ganti BUCKET_NAME dengan nama bucket Anda.
    • Ubah every 24 hours untuk mengatur jadwal ekspor Anda. Gunakan sintaks AppEngine cron.yaml atau format unix-cron format (* * * * *).
    • Ubah collectionIds: [] untuk mengekspor grup koleksi yang ditentukan saja. Biarkan apa adanya untuk mengekspor semua koleksi.

  4. Menerapkan fungsi yang dijadwalkan:

    firebase deploy --only functions
GCP Console
Buat Cloud Function
  1. Buka halaman Cloud Function di Konsol GCP:

    Buka halaman Cloud Function

  2. Klik Buat Fungsi
  3. Masukkan nama fungsi seperti firestoreExport
  4. Pada Pemicu, pilih Cloud Pub/Sub
  5. Pada Topik, pilih Buat Topik baru. Masukkan nama untuk topik pub/sub, seperti initiateFirestoreExport. Catat nama topik saat Anda membutuhkannya untuk membuat tugas Cloud Scheduler.
  6. Pada Kode sumber, pilih Editor sebaris. Masukkan kode berikut di bagian 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.GCLOUD_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);
        });
    };
    Dalam kode di atas, ubah hal berikut ini:
    • Ganti BUCKET_NAME dengan nama bucket Anda.
    • Ubah collectionIds: [] untuk mengekspor grup koleksi yang ditentukan saja. Biarkan apa adanya untuk mengekspor semua koleksi.

  7. Di bagian package.json, tambahkan dependensi berikut:
    {
      "dependencies": {
        "@google-cloud/firestore": "^1.3.0"
      }
    }
  8. Di bagian Fungsi yang akan dijalankan, masukkan scheduledFirestoreExport, nama fungsi dalam index.js.
  9. Klik Buat untuk menerapkan Cloud Function.
Buat tugas Cloud Scheduler

Selanjutnya, buat tugas Cloud Scheduler yang memanggil Cloud Function Anda:

  1. Buka halaman Cloud Scheduler di Konsol GCP:

    Buka halaman Cloud Scheduler

  2. Klik Buat Tugas.
  3. Masukkan Nama untuk tugas seperti scheduledFirestoreExport.
  4. Masukkan Frekuensi, misalnya, every 24 hours.
  5. Pilih Zona Waktu.
  6. Pada Target, pilih Pub/Sub. Pada kolom Topik, masukkan nama topik pub/sub yang Anda tetapkan bersama Cloud Function, initiateFirestoreExport dalam contoh di atas.
  7. Pada kolom Payload, masukkan start export. Tugas membutuhkan payload yang ditentukan, tetapi Cloud Function di atas tidak benar-benar menggunakan nilai ini.
  8. Klik Buat.
Di titik ini, Anda telah menerapkan Cloud Function dan tugas Cloud Scheduler, tetapi Cloud Function masih memerlukan izin untuk menjalankan operasi ekspor.

Mengonfigurasi izin akses

Selanjutnya, beri izin Cloud Function untuk memulai operasi ekspor dan menulis ke bucket GCS Anda.

Cloud Function ini menggunakan akun layanan default proyek Anda untuk mengautentikasi dan mengesahkan operasi ekspornya. Saat Anda membuat proyek, akun layanan default dibuat untuk Anda dengan nama berikut:

PROJECT_ID@appspot.gserviceaccount.com

Akun layanan memerlukan izin untuk memulai operasi ekspor dan menulis ke bucket Cloud Storage Anda. Untuk memberikan izin ini, tetapkan peran IAM berikut ke akun layanan default:

  • Cloud Datastore Import Export Admin
  • Owner atau Storage Admin peran di bucket

Anda dapat menggunakan fitur command-line gcloud dan gsutil untuk menetapkan peran ini.

Jika belum terpasang, Anda dapat mengakses fitur ini dari Cloud Shell di Google Cloud Platform Console:
Mulai Cloud Shell

  1. Tetapkan peran Cloud Datastore Import Export Admin. Ganti PROJECT_ID, dan jalankan perintah berikut:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member serviceAccount:PROJECT_ID@appspot.gserviceaccount.com \
        --role roles/datastore.importExportAdmin
    
  2. Tetapkan peran Storage Admin pada bucket Anda. Ganti PROJECT_ID dan BUCKET_NAME, dan jalankan perintah berikut:

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

Uji tugas Cloud Scheduler dan Cloud Function

Anda dapat menguji tugas Cloud Scheduler di halaman Cloud Scheduler di Google Cloud Platform Console.

  1. Buka halaman Cloud Scheduler di Konsol GCP.
    Buka halaman Cloud Scheduler

  2. Di baris untuk tugas Cloud Scheduler baru, klik Jalankan sekarang.

    Setelah beberapa detik, tugas Cloud Scheduler akan memperbarui kolom hasil ke Sukses dan Terakhir dijalankan ke waktu saat ini. Anda mungkin perlu mengklik Muat ulang.

Halaman Cloud Scheduler hanya mengonfirmasi bahwa tugas tersebut memanggil Cloud Function Anda. Buka halaman Cloud Function untuk melihat log fungsi Anda.

Lihat log Cloud Function

Untuk melihat apakah Cloud Function berhasil memulai operasi ekspor, buka log fungsi:

Firebase Console

Buka halaman Cloud Functions di Firebase console.

Buka halaman Log Fungsi

GCP Console

Buka halaman Fungsi Cloud di GCP Console.

Buka halaman Log Viewer

Lihat progres ekspor

Anda dapat menggunakan perintah gcloud firestore operations list untuk melihat progres operasi ekspor Anda, lihat mengelola operasi ekspor dan impor.

Setelah operasi ekspor selesai, Anda dapat melihat file output di bucket Cloud Storage:

Buka browser Cloud Storage