Cloud Datastore エミュレータへの移行

Cloud Datastore エミュレータは、Datastore 本番環境のローカル エミュレーションを可能にします。Cloud Datastore エミュレータは、dev_appserver 用のデフォルトの Datastore 実装として段階的に導入されています。

Datastore エミュレータに移行するメリット

Datastore エミュレータは、App Engine スタンダード環境のクライアント ライブラリ(DB や NDB など)と Cloud Datastore のクライアント ライブラリの間で共有できます。

Datastore エミュレータを使用すると、App Engine スタンダード環境で動作するサービスと App Engine フレキシブル環境で動作するサービスの間でローカルデータを共有できます。

始める前に

  1. Java ランタイム(JRE)バージョン 11 以降をダウンロードしてインストールします。

  2. google-cloud-sdk/bin ディレクトリから dev_appserver を実行します。

エミュレーション環境の選択

Cloud Datastore エミュレータは、一部の dev_appserver ユーザーのためのデフォルト エミュレータです。Cloud Datastore エミュレータを使用している場合は、dev_appserver に次のメッセージが表示されます。

... Using Cloud Datastore Emulator.

dev_appserver.py の起動時に --support_datastore_emulator フラグを true に設定すると、dev_appserver で Cloud Datastore エミュレータを強制的に使用できます。

python2 DEVAPPSERVER_ROOT/google_appengine/dev_appserver.py --support_datastore_emulator=[true|false] app.yaml

DEVAPPSERVER_ROOT は、devapp_server.py のアーカイブ バージョンを抽出するフォルダのパスに置き換えます。アーカイブ バージョンの dev_appserver.py のダウンロードと使用の詳細については、ローカル開発用サーバーの使用をご覧ください。

dev_appserver での Datastore エミュレータの使用

dev_appserver は、環境変数 DATASTORE_EMULATOR_HOST に基づいてエミュレータを起動するかどうかを決定します。

  • この環境変数が存在する場合、dev_appserver は DATASTORE_EMULATOR_HOST で実行されている既存のエミュレータ プロセスと通信します。

  • この環境変数が存在しない場合、dev_appserver は新しいエミュレータ プロセスを起動します。Datastore エミュレータのポートを指定するには、dev_appserver.py の起動時に --datastore_emulator_port を設定します。

動作の変更点

ローカルデータ形式の変換

現在、ローカルの Datastore エミュレータは sqlite3 にデータを保存しますが、Cloud Datastore エミュレータはデータを Java オブジェクトとして保存します。

dev_appserver が従来の sqlite3 データを使って起動された場合、そのデータは Java オブジェクトに変換されます。元のデータは、{元のデータファイル名}.sqlitestub というファイル名でバックアップされます。

ローカル データファイルの場所

ローカル データファイルは --datastore_path フラグで指定できます。

  • dev_appserver がエミュレータを起動する場合、この場所は変更されません。

  • dev_appserver が既存の Cloud Datastore エミュレータを使用する場合、このフラグは無視され、エミュレータの設定が優先されます。

ローカルの index.yaml

  • 空の index.yaml は無効と見なされます。index.yaml の構文は YAML 形式です。index.yaml ファイルには、indexes という名前のリスト要素が 1 つだけあります。

  • dev_appserver がエミュレータを起動すると、index.yaml はアプリケーション プロジェクト ディレクトリに残ります。

  • dev_appserver が既存の Cloud Datastore エミュレータを使用する場合、index.yaml はそのエミュレータによって管理されます。

ローカル Datastore サーバーのその他の機能は変更されません。

トラブルシューティング

エミュレータ出力の取得

デフォルトでは、dev_appserver は Datastore エミュレータをサイレント モードで実行します。Datastore エミュレータの出力を表示するには、--dev_appserver_log_level=debug で dev_appserver を実行します。

gRPC のインポート エラー

dev_appserver は、gRPC を使用して Cloud Datastore エミュレータと通信します。gcloud CLI は gRPC をパッケージ化しますが、パッケージ化されたバージョンは一部のオペレーティング システムと互換性がないため、インポート エラーが発生します。

インポート エラーを修正するには、gcloud CLI 219.0.0 以降で pip を使用して gRPC を個別にインストールします。

pip install grpcio