このページでは、GoogleSQL 言語データベースと PostgreSQL 言語データベースの Spanner キューでのきめ細かいアクセス制御の仕組みについて説明します。
Spanner では、キューはスキーマ オブジェクトとして定義されます。メッセージの送信、メッセージの受信、メッセージ リース期間の延長、メッセージの確認応答と削除、キューの直接クエリを行うためのアクセス権は、標準の Spanner データベースのロールと権限に準拠しています。
メッセージ送信の権限付与(プロデューサー)
DML(INSERT INTO)または Mutation API(INSERT ステートメントを参照)を使用してキューにメッセージを送信するには、キューに対する 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 または Mutation API Send) |
キューに INSERT 件 |
メッセージを受信する(RECEIVE_QUEUE_NAME() TVF) |
RECEIVE_QUEUE_NAME 関数に対する EXECUTE |
メッセージのリースを延長する(RENEWLEASE_QUEUE_NAME() TVF) |
RENEWLEASE_QUEUE_NAME 関数に対する EXECUTE |
メッセージの確認または削除(DML DELETE または Mutation API Ack または Delete) |
キューに DELETE 件 |
キューデータを直接読み取る(SQL SELECT または Read 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ステートメントは、キューのリースと配信状態マシンをバイパスします。これらの権限は、管理ロールまたはメンテナンス ロールに制限することをおすすめします。