エクスポートのスケジューリング

このページでは、Datastore モードの Cloud Firestore エンティティの自動エクスポートをスケジュールする方法について説明します。

エンティティのエクスポートをスケジュールするには、Datastore モードのマネージド エクスポート機能を呼び出す App Engine サービスをデプロイすることをおすすめします。デプロイしたサービスは、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 バケットへの書き込みを行う権限が必要です。これらの権限を付与するには、次の IAM 役割をデフォルトのサービス アカウントに割り当てます。

  • 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 Console を使用してこの役割を割り当てることもできます。

  2. gsutil コマンドライン ツールを使用して、バケットに対するストレージ管理者の役割を割り当てます。

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

    別の方法として、GCP Console を使用してこの役割を割り当てることもできます。

アプリのデプロイ

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

次のサンプルアプリでは、App Engine プラグインをインストールした Maven が設定されていることを前提としています。

アプリをダウンロードする

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 ファイル内にサーブレットを設定しています。

別のサービスにデプロイする

アプリをそのままデプロイすると、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 モード データベースのエクスポートの保存先を指定します。URL が / で終わる場合は、URL はそのままの形で使用されます。そうでない場合は、アプリによって URL にタイムスタンプが追加されます。
  • 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
    

    アプリを cloud-datastore-admin サービスではなく default サービスにデプロイした場合は、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
      
    • 種類が SongAlbum のエンティティをエクスポートするには、次のようにします。

      url: /cloud-datastore-export?output_url_prefix=gs://[BUCKET_NAME]&kind=Song&kind=Album
      
    • 種類が SongAlbum のエンティティが、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 Console の [cron ジョブ] ページであらかじめ cron ジョブを実行して、デプロイされた cron ジョブをテストします。

  1. GCP Console で [cron ジョブ] ページを開きます。
    [cron ジョブ] ページを開く

  2. cron ジョブの [今すぐ実行] ボタンをクリックします。

  3. ジョブが完了したら、[ステータス] でステータス メッセージを確認します。cron ジョブのログファイルを表示するには、[ログ] 列で [表示] をクリックします。

エクスポートの表示

cron ジョブが正常に終了したら、Cloud Storage バケットでエクスポートを表示できます。

  1. GCP Console で Cloud Storage ブラウザを開きます。
    Cloud Storage ブラウザを開く

  2. バケットのリストで、エクスポート用に作成したバケットをクリックします。

  3. エクスポートがバケット内で一覧表示されていることを確認します。

次のステップ

  • Datastore モード データベースのエクスポートからデータをインポートする方法については、エンティティのインポートをご覧ください。
このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Cloud Datastore ドキュメント