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

Cloud SQL for PostgreSQL セッションを cloudsql_session_read_only セッション パラメータを使用して、読み取り専用のセッションを作成できます。この方法は、標準の 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 関数のラベルを追加するだけです。

次のステップ