Spanner をローカルでエミュレートする

gcloud CLI にはローカルなインメモリのエミュレータが用意されています。このエミュレータを使用すると、Google Cloud プロジェクトや請求先アカウントを作成することなく、無料トライアル インスタンスでアプリケーションを開発してテストできます。エミュレータはメモリにのみデータを格納するため、再起動するとデータ、スキーマ、構成など、すべての状態が失われます。このエミュレータは Spanner の本番環境サービスと同じ API を提供し、本番環境へのデプロイではなく、ローカルでの開発とテストを目的として作られています。

エミュレータは、GoogleSQL と PostgreSQL の両方の言語をサポートしています。クライアント ライブラリのすべての言語をサポートしています。エミュレータは Google Cloud CLIREST API で使用することもできます。

エミュレータは、GitHub でオープンソース プロジェクトとしても利用できます。

制限事項と相違点

エミュレータでは、次の機能はサポートされていません。

  • TLS/HTTPS、認証、Identity and Access Management、権限、ロール。
  • PLAN または PROFILEクエリモードでは、返されるクエリプランは空です。
  • ANALYZE ステートメントエミュレータは受け取りますが、無視します。
  • 監査ログとモニタリング ツール。

また、エミュレータは、次の点で Spanner 本番環境サービスと異なります。

  • エミュレータと本番環境サービスでエラー メッセージが一致しない場合があります。
  • エミュレータのパフォーマンスとスケーラビリティは、本番環境サービスと同等ではありません。
  • 読み取り / 書き込みトランザクションとスキーマ変更は、完了するまでデータベース全体を排他的にのみアクセスできるようにロックします。
  • パーティション化 DMLpartitionQuery はサポートされていますが、エミュレータはステートメントが分割可能かどうかは確認しません。つまり、パーティション化 DML または partitionQuery ステートメントがエミュレータで実行される場合でも、本番環境ではパーティション化できないステートメント エラーにより失敗する可能性があります。

サポートされている、サポートされていない、部分的にサポートされている API と機能の完全なリストについては、GitHub の README ファイルをご覧ください。

エミュレータを実行するためのオプション

エミュレータを実行する一般的な方法は 2 つあります。

実際のアプリケーション開発とテスト ワークフローに適した方法を選択してください。

gcloud CLI 用のエミュレータをセットアップする

Windows と macOS のユーザーは、エミュレータをインストールする前に、次の操作を行います。

  • ワークステーションに gcloud CLI コンポーネントをインストールします。

    gcloud components install
    

    gcloud CLI がすでにインストールされている場合は、次のコマンドを実行してすべてのコンポーネントが更新されていることを確認します。

    gcloud components update
    

gcloud CLI を使用してエミュレータを作成して構成する

エミュレータを gcloud CLI で使用するには、認証を無効にしてエンドポイントをオーバーライドする必要があります。エミュレータと本番環境サービスをすばやく切り替えることができるように、別の gcloud CLI 構成を作成することをおすすめします。

  1. エミュレータの構成を作成して有効にします。

      gcloud config configurations create emulator
      gcloud config set auth/disable_credentials true
      gcloud config set project your-project-id
      gcloud config set api_endpoint_overrides/spanner http://localhost:9020/
    

    構成が完了すると、gcloud CLI コマンドが本番環境サービスではなくエミュレータに送信されます。これを確認するには、エミュレータのインスタンス構成を使用してインスタンスを作成します。

    gcloud spanner instances create test-instance \
      --config=emulator-config --description="Test Instance" --nodes=1
    

    エミュレータとデフォルト構成を切り替えるには、次のコマンドを実行します。

    gcloud config configurations activate [emulator | default]
    
  2. gcloud CLI を使用してエミュレータを起動します。

Docker にエミュレータをインストールする

  1. システムに Docker をインストールし、システムパスで使用できるようにします。

  2. 最新のエミュレータ イメージを取得します。

    docker pull gcr.io/cloud-spanner-emulator/emulator
    
  3. Docker でエミュレータを実行します。

    docker run -p 9010:9010 -p 9020:9020 gcr.io/cloud-spanner-emulator/emulator
    

    このコマンドはエミュレータを実行し、コンテナ内のポートをローカルホスト上の同じポートにマッピングします。エミュレータは、gRPC リクエスト用の localhost:9010 と REST リクエスト用の localhost:9020 の 2 つのローカル エンドポイントを使用します。

  4. gcloud CLI を使用してエミュレータを起動します。

gcloud CLI を使用してエミュレータを起動する

gcloud emulators spanner コマンドを使用してエミュレータを起動します。

gcloud emulators spanner start

エミュレータは、次の 2 つのローカル エンドポイントを使用します。

  • gRPC リクエストの localhost:9010
  • localhost:9020: REST リクエスト用

エミュレータでのクライアント ライブラリの使用

SPANNER_EMULATOR_HOST 環境変数を設定すると、サポート対象バージョンのクライアント ライブラリをエミュレータで使用できます。アップロードの方法は数多くあります。次に例を示します。

Linux / macOS

export SPANNER_EMULATOR_HOST=localhost:9010

Windows

set SPANNER_EMULATOR_HOST=localhost:9010

または、gcloud env-init を使用します。

Linux / macOS

$(gcloud emulators spanner env-init)

Windows

gcloud emulators spanner env-init > set_vars.cmd && set_vars.cmd

アプリケーションが起動すると、クライアント ライブラリは自動的に SPANNER_EMULATOR_HOST をチェックし、エミュレータが実行されている場合は接続します。

SPANNER_EMULATOR_HOST が設定されていると、スタートガイドに沿ってエミュレータをテストできます。プロジェクトの作成、認証、認証情報に関連した手順は、エミュレータの使用に必要ないため、無視してかまいません。

サポート対象のバージョン

下の表に、エミュレータをサポートするクライアント ライブラリのバージョンを示します。

クライアント ライブラリ 最小バージョン
C++ v0.9.x+
C# v3.1.0+
Go v1.5.0+
Java v1.51.0+
Node.js v4.5.0+
PHP v1.25.0+
Python v1.15.0+
Ruby v1.13.0+

C# の場合の追加手順

C# クライアント ライブラリの場合は、接続文字列emulatordetection オプションも指定する必要があります。 他のクライアント ライブラリとは異なり、C# は、デフォルトで SPANNER_EMULATOR_HOST 環境変数を無視します。接続文字列の例を次に示します。

var builder = new SpannerConnectionStringBuilder
{
    DataSource = $"projects/{projectId}/instances/{instanceId}/databases/{databaseId}";
    EmulatorDetection = "EmulatorOnly"
};