psql と PostgreSQL プロトコル接続
既存の PostgreSQL ツールからデータベースに接続します。ログインセッションを使うことも、システム用の資格情報を発行することもできます。
いちばん簡単な方法
runlot pg shellこのコマンドは psql を探してデータベースに接続します。-- の後に入力した引数は、そのまま psql に渡されます。
runlot pg shell -- -c "select count(*) from posts"パスワードは PGPASSWORD 環境変数で渡します。コマンドライン引数は、同じマシンの他のユーザーが ps で確認できてしまうためです。
ローカルポート経由で接続する
GUI クライアントやその他のツールを使う場合は、ポートフォワーディングが便利です。
runlot port-forward127.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_DIRSNI は証明書の検証有無にかかわらず常に必要です。フロントが SNI で対象のプロジェクトを決めるため、SNI を無効にすると接続できません。
ドライバの互換性
psql、node-postgres、psycopg(既定の設定)が該当します。pgx、JDBC、Npgsql、asyncpg のようにバイナリ結果フォーマットを要求するドライバは、現時点では 0A000 エラーで拒否されます。エンジン側の実装は完了しており、本番ノードへの展開が残っています。バイナリ パラメータ は今後もサポートしません。結果フォーマットとは別の機能であり、サポートされるまでは明示的に拒否します。
認証方式
フロントは SNI でプロジェクトを識別したうえで、接続開始の直後に認証を完了します。利用できる資格情報は次のとおりです。
| 対象 | 資格情報 | 利用場所 |
|---|---|---|
| ユーザー | runlot login のセッション | runlot port-forward、ダッシュボードの SQL エディタ |
| システム | 接続文字列のパスワード | 外部の BI ツール、別のホスティング環境のアプリ |
クライアントが送った runlot_* startup パラメータはフロントですべて削除され、検証済みのロール情報だけが改めて追加されます。クライアントがロールを偽装することはできません。