Cloud SQL for PostgreSQL の読み取り専用セッションを作成する

cloudsql_session_read_only セッション パラメータを使用して、読み取り専用の Cloud SQL for PostgreSQL セッションを作成できます。このアプローチは、標準の PostgreSQL 読み取り専用オプションよりも、セッション中のデータ変更を防ぐための堅牢な方法です。cloudsql_session_read_only パラメータを使用すると、セッションを一時的に読み取り専用にしたり、セッションの期間中ずっと読み取り専用にしたりできます。このような読み取り専用セッションを使用すると、Model Context Protocol(MCP)ツール、レポートツール、監査ツールを使用しているセッションなど、さまざまなコンテキストでデータ整合性を保護できます。

デフォルトでは、cloudsql_session_read_onlyoff に設定されており、データの変更が許可されています。

読み取り専用モードで防ぐことができること

読み取り専用セッションでは、データベースはデータを変更できません。具体的には、読み取り専用モードでは次の操作が禁止されます。

  • 読み取り専用モードでは、新しいトランザクション ID の生成が防止されます。書き込み可能なトランザクションを開始できないため、データ操作言語(DML)またはデータ定義言語(DDL)の命令を実行できません。ただし、アクティブな書き込み可能トランザクションの途中でフラグが設定された場合、トランザクションが終了するまで基本的な DML と DDL の命令を実行できます。

  • 読み取り専用モードでは、次の種類のステートメントと呼び出しは禁止されます。

    • VACUUMNOTIFY などのステートメント。
    • 副作用のある関数。つまり、VOLATILELANGUAGE C または LANGUAGE internal の両方として定義されている FUNCTION を呼び出したり、PROCEDURE を実行したりすることはできません。これは、一部の副作用でトランザクション ID が必要ないためです。例: pg_promote()pg_cancel_backend()pg_terminate_backend()
    • 外部データラッパー。
    • SQL 手続き型言語(PL)で作成した関数またはプロシージャ。

読み取り専用ステータスを構成する

Cloud SQL for PostgreSQL セッション中に、SET ステートメントを使用して、cloudsql_session_read_only フラグの値を次のように変更できます。

  • SET cloudsql_session_read_only = 'on'

    このステートメントにより、セッションが読み取り専用になり、フラグが on に設定されている限り、誰もデータを変更できなくなります。セッションの後半でデータの変更を再開するには、値を off に戻します。

  • SET cloudsql_session_read_only = 'off'

    フラグを off に戻すと、フラグが locked に設定されている場合を除き、セッションの書き込みアクセス権が復元されます。

  • SET cloudsql_session_read_only = 'locked'

    フラグを locked に設定すると、セッションは永続的に読み取り専用になります。フラグを locked に設定すると、セッションの期間中はフラグを他の値に変更できません。

データベースに接続するとすぐにセッションを永続的に読み取り専用にするには、セッションの接続文字列に cloudsql_session_read_only フラグを埋め込みます。

postgresql://USER:PASSWORD@HOST:PORT/DATABASE?options=-ccloudsql_session_read_only=locked

次のように置き換えます。

  • USER: セッションを作成するユーザーのユーザー名。
  • PASSWORD: ユーザーのパスワード。
  • HOST: ホスト URL。
  • PORT: ポート番号。
  • DATABASE: データベース名。

このアプローチには、読み取り専用セッションをサポートしていない古いバージョンの Cloud SQL に接続しようとすると、接続が失敗するという利点もあります。

次のように、特定のデータベース ユーザーに対する書き込みアクセス権を今後のすべての接続で拒否することもできます。

ALTER USER USERNAME SET cloudsql_session_read_only = 'locked';

USERNAME は、読み取り専用に制限するユーザーのユーザー名に置き換えます。

読み取り専用セッションで特定の関数を有効にする

  • VOLATILELANGUAGE C の両方、または LANGUAGE internal として定義された特定の FUNCTION または PROCEDURE の使用を有効にできます。これを行うには、allow に設定されている関数またはプロシージャに SECURITY LABEL を付加します。
  • セッションで特定の関数を禁止するには、SECURITY LABEL ステートメントを deny に設定します。
  • グローバル状態に影響しない関数を許可リストに登録するには、セキュリティ ラベルの事前定義グループを作成します。

    CREATE EXTENSION "google_read_only_session"
    

    google_read_only_session 拡張機能では、次のことが可能になります。

    • 読み取り専用モードで許可されているすべての組み込み揮発性 C 関数。
    • pl/pgsql 言語と pl/v8 言語のハンドラ関数など、データベースに読み込まれた拡張機能の読み取り専用モードで許可されているすべての関数。

    後で 1 つ以上の新しい拡張機能をインストールする場合は、グループラベルを適用するために、google_read_only_session 拡張機能を削除して再作成します。

    > DROP EXTENSION google_read_only_session;
    > CREATE EXTENSION google_read_only_session;
    

    DROP コマンドは、既存のラベルを削除しません。2 番目の CREATE コマンドは、新しい拡張機能の揮発性 C 関数のラベルを追加するだけです。

次のステップ