PostgreSQL용 Cloud SQL 읽기 전용 세션 만들기

`cloudsql_session_read_only` 세션 매개변수를 사용하여 읽기 전용 PostgreSQL용 Cloud SQL 세션을 만들 수 있습니다. 이 방법은 표준 PostgreSQL 읽기 전용 옵션보다 세션 중에 데이터 수정을 방지하는 더 강력한 방법입니다. cloudsql_session_read_only 매개변수를 사용하면 세션을 일시적으로 읽기 전용으로 만들거나 세션 기간 동안 영구적으로 읽기 전용으로 만들 수 있습니다. 이러한 종류의 읽기 전용 세션을 사용하면 모델 컨텍스트 프로토콜 (MCP) 도구, 보고 도구, 감사 도구를 사용하는 세션을 비롯한 다양한 컨텍스트에서 데이터 무결성을 보호할 수 있습니다.

기본적으로 cloudsql_session_read_onlyoff로 설정되어 데이터 수정이 허용됩니다.

읽기 전용 모드에서 방지하는 작업

읽기 전용 세션에서는 데이터베이스가 데이터를 수정할 수 없습니다. 특히 읽기 전용 모드는 다음을 방지합니다.

  • 읽기 전용 모드는 새 트랜잭션 ID 생성을 방지합니다. 쓰기 가능한 트랜잭션을 시작할 수 없으므로 데이터 조작 언어 (DML) 또는 데이터 정의 언어 (DDL) 명령어를 실행할 수 없습니다. 그러나 활성 쓰기 가능 트랜잭션 중간에 플래그가 설정되면 트랜잭션이 종료될 때까지 기본 DML 및 DDL 명령어를 실행할 수 있습니다.

  • 읽기 전용 모드는 다음과 같은 종류의 문과 호출을 방지합니다.

    • VACUUMNOTIFY와 같은 문.
    • 부작용이 있는 함수. 즉, 일부 부작용에는 트랜잭션 ID가 필요하지 않으므로 VOLATILELANGUAGE C 또는 LANGUAGE internal로 정의된 FUNCTION을 호출하거나 PROCEDURE를 실행할 수 없습니다. 예로는 pg_promote(), pg_cancel_backend(), pg_terminate_backend()가 있습니다.
    • 외부 데이터 래퍼.
    • SQL 절차적 언어(PL)에서 만든 함수 또는 프로시져.

읽기 전용 상태 구성

PostgreSQL용 Cloud SQL 세션 중에 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의 사용을 사용 설정할 수 있습니다. 이렇게 하려면 SECURITY LABELallow로 설정된 함수 또는 프로시져에 연결합니다.
  • 세션에서 특정 함수를 허용하지 않으려면 SECURITY LABEL 문을 deny로 설정합니다.
  • 전역 상태에 영향을 미치지 않는 함수를 허용 목록에 추가하려면 미리 정의된 보안 라벨 그룹을 만듭니다.

    CREATE EXTENSION "google_read_only_session"
    

    google_read_only_session 확장 프로그램은 다음을 사용 설정합니다.

    • 읽기 전용 모드에서 허용되는 모든 기본 제공 휘발성 C 함수.
    • 데이터베이스에 로드된 확장 프로그램의 읽기 전용 모드에서 허용되는 모든 함수( 및 pl/v8 언어의 핸들러 함수 포함)pl/pgsql.

    나중에 새 확장 프로그램을 하나 이상 설치하는 경우 그룹 라벨을 적용하려면 google_read_only_session 확장 프로그램을 삭제하고 다시 만듭니다.

    > DROP EXTENSION google_read_only_session;
    > CREATE EXTENSION google_read_only_session;
    

    DROP 명령어는 기존 라벨을 삭제하지 않습니다. 두 번째 CREATE 명령어는 새 확장 프로그램의 휘발성 C 함수에 라벨을 추가하기만 합니다.

다음 단계