Menjadwalkan ekspor data

Halaman ini menjelaskan cara menjadwalkan ekspor data Cloud Firestore Anda. Untuk menjalankan ekspor sesuai jadwal, sebaiknya terapkan layanan App Engine yang memanggil fitur ekspor terkelola Cloud Firestore. Setelah diterapkan, Anda dapat menjadwalkan panggilan ke layanan ini menggunakan Layanan Cron App Engine.

Sebelum memulai

Sebelum Anda menjadwalkan ekspor data dengan fitur ekspor terkelola, Anda harus menyelesaikan 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. Membuat bucket Cloud Storage untuk project Anda di lokasi yang dekat dengan lokasi database Cloud Firestore Anda. Anda tidak dapat menggunakan bucket Pemohon Membayar untuk operasi ekspor dan impor.
  3. Instal Google Cloud SDK untuk memberikan izin akses dan menerapkan aplikasi.

Mengonfigurasi izin akses

Aplikasi menggunakan akun layanan default App Engine untuk mengautentikasi dan mengizinkan operasi ekspornya. Saat Anda membuat project, akun layanan default dibuat untuk Anda dengan format berikut:

YOUR_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
  • Peran Owner atau Storage Admin pada bucket

Anda dapat menggunakan fitur command-line gcloud dan gsutil dari Google Cloud SDK untuk menetapkan peran ini:

  1. Tetapkan peran Cloud Datastore Import Export Admin:

    gcloud projects add-iam-policy-binding YOUR_PROJECT_ID \
        --member serviceAccount:YOUR_PROJECT_ID@appspot.gserviceaccount.com \
        --role roles/datastore.importExportAdmin
    
  2. Tetapkan peran Storage Admin pada bucket Anda:

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

File aplikasi

Di folder baru, buat file aplikasi berikut menggunakan kode di bawah:

app.yaml
Mengonfigurasi runtime App Engine. Aplikasi ini menggunakan runtime Node.js lingkungan standar.
app.js
Kode aplikasi utama. Aplikasi ini menyiapkan layanan web di https://YOUR_PROJECT_ID.appspot.com yang memulai operasi ekspor.
package.json
Mencakup informasi tentang aplikasi dan dependensinya.
cron.yaml
Mengonfigurasi cron job yang memanggil layanan web.

app.yaml

runtime: nodejs8

Kode di atas menganggap aplikasi ini sebagai aplikasi default. Jika tidak, tambahkan baris berikut:

target: cloud-firestore-admin

app.js

const axios = require('axios');
const dateformat = require('dateformat');
const express = require('express');
const { google } = require('googleapis');

const app = express();

// Trigger a backup
app.get('/cloud-firestore-export', async (req, res) => {
  const auth = await google.auth.getClient({
    scopes: ['https://www.googleapis.com/auth/datastore']
  });

  const accessTokenResponse = await auth.getAccessToken();
  const accessToken = accessTokenResponse.token;

  const headers = {
    'Content-Type': 'application/json',
    Authorization: 'Bearer ' + accessToken
  };

  const outputUriPrefix = req.param('outputUriPrefix');
  if (!(outputUriPrefix && outputUriPrefix.indexOf('gs://') == 0)) {
    res.status(500).send(`Malformed outputUriPrefix: ${outputUriPrefix}`);
  }

  // Construct a backup path folder based on the timestamp
  const timestamp = dateformat(Date.now(), 'yyyy-mm-dd-HH-MM-ss');
  let path = outputUriPrefix;
  if (path.endsWith('/')) {
    path += timestamp;
  } else {
    path += '/' + timestamp;
  }

  const body = {
    outputUriPrefix: path
  };

  // If specified, mark specific collections for backup
  const collectionParam = req.param('collections');
  if (collectionParam) {
    body.collectionIds = collectionParam.split(',');
  }

  const projectId = process.env.GOOGLE_CLOUD_PROJECT;
  const url = `https://firestore.googleapis.com/v1beta1/projects/${projectId}/databases/(default):exportDocuments`;

  try {
    const response = await axios.post(url, body, { headers: headers });
    res
      .status(200)
      .send(response.data)
      .end();
  } catch (e) {
    if (e.response) {
      console.warn(e.response.data);
    }

    res
      .status(500)
      .send('Could not start backup: ' + e)
      .end();
  }
});

// Index page, just to make it easy to see if the app is working.
app.get('/', (req, res) => {
  res
    .status(200)
    .send('[scheduled-backups]: Hello, world!')
    .end();
});

// Start the server
const PORT = process.env.PORT || 6060;
app.listen(PORT, () => {
  console.log(`App listening on port ${PORT}`);
  console.log('Press Ctrl+C to quit.');
});

package.json

{
  "name": "solution-scheduled-backups",
  "version": "1.0.0",
  "description": "Scheduled Cloud Firestore backups via AppEngine cron",
  "main": "app.js",
  "engines": {
    "node": "8.x.x"
  },
  "scripts": {
    "deploy": "gcloud app deploy --quiet app.yaml cron.yaml",
    "start": "node app.js"
  },
  "author": "Google, Inc.",
  "license": "Apache-2.0",
  "dependencies": {
    "axios": "^0.18.0",
    "dateformat": "^3.0.3",
    "express": "^4.16.4",
    "googleapis": "^34.0.0"
  },
  "devDependencies": {
    "prettier": "^1.14.3"
  }
}

cron.yaml

cron:
- description: "Daily Cloud Firestore Export"
  url: /cloud-firestore-export?outputUriPrefix=gs://BUCKET_NAME[/PATH]&collections=test1,test2
  target: cloud-firestore-admin
  schedule: every 24 hours

Ubah baris url untuk mengonfigurasi operasi ekspor. Aplikasi ini menyiapkan layanan di https://YOUR_PROJECT_ID.appspot.com/cloud-firestore-export yang menerima parameter URL berikut:

outputUriPrefix
lokasi bucket Cloud Storage Anda dalam format gs://BUCKET_NAME.
koleksi
Daftar dipisahkan koma yang memuat ID koleksi yang akan diekspor. Jika tidak ditentukan, operasi akan mengekspor semua koleksi.

Misalnya, untuk mengekspor semua koleksi dengan ID koleksi Songs atau Albums, Anda harus menggunakan URL berikut:

url: /cloud-firestore-export?outputUriPrefix=gs://BUCKET_NAME&collections=Songs,Albums

Contoh cron.yaml menjalankan ekspor setiap 24 jam. Untuk opsi jadwal yang berbeda, lihat format jadwal.

Menerapkan aplikasi dan cron job

Dengan gcloud, gunakan aplikasi dan cron job:

gcloud app deploy app.yaml cron.yaml

Menguji cron job Anda

Anda dapat menguji cron job yang Anda terapkan dengan memulainya di halaman Cron Jobs pada Google Cloud Platform Console.

  1. Buka halaman Cron Jobs di GCP Console.
    Membuka halaman Cron Job

  2. Untuk cron job dengan deskripsi Daily Cloud Firestore Export, klik Run now.

  3. Setelah tugas selesai, lihat pesan status di bagian Status. Klik View untuk melihat log tugas. Pesan status dan log tugas akan memberikan informasi tentang keberhasilan atau kegagalan tugas.

Melihat ekspor Anda

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

Buka browser Cloud Storage di GCP Console.
Buka browser Cloud Storage

Kirim masukan tentang...

Butuh bantuan? Kunjungi halaman dukungan kami.