대기열에 대해 세분화된 액세스 제어

이 페이지에서는 세분화된 액세스 제어가 GoogleSQL 언어 데이터베이스 및 PostgreSQL 언어 데이터베이스의 Spanner 대기열에서 작동하는 방식을 설명합니다.

Spanner에서 대기열은 스키마 객체로 정의됩니다. 메시지 전송, 메시지 수신, 메시지 임대 연장, 메시지 확인 및 삭제 또는 대기열 직접 쿼리에 대한 액세스는 표준 Spanner 데이터베이스 역할 및 권한을 준수합니다.

메시지 전송에 대한 보상 (프로듀서)

DML (INSERT INTO) 또는 변형 API (삽입 문 참고)를 사용하여 대기열에 메시지를 보내려면 데이터베이스 역할에 대기열에 대한 INSERT 권한을 부여하세요.

GoogleSQL

GRANT INSERT ON QUEUE QUEUE_NAME TO ROLE ROLE_NAME;

PostgreSQL

GRANT INSERT ON QUEUE QUEUE_NAME TO ROLE_NAME;

권한을 취소하려면 다음 단계를 따르세요.

GoogleSQL

REVOKE INSERT ON QUEUE QUEUE_NAME FROM ROLE ROLE_NAME;

PostgreSQL

REVOKE INSERT ON QUEUE QUEUE_NAME FROM ROLE_NAME;

메시지 수신 권한 (소비자)

큐에서 메시지를 스트리밍하기 위해 소비자 작업자는 ExecuteStreamingSQL를 사용하여 RECEIVE_QUEUE_NAME() 테이블 값 함수 (TVF)를 실행합니다.

데이터베이스 역할이 대기열에서 메시지를 스트리밍하도록 허용하려면 자동으로 생성된 RECEIVE_QUEUE_NAME 함수에 EXECUTE를 부여하세요.

GoogleSQL

GRANT EXECUTE ON TABLE FUNCTION RECEIVE_QUEUE_NAME TO ROLE ROLE_NAME;

PostgreSQL

GRANT EXECUTE ON FUNCTION spanner.receive_QUEUE_NAME TO ROLE_NAME;

권한을 취소하려면 다음 단계를 따르세요.

GoogleSQL

REVOKE EXECUTE ON TABLE FUNCTION RECEIVE_QUEUE_NAME FROM ROLE ROLE_NAME;

PostgreSQL

REVOKE EXECUTE ON FUNCTION spanner.receive_QUEUE_NAME FROM ROLE_NAME;

RECEIVE_QUEUE_NAME()를 호출하려면 TVF에 EXECUTE만 있으면 됩니다. 대기열에 SELECT는 필요하지 않습니다.

메시지 리스 연장

소비자가 메시지를 수신하면 Spanner는 초기 10초 리스를 할당합니다. 메시지 처리가 초기 리스보다 오래 걸리는 경우 소비자는 RENEWLEASE_QUEUE_NAME() TVF를 사용하여 리스를 연장해야 합니다.

임대를 연장하려면 역할에 RENEWLEASE_QUEUE_NAME 함수에 대한 EXECUTE 권한이 있어야 합니다.

GoogleSQL

GRANT EXECUTE ON TABLE FUNCTION RENEWLEASE_QUEUE_NAME TO ROLE ROLE_NAME;

PostgreSQL

GRANT EXECUTE ON FUNCTION spanner.renew_lease_QUEUE_NAME TO ROLE_NAME;

권한을 취소하려면 다음 단계를 따르세요.

GoogleSQL

REVOKE EXECUTE ON TABLE FUNCTION RENEWLEASE_QUEUE_NAME FROM ROLE ROLE_NAME;

PostgreSQL

REVOKE EXECUTE ON FUNCTION spanner.renewlease_QUEUE_NAME FROM ROLE_NAME;

RENEWLEASE_QUEUE_NAME()를 호출하려면 TVF에 EXECUTE만 있으면 되며 대기열에 SELECT는 필요하지 않습니다.

메시지 수신 및 임대 연장에 관한 자세한 내용은 큐 사용을 참고하세요.

대기열을 직접 쿼리할 수 있는 권한

표준 SQL(SELECT * FROM QUEUE_NAME) 또는 Read API를 사용하여 대기열에서 직접 메시지를 읽거나 검사하려면 대기열에 SELECT 권한을 부여하세요.

GoogleSQL

GRANT SELECT ON QUEUE QUEUE_NAME TO ROLE ROLE_NAME;

PostgreSQL

GRANT SELECT ON QUEUE QUEUE_NAME TO ROLE_NAME;

권한을 취소하려면 다음 단계를 따르세요.

GoogleSQL

REVOKE SELECT ON QUEUE QUEUE_NAME FROM ROLE ROLE_NAME;

PostgreSQL

REVOKE SELECT ON QUEUE QUEUE_NAME FROM ROLE_NAME;

대기열에 SELECT 권한을 부여하면 대기열을 테이블로 쿼리할 수 있지만 RECEIVE_QUEUE_NAME() 또는 RENEWLEASE_QUEUE_NAME()EXECUTE 권한이 부여되지는 않습니다.

메시지 확인 및 삭제 권한

DML (DELETE FROM) 또는 Mutation API (Ack 또는 Delete)를 사용하여 큐에서 메시지를 승인하거나 삭제하려면 큐에 DELETE 권한을 부여하세요.

GoogleSQL

GRANT DELETE ON QUEUE QUEUE_NAME TO ROLE ROLE_NAME;

PostgreSQL

GRANT DELETE ON QUEUE QUEUE_NAME TO ROLE_NAME;

권한을 취소하려면 다음 단계를 따르세요.

GoogleSQL

REVOKE DELETE ON QUEUE QUEUE_NAME FROM ROLE ROLE_NAME;

PostgreSQL

REVOKE DELETE ON QUEUE QUEUE_NAME FROM ROLE_NAME;

대기열 작업에 필요한 권한

다음 표에는 일반적인 대기열 작업에 필요한 권한이 요약되어 있습니다.

작업 필수 권한
메시지 보내기 (DML INSERT 또는 변형 API Send) INSERT
메시지 수신 (RECEIVE_QUEUE_NAME() TVF) RECEIVE_QUEUE_NAME 함수에 대한 EXECUTE
메시지 리스 연장 (RENEWLEASE_QUEUE_NAME() TVF) RENEWLEASE_QUEUE_NAME 함수에 대한 EXECUTE
메일 확인 또는 삭제 (DML DELETE 또는 변형 API Ack 또는 Delete) DELETE
대기열 데이터를 직접 읽습니다 (SQL SELECT 또는 읽기 API). SELECT

예: 프로듀서 및 컨슈머 역할 구성

다음 예시에서는 OrdersQueue이라는 대기열에서 생산자, 소비자, 감사자를 위한 별도의 데이터베이스 역할을 구성합니다.

GoogleSQL

-- Create producer role and grant send permissions
CREATE ROLE queue_producer;
GRANT INSERT ON QUEUE OrdersQueue TO ROLE queue_producer;

-- Create consumer role and grant receive, renew, and delete permissions
CREATE ROLE queue_consumer;
GRANT EXECUTE ON TABLE FUNCTION RECEIVE_OrdersQueue TO ROLE queue_consumer;
GRANT EXECUTE ON TABLE FUNCTION RENEWLEASE_OrdersQueue TO ROLE queue_consumer;
GRANT DELETE ON QUEUE OrdersQueue TO ROLE queue_consumer;

-- Create reader role for inspection without consumer streaming permissions
CREATE ROLE queue_reader;
GRANT SELECT ON QUEUE OrdersQueue TO ROLE queue_reader;

PostgreSQL

-- Create producer role and grant send permissions
CREATE ROLE queue_producer;
GRANT INSERT ON QUEUE OrdersQueue TO queue_producer;

-- Create consumer role and grant receive, renew, and delete permissions
CREATE ROLE queue_consumer;
GRANT EXECUTE ON FUNCTION spanner.receive_OrdersQueue TO queue_consumer;
GRANT EXECUTE ON FUNCTION spanner.renewlease_OrdersQueue TO queue_consumer;
GRANT DELETE ON QUEUE OrdersQueue TO queue_consumer;

-- Create reader role for inspection without consumer streaming permissions
CREATE ROLE queue_reader;
GRANT SELECT ON QUEUE OrdersQueue TO queue_reader;

대기열의 INFORMATION_SCHEMA

다음 뷰에는 대기열의 데이터베이스 역할과 권한 정보가 표시됩니다.

Spanner는 대기열을 테이블 수준 스키마 객체로 모델링하므로 대기열에 부여된 권한이 TABLE_PRIVILEGES에 표시됩니다. 대기열 테이블 값 함수에 부여된 권한은 ROUTINE_PRIVILEGES에 표시됩니다.

이러한 뷰의 행은 현재 데이터베이스 역할의 권한을 기준으로 필터링됩니다. 이렇게 하면 주 구성원이 액세스 권한이 있는 역할, 권한, 대기열만 볼 수 있습니다.

행 필터링은 다음 대기열 메타데이터 뷰에도 적용됩니다.

GoogleSQL

  • INFORMATION_SCHEMA.TABLES
  • INFORMATION_SCHEMA.COLUMNS

PostgreSQL

  • information_schema.tables
  • information_schema.columns

행 필터링은 큐 테이블 반환 함수 (RECEIVE_QUEUE_NAMERENEWLEASE_QUEUE_NAME)의 메타데이터 뷰에도 적용됩니다.

시스템 역할 spanner_info_reader 및 해당 구성원은 항상 필터링되지 않은 INFORMATION_SCHEMA를 확인합니다.

주의사항 및 고려사항

  • TVF 실행 및 직접 큐 쿼리에 대한 별도의 권한: 큐에 SELECT를 부여해도 연결된 테이블 값 함수 (RECEIVE_QUEUE_NAME 또는 RENEWLEASE_QUEUE_NAME)에 EXECUTE가 부여되지 않습니다. 마찬가지로 TVF에 EXECUTE를 부여해도 큐에 SELECT가 부여되지 않습니다.

    • 대기열에 SELECT만 있는 역할이 RECEIVE_QUEUE_NAME()를 실행하려고 하면 Spanner에서 역할에 테이블 함수 RECEIVE_QUEUE_NAME에 필요한 권한이 없다는 오류를 반환합니다.
    • TVF에 EXECUTE만 있는 역할이 SELECT * FROM QUEUE_NAME를 실행하려고 하면 Spanner에서 역할에 QUEUE_NAME 대기열에 필요한 권한이 없다는 오류를 반환합니다.
  • 변경 내역과의 차이점: 변경 내역 (스트림에 대한 SELECT 및 읽기 함수에 대한 EXECUTE 모두 필요)과 달리 대기열 메시지 소비자는 RECEIVE TVF에 대한 EXECUTE만 필요합니다. 큐 자체에는 SELECT가 필요하지 않습니다.

  • 열 수준 권한이 지원되지 않음: 테이블과 달리 Spanner는 대기열(예: GRANT SELECT (COLUMN_NAME) ON QUEUE)에 대한 열 수준 권한을 지원하지 않습니다. 대기열에는 내부 시스템 메타데이터 열이 포함되므로 대기열 객체 전체에 권한을 부여해야 합니다.

  • 생산자 및 소비자 역할 분리: 메시지 생산자와 메시지 소비자에 대해 별도의 데이터베이스 역할을 정의하는 것이 좋습니다. 예를 들면 다음과 같습니다.

    • 큐에 INSERT만 있는 프로듀서 역할
    • RECEIVE_QUEUE_NAMERENEWLEASE_QUEUE_NAME 함수에 대한 EXECUTE 권한과 DELETE 또는 Ack 변형으로 메시지를 승인하는 경우 대기열에 대한 DELETE 권한이 있는 소비자 역할
  • 직접 DML과 대기열 TVF 전송 비교: 직접 DELETE 또는 UPDATE 문은 대기열 임대 및 전송 상태 머신을 우회합니다. 이러한 권한은 관리 또는 유지관리 역할로 제한하는 것이 좋습니다.

다음 단계