이 페이지에서는 세분화된 액세스 제어가 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 뷰
다음 뷰에는 대기열의 데이터베이스 역할과 권한 정보가 표시됩니다.
- GoogleSQL 언어 데이터베이스:
INFORMATION_SCHEMA.TABLE_PRIVILEGES - PostgreSQL 언어 데이터베이스:
information_schema.table_privileges
Spanner는 대기열을 테이블 수준 스키마 객체로 모델링하므로 대기열에 부여된 권한이 TABLE_PRIVILEGES에 표시됩니다. 대기열 테이블 값 함수에 부여된 권한은 ROUTINE_PRIVILEGES에 표시됩니다.
이러한 뷰의 행은 현재 데이터베이스 역할의 권한을 기준으로 필터링됩니다. 이렇게 하면 주 구성원이 액세스 권한이 있는 역할, 권한, 대기열만 볼 수 있습니다.
행 필터링은 다음 대기열 메타데이터 뷰에도 적용됩니다.
GoogleSQL
INFORMATION_SCHEMA.TABLESINFORMATION_SCHEMA.COLUMNS
PostgreSQL
information_schema.tablesinformation_schema.columns
행 필터링은 큐 테이블 반환 함수 (RECEIVE_QUEUE_NAME 및 RENEWLEASE_QUEUE_NAME)의 메타데이터 뷰에도 적용됩니다.
GoogleSQL
PostgreSQL
시스템 역할 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모두 필요)과 달리 대기열 메시지 소비자는RECEIVETVF에 대한EXECUTE만 필요합니다. 큐 자체에는SELECT가 필요하지 않습니다.열 수준 권한이 지원되지 않음: 테이블과 달리 Spanner는 대기열(예:
GRANT SELECT (COLUMN_NAME) ON QUEUE)에 대한 열 수준 권한을 지원하지 않습니다. 대기열에는 내부 시스템 메타데이터 열이 포함되므로 대기열 객체 전체에 권한을 부여해야 합니다.생산자 및 소비자 역할 분리: 메시지 생산자와 메시지 소비자에 대해 별도의 데이터베이스 역할을 정의하는 것이 좋습니다. 예를 들면 다음과 같습니다.
- 큐에
INSERT만 있는 프로듀서 역할 RECEIVE_QUEUE_NAME및RENEWLEASE_QUEUE_NAME함수에 대한EXECUTE권한과DELETE또는Ack변형으로 메시지를 승인하는 경우 대기열에 대한DELETE권한이 있는 소비자 역할
- 큐에
직접 DML과 대기열 TVF 전송 비교: 직접
DELETE또는UPDATE문은 대기열 임대 및 전송 상태 머신을 우회합니다. 이러한 권한은 관리 또는 유지관리 역할로 제한하는 것이 좋습니다.