runlot

psql と PostgreSQL プロトコル接続

既存の PostgreSQL ツールからデータベースに接続します。ログインセッションを使うことも、システム用の資格情報を発行することもできます。

いちばん簡単な方法

runlot pg shell

このコマンドは psql を探してデータベースに接続します。-- の後に入力した引数は、そのまま psql に渡されます。

runlot pg shell -- -c "select count(*) from posts"

パスワードは PGPASSWORD 環境変数で渡します。コマンドライン引数は、同じマシンの他のユーザーが ps で確認できてしまうためです。

ローカルポート経由で接続する

GUI クライアントやその他のツールを使う場合は、ポートフォワーディングが便利です。

runlot port-forward
127.0.0.1:15432 を me/my-app のデータベースに転送しています。
psql "postgresql://…@127.0.0.1:15432/…" のように接続してください。Ctrl-C で終了します。
runlot port-forward --port 5555 --listen 127.0.0.1
runlot port-forward --port 0      # 利用可能なポートを自動で選びます

パスワードがローカルマシンに渡されることはありません。 ポートフォワーディングは runlot login のセッションを使います。CLI が受け取るのは接続情報(ホスト、ポート、データベース名)だけで、認証はフロントがログインセッションで処理します。トークンが期限切れになったり、組織から外れたりすると、次の接続から拒否されます。

外部から直接接続する

外部の BI ツールや、別のホスティング環境で動くアプリのように runlot login を使えない場所からは、pg token で資格情報を発行してください。

postgresql://<user>:<password>@<プロジェクト>--<組織>.wire.runlot.app:5433/<database>?sslmode=require

ポート番号は 5433 です。ホスト名にはプロジェクトと組織が -- でつながっています。フロントは資格情報を受け取る前に、この名前でどのプロジェクトのデータベースを開くかを決めます。正確な値は runlot pg connect が表示します。

TLS

libpq における sslmode=require は、暗号化だけを行い証明書は検証しないという意味です。証明書も検証する場合は CA ディレクトリを指定してください。

runlot pg shell --ca-dir ./ca      # または RUNLOT_CA_DIR

SNI は証明書の検証有無にかかわらず常に必要です。フロントが SNI で対象のプロジェクトを決めるため、SNI を無効にすると接続できません。

ドライバの互換性

現在は テキスト結果フォーマット を使うドライバのみ接続できます。psql、node-postgres、psycopg(既定の設定)が該当します。pgx、JDBC、Npgsql、asyncpg のようにバイナリ結果フォーマットを要求するドライバは、現時点では 0A000 エラーで拒否されます。エンジン側の実装は完了しており、本番ノードへの展開が残っています。

バイナリ パラメータ は今後もサポートしません。結果フォーマットとは別の機能であり、サポートされるまでは明示的に拒否します。

認証方式

フロントは SNI でプロジェクトを識別したうえで、接続開始の直後に認証を完了します。利用できる資格情報は次のとおりです。

対象資格情報利用場所
ユーザーrunlot login のセッションrunlot port-forward、ダッシュボードの SQL エディタ
システム接続文字列のパスワード外部の BI ツール、別のホスティング環境のアプリ

クライアントが送った runlot_* startup パラメータはフロントですべて削除され、検証済みのロール情報だけが改めて追加されます。クライアントがロールを偽装することはできません。

このページの目次