キューのきめ細かいアクセス制御

このページでは、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;

メッセージ受信の権限付与(コンシューマー)

キューからメッセージをストリーミングするには、コンシューマー ワーカーが ExecuteStreamingSQLRECEIVE_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 ビュー

次のビューには、キューのデータベース ロールと権限の情報が表示されます。

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_NAME 関数と RENEWLEASE_QUEUE_NAME 関数に対する EXECUTE と、DELETE または Ack ミューテーションでメッセージを確認する場合はキューに対する DELETE を持つコンシューマー ロール。
  • 直接 DML とキュー TVF 配信: 直接 DELETE ステートメントまたは UPDATE ステートメントは、キューのリースと配信状態マシンをバイパスします。これらの権限は、管理ロールまたはメンテナンス ロールに制限することをおすすめします。

次のステップ