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

このページでは、アプリケーションが Google Cloud Datastore に保存するエンティティの自動エクスポートをスケジュールする方法について説明します。

このページの手順では、Google Cloud Platform プロジェクトがすでに Cloud Datastore を使用するようにセットアップされていることを前提とします。

推奨

Cloud Datastore エクスポートのスケジュールに推奨されているアプローチは、App Engine を使用することです。そのためには、cron ジョブからのリクエストを処理してエクスポート リクエストを実行する App Engine サービスをデプロイする必要があります。デプロイされたサービスは、App Engine のデフォルト サービス アカウントの ID を使用して実行されます。

始める前に

  1. GCP プロジェクトに使用されているのが課金可能なアカウントであることを確認してください。エクスポート機能とインポート機能を使用できるのは、課金可能なアカウントを含む GCP プロジェクトのみです。課金の詳細については、課金と支払いのサポートをご覧ください。

  2. まだ作成していなければ、プロジェクト用の Cloud Storage バケットを作成します。すべてのエクスポートとインポートで Cloud Storage が使用されます。

  3. Cloud Datastore Import Export Admin 役割App Engine デフォルト サービス アカウントに割り当てます。このアカウントの形式は YOUR_PROJECT_ID@appspot.gserviceaccount.com です。gcloud コマンドライン ツールを使用して役割を割り当てることができます。

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

    YOUR_PROJECT_ID を GCP プロジェクトの ID に置き換えます。

    サービス アカウントに役割を割り当てる方法やその他のオプションについては、特定のリソースのサービス アカウントへの役割の付与をご覧ください。

  4. Cloud Storage バケットの書き込み権限を App Engine のデフォルト サービス アカウントに割り当てます。gsutil コマンドライン ツールを使用して権限を割り当てることができます。

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

    YOUR_PROJECT_ID を GCP プロジェクトの ID に置き換え、BUCKET_NAME を Cloud Storage バケットの名前に置き換えてください。

    Cloud Storage バケット権限を割り当てる方法やその他のオプションについては、バケットに対する IAM の使用をご覧ください。

アプリケーション ファイル

開発マシン上の新しいフォルダで、cron ジョブ用のコードを提供する次のファイルを作成します。

  • app.yaml
  • cloud_datastore_admin.py
  • cron.yaml

各ファイルには次のコードを使用します。

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

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)

cron.yaml

GCP プロジェクト用のデフォルト App Engine サービスがすでにデプロイされている場合は、以下のファイルを使用できます。

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

GCP プロジェクト用のデフォルト App Engine サービスがまだデプロイされていない場合は、上記のファイルを target: cloud-datastore-admin 行を削除したうえで使用します。これにより、cron ジョブがデフォルト App Engine サービスになります。

cron.yaml で、BUCKET_NAME を Cloud Storage バケットの名前に置き換えます。Cloud Storage 名前空間パスにオプションの NAMESPACE_PATH を使用している場合は、それを Cloud Storage 名前空間パス(Cloud Datastore 名前空間ではない)に置き換えます。Cloud Storage 名前空間パスの詳細については、 オブジェクト名に関する考慮事項をご覧ください。

cron.yaml の例では、エクスポートが 24 時間ごとに実行されるように設定します。さまざまなスケジュール オプションについては、 スケジュール形式をご覧ください。

特定の種類のエンティティのみをエクスポートするには、kind パラメータを使用するように cron.yaml の url の値を変更します。同様に、特定の名前空間のみからエンティティをエクスポートするには、namespace_id パラメータを使用するように cron.yaml の url の値を変更します。

この例では、種類 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

cron アプリをデプロイする

ファイルを作成したディレクトリで次のコマンドを実行します。

gcloud app deploy app.yaml cron.yaml

(必要に応じて、--project フラグを使用してアクティブな GCP プロジェクトを設定します)。

アプリのデプロイ方法については、Python アプリのデプロイをご覧ください。

cron アプリをテストする

デプロイした cron ジョブをテストするには、Google Cloud Platform Console の [Cron ジョブ] ページでそれを開始します。

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

  2. Daily Cloud Datastore Export の記述がある cron ジョブの場合は、[今すぐ実行] をクリックします。

  3. ジョブが完了したら、[ステータス] の下でステータス メッセージを確認できます。ジョブログを表示するには、[表示] をクリックします。ステータス メッセージとジョブログには、ジョブが成功したか、それともエラーが発生したかに関する情報が表示されます。

エクスポートを表示する

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

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

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

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

次のステップ

このページは役立ちましたか?評価をお願いいたします。

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

Cloud Datastore ドキュメント