このページでは、PGAdapter を Spanner エミュレータに接続する方法について説明します。このエミュレータはローカルで実行され、Google Cloud プロジェクトや請求先アカウントを作成せずにアプリケーションの開発とテストに使用できます。エミュレータはメモリにのみデータを格納するため、再起動するとデータ、スキーマ、構成など、すべての状態が失われます。このエミュレータは Spanner の本番環境サービスと同じ API を提供し、本番環境へのデプロイではなく、ローカルでの開発とテストを目的として作られています。
PGAdapter をエミュレータに接続する方法は 3 つあります。
- PGAdapter とエミュレータの両方と統合されたビルド済みの Docker コンテナを実行する。
- エミュレータと PGAdapter の両方をローカルマシンで実行する。
- エミュレータと PGAdapter の両方を Docker ネットワークで実行する。
統合された Docker コンテナ
PGAdapter とエミュレータの両方を含むビルド済みの Docker イメージを実行します。Docker コンテナ内の PGAdapter インスタンスは、コンテナ内のエミュレータに接続するように自動的に構成されます。
次のコマンドを使用して Docker コンテナを起動します。
docker pull gcr.io/cloud-spanner-pg-adapter/pgadapter-emulator
docker run -d \
-p 5432:5432 \
-p 9010:9010 \
-p 9020:9020 \
gcr.io/cloud-spanner-pg-adapter/pgadapter-emulator
コンテナの起動時にプロジェクト名、インスタンス名、データベース名を指定する必要はありません。デフォルトでは、プロジェクト名 emulator-project
とインスタンス名 test-instance
が使用されます。接続するデータベースはすべて、PGAdapter によって自動的に作成されます。
PGAdapter に接続して次のコマンドを含む psql
のステートメントを実行します。
psql -h localhost -p 5432 -d test-database
データベース test-database
が自動的に作成されます。次のステートメントを実行して、PostgreSQL 言語データベースに接続されていることを確認します。
create table my_table (
id bigint not null primary key,
value varchar
);
insert into my_table (id, value) values (1, 'One');
select * from my_table;
gcloud CLI などを使用して Docker コンテナ内のエミュレータに直接接続することもできます。
gcloud config configurations create emulator
gcloud config set auth/disable_credentials true
gcloud config set project emulator-project
gcloud config set api_endpoint_overrides/spanner http://localhost:9020/
gcloud spanner instances list
gcloud spanner databases execute-sql test-database \
--instance=test-instance \
--sql="select * from my_table"
エミュレータと PGAdapter をローカルマシンで実行する
エミュレータと PGAdapter の両方をローカルマシンで実行し、次のコマンドを使用して PGAdapter をエミュレータに接続します。
まず、エミュレータを起動します。
gcloud emulators spanner start
次に、PGAdapter を起動してエミュレータに接続します。エミュレータにアクセスするには、PGAdapter をローカルマシンで Java アプリケーションとして起動する必要があります。Docker コンテナで PGAdapter を起動すると、ローカルホストで実行されているエミュレータにアクセスできません。
wget https://storage.googleapis.com/pgadapter-jar-releases/pgadapter.tar.gz \
&& tar -xzvf pgadapter.tar.gz
java -jar pgadapter.jar -p emulator-project -i test-instance \
-c "" \
-r autoConfigEmulator=true
エミュレータへの接続に使用される PGAdapter の追加のコマンドライン引数は次のとおりです。
-c ""
: PGAdapter に認証情報を使用しないように指示します。-r autoConfigEmulator=true
: PGAdapter に、localhost:9010
(デフォルトのエミュレータ ホストとポート)に接続するよう指示します。これによって、PGAdapter にユーザーが接続するデータベースを自動的に作成することも指示します。つまり、データベースに接続する前にデータベースを作成する必要はありません。
PGAdapter に接続して次のコマンドを含む psql
のステートメントを実行します。
psql -h localhost -p 5432 -d test-database
データベース test-database
が自動的に作成されます。次のステートメントを実行して、PostgreSQL 言語データベースに接続されていることを確認します。
create table my_table (
id bigint not null primary key,
value varchar
);
insert into my_table (id, value) values (1, 'One');
select * from my_table;
エミュレータと PGAdapter を Docker ネットワークで実行する
エミュレータと PGAdapter の両方を Docker ネットワークで実行し、次のコマンドを使用して PGAdapter をエミュレータに接続します。
cat <<EOT > docker-compose.yml
version: "3.9"
services:
emulator:
image: "gcr.io/cloud-spanner-emulator/emulator"
pull_policy: always
container_name: spanner-emulator
ports:
- "9010:9010"
- "9020:9020"
pgadapter:
depends_on:
emulator:
condition: service_started
image: "gcr.io/cloud-spanner-pg-adapter/pgadapter"
pull_policy: always
container_name: pgadapter-connected-to-emulator
command:
- "-p emulator-project"
- "-i test-instance"
- "-r autoConfigEmulator=true"
- "-e emulator:9010"
- "-c \"\""
- "-x"
ports:
- "5432:5432"
EOT
docker compose up -d
PGAdapter とエミュレータはどちらも同じ Docker ネットワークで起動され、PGAdapter はエミュレータに接続するように構成されます。エミュレータへの接続に使用される PGAdapter の追加のコマンドライン引数は次のとおりです。
-c ""
: PGAdapter に認証情報を使用しないように指示します。-r autoConfigEmulator=true
: PGAdapter にユーザーが接続するデータベースを自動的に作成するように指示します。つまり、データベースに接続する前にデータベースを作成する必要はありません。-e emulator:9010
:-e
は PGAdapter が接続するエンドポイントを指定します。emulator:9010
は、同じ Docker ネットワーク内にあるエミュレータの名前とポート番号です。-x
: これにより、ローカルマシンから PGAdapter への接続が可能になります。
PGAdapter に接続して次のコマンドを含む psql
のステートメントを実行します。
psql -h localhost -p 5432 -d test-database
データベース test-database
が自動的に作成されます。次のステートメントを実行して、PostgreSQL 言語データベースに接続されていることを確認します。
create table my_table (
id bigint not null primary key,
value varchar
);
insert into my_table (id, value) values (1, 'One');
select * from my_table;
gcloud CLI などを使用して Docker ネットワーク内のエミュレータに直接接続することもできます。
gcloud config configurations create emulator
gcloud config set auth/disable_credentials true
gcloud config set project emulator-project
gcloud config set api_endpoint_overrides/spanner http://localhost:9020/
gcloud spanner instances list
gcloud spanner databases execute-sql test-database \
--instance=test-instance \
--sql="select * from my_table"