排程匯出作業

本頁面說明如何排定排程,自動匯出 Cloud Firestore (Datastore 模式) 實體。

如要排程匯出實體,我們建議您部署 App Engine 服務,以呼叫 Datastore 模式的代管匯出功能。部署後,您可以按排程使用 App Engine Cron 服務執行此服務。

事前準備

您必須先完成下列工作,才能使用 App Engine 和代管匯出功能排程資料匯出:

  1. 啟用 GCP 專案的計費功能。只有啟用計費服務的 GCP 專案才能使用匯出及匯入功能。

  2. 為專案建立 Cloud Storage 值區。代管匯出及匯入功能全都必須使用 Cloud Storage。您必須針對 Cloud Storage 值區和 Datastore 模式資料庫使用相同的位置。

    如要尋找 Datastore 模式資料庫位置,請參閱查看專案的位置一文。

  3. 安裝 Google Cloud SDK 以部署應用程式。

設定排程的匯出

完成上述要求之後,請完成下列程序來設定排程的匯出。

設定存取權限

此應用程式使用 App Engine 預設服務帳戶來驗證及授權其匯出要求。建立專案時,App Engine 會為您建立下列格式的預設服務帳戶:

[PROJECT_ID]@appspot.gserviceaccount.com

服務帳戶需要權限才能啟動 Datastore 模式資料庫匯出作業,以及寫入 Cloud Storage 值區。如要授予這些權限,請將下列身分與存取權管理角色指派給預設服務帳戶:

  • Cloud Datastore Import Export Admin
  • Cloud Storage 值區的 Storage Admin

您可以使用 Cloud SDK 中的 gcloudgsutil 指令列工具指派這些角色:

  1. 使用 gcloud 指令列工具指派 Cloud Datastore 匯出管理員角色:

    gcloud projects add-iam-policy-binding [PROJECT_ID] \
        --member serviceAccount:[PROJECT_ID]@appspot.gserviceaccount.com \
        --role roles/datastore.importExportAdmin
    

    或者,您也可以使用 GCP 主控台指派此角色

  2. 使用 gsutil 指令列工具指派值區的儲存空間管理員角色:

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

    或者,您也可以使用 GCP 主控台指派此角色

部署應用程式

在 Python 或 Java 中部署下列範例應用程式:

Python

建立應用程式檔案

在開發電腦上的新資料夾中,建立以下用於提供 App Engine 應用程式程式碼的檔案:

  • app.yaml
  • cloud_datastore_admin.py

使用下列檔案程式碼。

app.yaml

下列檔案可設定應用程式部署:

runtime: python27
api_version: 1
threadsafe: true
service: cloud-datastore-admin

libraries:
- name: webapp2
  version: "latest"

handlers:
- url: /cloud-datastore-export
  script: cloud_datastore_admin.app
  login: admin

service: cloud-datastore-admin 會將應用程式部署至 cloud-datastore-admin 服務。如果這是專案中的唯一 App Engine 服務,請移除此行,將應用程式部署至 default 服務。

cloud_datastore_admin.py

import datetime
import httplib
import json
import logging
import webapp2

from google.appengine.api import app_identity
from google.appengine.api import urlfetch

class Export(webapp2.RequestHandler):

  def get(self):
    access_token, _ = app_identity.get_access_token(
        'https://www.googleapis.com/auth/datastore')
    app_id = app_identity.get_application_id()
    timestamp = datetime.datetime.now().strftime('%Y%m%d-%H%M%S')

    output_url_prefix = self.request.get('output_url_prefix')
    assert output_url_prefix and output_url_prefix.startswith('gs://')
    if '/' not in output_url_prefix[5:]:
      # Only a bucket name has been provided - no prefix or trailing slash
      output_url_prefix += '/' + timestamp
    else:
      output_url_prefix += timestamp

    entity_filter = {
        'kinds': self.request.get_all('kind'),
        'namespace_ids': self.request.get_all('namespace_id')
    }
    request = {
        'project_id': app_id,
        'output_url_prefix': output_url_prefix,
        'entity_filter': entity_filter
    }
    headers = {
        'Content-Type': 'application/json',
        'Authorization': 'Bearer ' + access_token
    }
    url = 'https://datastore.googleapis.com/v1/projects/%s:export' % app_id
    try:
      result = urlfetch.fetch(
          url=url,
          payload=json.dumps(request),
          method=urlfetch.POST,
          deadline=60,
          headers=headers)
      if result.status_code == httplib.OK:
        logging.info(result.content)
      elif result.status_code >= 500:
        logging.error(result.content)
      else:
        logging.warning(result.content)
      self.response.status_int = result.status_code
    except urlfetch.Error:
      logging.exception('Failed to initiate export.')
      self.response.status_int = httplib.INTERNAL_SERVER_ERROR

app = webapp2.WSGIApplication(
    [
        ('/cloud-datastore-export', Export),
    ], debug=True)

部署應用程式

  1. 確保將 gcloud 設定為正確的專案:

    gcloud config set project [PROJECT_NAME]
    
  2. app.yaml 檔案所在的目錄中,將應用程式部署至專案:

    gcloud app deploy
    

Java

下列範例應用程式假設您已設定 Maven 和 App Engine 外掛程式

下載應用程式

下載 java-docs-samples 存放區並前往 datastore-schedule-export 應用程式目錄:

  1. 將應用程式存放區範例複製到本機電腦中:

    git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git
    

    您也可以下載 zip 格式的範例,然後解壓縮該檔案。

  2. 前往包含程式碼範例的目錄:

    cd java-docs-samples/appengine-java8/datastore-schedule-export/
    

應用程式會在 DatastoreExportServlet.java 檔案中設定 servlet。

部署至其他服務

如果您依原樣部署應用程式,則會部署至 default 服務。如果您已經有 default 服務,則應部署至其他服務。

透過新增 <module>service_name</module> 修改 src/main/webapp/WEB-INF/appengine-web.xml 檔案。例如:

   <?xml version="1.0" encoding="utf-8"?>
   <appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
      <runtime>java8</runtime>
      <!-- ... -->
      <module>cloud-datastore-admin</module>
      <!-- ... -->
   </appengine-web-app>

如要進一步瞭解應用程式設定檔,請參閱 appengine-web.xml 參考資料

部署應用程式

  1. 確保將 gcloud 設定為正確的專案:

    gcloud config set project [PROJECT_NAME]
    
  2. 將應用程式部署至專案:

    mvn appengine:deploy
    

該服務會在 [SERVICE_URL]/cloud-datastore-export 接收匯出要求,並將已驗證要求傳送至 Cloud Datastore Admin API,以開始匯出。

服務會使用下列 URL 參數來設定匯出要求:

  • output_url_prefix (必要參數):指定用於儲存 Datastore 模式資料庫匯出項目的位置。如果網址以 / 結尾,則會依原樣使用該網址。否則,應用程式會將時間戳記新增至網址。
  • kind (選用參數,可使用多個):將匯出作業限制為僅匯出這些種類。
  • namespace_id (選用參數,可使用多個):將匯出作業限制為僅匯出這些命名空間中的資料。

部署 Cron 工作

如要設定呼叫 schedule-datastore-exports 應用程式的 Cron 工作,請建立並部署 cron.yaml 檔案。

  1. 建立 cron.yaml 檔案:

    Python

    cron:
    - description: "Daily Cloud Datastore Export"
      url: /cloud-datastore-export?output_url_prefix=gs://[BUCKET_NAME]
      target: cloud-datastore-admin
      schedule: every 24 hours
    

    如果您將應用程式部署至 default 服務,而非 cloud-datastore-admin 服務,請移除 target: cloud-datastore-admin

    Java

    cron:
    - description: "Daily Cloud Datastore Export"
      url: /cloud-datastore-export?output_url_prefix=gs://[BUCKET_NAME]
      schedule: every 24 hours
    

    如果您未將應用程式部署至 default 服務,請新增服務目標行。例如:target: cloud-datastore-admin

    請將 [BUCKET_NAME] 改成您的 Cloud Storage 值區名稱。

  2. 設定 Cron 工作。範例 cron.yaml 將每隔 24 小時對每個實體啟動一次匯出要求。如要進一步瞭解排程選項,請參閱排程格式一文。

    如要僅匯出特定種類的實體,請將 kind 參數新增至 url 值。同樣地,如要從特定命名空間匯出實體,請新增 namespace_id 參數。例如:

    • 匯出 Song 種類的實體:

      url: /cloud-datastore-export?output_url_prefix=gs://[BUCKET_NAME]&kind=Song
      
    • 匯出 Song 種類和 Album 種類的實體:

      url: /cloud-datastore-export?output_url_prefix=gs://[BUCKET_NAME]&kind=Song&kind=Album
      
    • 匯出 Song 種類和 Album 種類的實體,前提是這些實體必須在 Classical 命名空間或 Pop 命名空間中:

      url: /cloud-datastore-export?output_url_prefix=gs://[BUCKET_NAME]&namespace_id=Classical&namespace_id=Pop&kind=Song&kind=Album
      
  3. 部署 Cron 工作。在 cron.yaml 檔案所在的目錄中執行下列指令:

      gcloud app deploy cron.yaml
    

測試您的 Cron 應用程式

您可以儘早在 Google Cloud Platform 主控台的「Cron Jobs」(Cron Jobs) 頁面中執行 Cron 工作,來測試部署的 Cron 工作:

  1. 開啟 GCP 主控台中的「Cron Jobs」(Cron 工作) 頁面。
    開啟「Cron Jobs」(Cron 工作) 頁面

  2. 按一下 Cron 工作的 [Run now] (立即執行) 按鈕。

  3. 工作完成後,請在「Status」(狀態) 下確認狀態訊息。如要查看 Cron 工作的記錄檔,請按一下「Log」(記錄) 欄下的 [View] (查看)

查看匯出項目

Cron 工作順利完成後,您可以在 Cloud Storage 值區中查看匯出項目。

  1. 在 CGP 主控台中開啟 Cloud Storage 瀏覽器。
    開啟 Cloud Storage 瀏覽器

  2. 在值區清單中,按一下您所建立的匯出項目值區。

  3. 確認匯出項目是否列在該值區中。

後續步驟

  • 如要瞭解如何利用 Datastore 模式資料庫匯出功能匯入資料,請參閱匯入實體一文。
本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Cloud Datastore 說明文件