このドキュメントでは、Pub/Sub で使用可能なアクセス制御オプションについて説明します。
概要
Pub/Sub は、Identity and Access Management(IAM)を使用してアクセス制御を行います。
Pub/Sub では、アクセス制御をプロジェクト レベルと個々のリソースレベルで構成できます。次に例を示します。
Cloud プロジェクト全体ではなく、トピックごと、またはサブスクリプションごとにアクセス権を付与します。
単一のトピックまたはサブスクリプションに対する表示専用アクセス権がある場合、Google Cloud コンソールを使用してそのトピックまたはサブスクリプションを表示することはできません。代わりに、Google Cloud CLI を使用できます。
機能が限定されたアクセス権を付与します。たとえば、トピックにメッセージをパブリッシュするのみのアクセス権、サブスクリプションからのメッセージを使用するのみで、トピックやサブスクリプションを削除できないアクセス権などです。
プロジェクト内のすべての Pub/Sub リソースに対するアクセス権限を、デベロッパーのグループに付与します。
IAM とその機能の詳細については、IAM のドキュメントをご覧ください。特に、リソースへのアクセス権の付与、変更、取り消しをご覧ください。
すべての Pub/Sub メソッドに必要な権限が必要です。Pub/Sub IAM でサポートされる権限とロールのリストについては、次のロールセクションをご覧ください。
権限とロール
このセクションでは、Pub/Sub IAM でサポートされる権限とロールを簡単に説明します。
必要な権限
次の表に、各メソッドを呼び出すために必要な権限を示します。
REST メソッド | 必要な権限 |
---|---|
projects.snapshots.create |
含まれている Cloud プロジェクトに対する pubsub.snapshots.create 権限と、ソース サブスクリプションに対する pubsub.subscriptions.consume 権限。 |
projects.snapshots.delete |
リクエストされたスナップショットに対する pubsub.snapshots.delete 。 |
projects.snapshots.getIamPolicy |
リクエストされたスナップショットに対する pubsub.snapshots.getIamPolicy 。 |
projects.snapshots.list |
リクエストされた Cloud プロジェクトに対する pubsub.snapshots.list 。 |
projects.snapshots.patch |
リクエストされたスナップショットに対する pubsub.snapshots.update 。 |
projects.snapshots.setIamPolicy |
リクエストされたスナップショットに対する pubsub.snapshots.setIamPolicy 。 |
projects.snapshots.testIamPermissions |
なし |
projects.subscriptions.acknowledge |
リクエストされたサブスクリプションに対する pubsub.subscriptions.consume 。 |
projects.subscriptions.create |
含まれている Cloud プロジェクトに対する pubsub.subscriptions.create と、リクエストされたトピックに対する pubsub.topics.attachSubscription 。プロジェクト A 内で、プロジェクト B のトピック T に対するサブスクリプションを作成するには、プロジェクト A とトピック T の両方に対する適切な権限が付与されている必要があります。この場合、ユーザー ID 情報はプロジェクト B の監査ログに記録できます。 |
projects.subscriptions.delete |
リクエストされたサブスクリプションに対する pubsub.subscriptions.delete 。 |
projects.subscriptions.get |
リクエストされたサブスクリプションに対する pubsub.subscriptions.get 。 |
projects.subscriptions.getIamPolicy |
リクエストされたサブスクリプションに対する pubsub.subscriptions.getIamPolicy 。 |
projects.subscriptions.list |
リクエストされた Cloud プロジェクトに対する pubsub.subscriptions.list 。 |
projects.subscriptions.modifyAckDeadline |
リクエストされたサブスクリプションに対する pubsub.subscriptions.consume 。 |
projects.subscriptions.modifyPushConfig |
リクエストされたサブスクリプションに対する pubsub.subscriptions.update 。 |
projects.subscriptions.patch |
リクエストされたサブスクリプションに対する pubsub.subscriptions.update 。 |
projects.subscriptions.pull |
リクエストされたサブスクリプションに対する pubsub.subscriptions.consume 。 |
projects.subscriptions.seek |
リクエストされたサブスクリプションに対する pubsub.subscriptions.consume と、リクエストされたスナップショット(存在する場合)に対する pubsub.snapshots.seek 。 |
projects.subscriptions.setIamPolicy |
リクエストされたサブスクリプションに対する pubsub.subscriptions.setIamPolicy 。 |
projects.subscriptions.testIamPermissions |
なし |
projects.topics.create |
含まれている Cloud プロジェクトに対する pubsub.topics.create 。 |
projects.topics.delete |
リクエストされたトピックに対する pubsub.topics.delete 。 |
projects.topics.detachSubscription |
リクエストされたトピックに対する pubsub.topics.detachSubscription 。 |
projects.topics.get |
リクエストされたトピックに対する pubsub.topics.get 。 |
projects.topics.getIamPolicy |
リクエストされたトピックに対する pubsub.topics.getIamPolicy 。 |
projects.topics.list |
リクエストされた Cloud プロジェクトに対する pubsub.topics.list 。 |
projects.topics.patch |
リクエストされたトピックに対する pubsub.topics.update 。 |
projects.topics.publish |
リクエストされたトピックに対する pubsub.topics.publish 。 |
projects.topics.setIamPolicy |
リクエストされたトピックに対する pubsub.topics.setIamPolicy 。 |
projects.topics.subscriptions.list |
リクエストされたトピックに対する pubsub.topics.get 。 |
projects.topics.testIamPermissions |
なし |
ロール
次の表に、すべての Pub/Sub のロールと、各ロールに関連付けられている権限を示します。
Role | Permissions |
---|---|
Pub/Sub Admin( Provides full access to topics and subscriptions. Lowest-level resources where you can grant this role:
|
|
Pub/Sub Editor( Provides access to modify topics and subscriptions, and access to publish and consume messages. Lowest-level resources where you can grant this role:
|
|
Pub/Sub Publisher( Provides access to publish messages to a topic. Lowest-level resources where you can grant this role:
|
|
Pub/Sub Subscriber( Provides access to consume messages from a subscription and to attach subscriptions to a topic. Lowest-level resources where you can grant this role:
|
|
Pub/Sub Viewer( Provides access to view topics and subscriptions. Lowest-level resources where you can grant this role:
|
|
Google Cloud コンソールによるアクセス制御
Google Cloud Console を使用して、トピックやプロジェクトのアクセス制御を管理できます。
プロジェクト レベルでアクセス制御を設定するには、次の手順に沿って操作します。
Google Cloud コンソールの [IAM] ページに移動します。
プロジェクトを選択します。
[
追加] をクリックします。プリンシパル名を 1 つ以上入力します。
[ロールを選択] リストで、付与するロールを選択します。
[保存] をクリックします。
付与したロールにそのプリンシパルがリストされているかを確認します。
トピックとサブスクリプションに対するアクセス制御を設定するには、次の手順に沿って操作します。
Google Cloud コンソールで、Pub/Sub の [トピック] リストに移動します。
必要に応じて、Pub/Sub が有効なプロジェクトを選択します。
次のいずれかの手順に沿って操作します。
1 つ以上のトピックにロールを設定するには、トピックを選択します。
トピックに関連付けられたサブスクリプションのロールを設定するには、トピック ID をクリックします。[トピックの詳細] ページで、サブスクリプション ID をクリックします。[サブスクリプションの詳細] ページが表示されます。
情報パネルが表示されていない場合は、[情報パネルを表示] をクリックします。
[権限] タブで、[
プリンシパルを追加] をクリックします。プリンシパル名を 1 つ以上入力します。
[ロールを選択] リストで、付与するロールを選択します。
[保存] をクリックします。
IAM API によるアクセス制御
Pub/Sub IAM API を使用して、プロジェクト内の個々のトピックとサブスクリプションに対し、ポリシーを設定および取得して、所定のリソースに対するユーザーの権限をテストできます。通常の Pub/Sub メソッドと同様に、IAM API のメソッドはクライアント ライブラリや API Explorer を使用するか、または HTTP を介して直接呼び出すことができます。
Pub/Sub IAM API を使用して、Google Cloud プロジェクト レベルでポリシーを管理することはできません。
次のセクションでは、ポリシーの設定および取得方法、所定のリソースに対して呼び出し元がどの権限を持っているかをテストする方法について説明します。
ポリシーの取得
getIamPolicy()
メソッドを使用すると、既存のポリシーを取得できます。このメソッドでは、リソースに関連付けられたポリシーを含む JSON オブジェクトが返されます。
サブスクリプションのポリシーを取得するするためのサンプルコードを以下に示します。
C#
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の C# の設定手順を実施してください。詳細については、Pub/Sub C# API リファレンス ドキュメントをご覧ください。
gcloud
サブスクリプション ポリシーを取得します。
gcloud pubsub subscriptions get-iam-policy \ projects/${PROJECT}/subscriptions/${SUBSCRIPTION} \ --format json
出力:
{ "etag": "BwUjMhCsNvY=", "bindings": [ { "role": "roles/pubsub.admin", "members": [ "user:user-1@gmail.com" ] }, { "role": "roles/pubsub.editor", "members": [ "serviceAccount:service-account-2@appspot.gserviceaccount.com", "user:user-3@gmail.com" } ] }
Go
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Go の設定手順を実施してください。詳細については、Pub/Sub Go API リファレンス ドキュメントをご覧ください。
Java
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Java の設定手順を実施してください。詳細については、Pub/Sub Java API リファレンス ドキュメントをご覧ください。
Node.js
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Node.js の設定手順を実施してください。詳細については、Pub/Sub Node.js API リファレンス ドキュメントをご覧ください。
Node.js
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Node.js の設定手順を実施してください。詳細については、Pub/Sub Node.js API リファレンス ドキュメントをご覧ください。
PHP
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の PHP の設定手順を実施してください。詳細については、Pub/Sub PHP API リファレンス ドキュメントをご覧ください。
Python
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Python の設定手順を実施してください。詳細については、Pub/Sub Python API リファレンス ドキュメントをご覧ください。
Ruby
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Ruby の設定手順を実施してください。詳細については、Pub/Sub Ruby API リファレンス ドキュメントをご覧ください。
トピックのポリシーを取得するためのサンプルコードを以下に示します。C#
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の C# の設定手順を実施してください。詳細については、Pub/Sub C# API リファレンス ドキュメントをご覧ください。
gcloud
トピックのポリシーを取得するには、次のコマンドを実行します。
gcloud pubsub topics get-iam-policy \ projects/${PROJECT}/topics/${TOPIC} \ --format json
出力:
{ "etag": "BwUjMhCsNvY=", "bindings": [ { "role":" roles/pubsub.viewer", "members": [ "user:user-1@gmail.com" ] } ] }
Go
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Go の設定手順を実施してください。詳細については、Pub/Sub Go API リファレンス ドキュメントをご覧ください。
Java
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Java の設定手順を実施してください。詳細については、Pub/Sub Java API リファレンス ドキュメントをご覧ください。
Node.js
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Node.js の設定手順を実施してください。詳細については、Pub/Sub Node.js API リファレンス ドキュメントをご覧ください。
PHP
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の PHP の設定手順を実施してください。詳細については、Pub/Sub PHP API リファレンス ドキュメントをご覧ください。
Python
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Python の設定手順を実施してください。詳細については、Pub/Sub Python API リファレンス ドキュメントをご覧ください。
Ruby
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Ruby の設定手順を実施してください。詳細については、Pub/Sub Ruby API リファレンス ドキュメントをご覧ください。
ポリシーの設定
setIamPolicy()
メソッドを使用すると、ポリシーをリソースに接続できます。setIamPolicy()
メソッドは SetIamPolicyRequest
を受け取ります。ここには、設定されるポリシーと、ポリシーが接続されるリソースが含まれています。これにより、結果のポリシーが返されます。
サブスクリプションにポリシーを設定するためのサンプルコードを以下に示します。
C#
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の C# の設定手順を実施してください。詳細については、Pub/Sub C# API リファレンス ドキュメントをご覧ください。
gcloud
1. サブスクリプションのポリシーを保存します。
gcloud pubsub subscriptions get-iam-policy \ projects/${PROJECT}/subscriptions/${SUBSCRIPTION} \ --format json > subscription_policy.json
2. subscription_policy.json
を開き、適切なプリンシパルに適切なロールを与えてバインディングを更新します。subscription_policy.json
ファイルの操作の詳細については、IAM ドキュメントのポリシーをご覧ください。
{ "etag": "BwUjMhCsNvY=", "bindings": [ { "role": "roles/pubsub.admin", "members": [ "user:user-1@gmail.com" ] }, { "role": "roles/pubsub.editor", "members": [ "serviceAccount:service-account-2@appspot.gserviceaccount.com" } ] }
3. 新しいサブスクリプション ポリシーを適用します。
gcloud pubsub subscriptions set-iam-policy \ projects/${PROJECT}/subscriptions/${SUBSCRIPTION} \ subscription_policy.json
Go
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Go の設定手順を実施してください。詳細については、Pub/Sub Go API リファレンス ドキュメントをご覧ください。
Java
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Java の設定手順を実施してください。詳細については、Pub/Sub Java API リファレンス ドキュメントをご覧ください。
Node.js
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Node.js の設定手順を実施してください。詳細については、Pub/Sub Node.js API リファレンス ドキュメントをご覧ください。
PHP
Python
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Python の設定手順を実施してください。詳細については、Pub/Sub Python API リファレンス ドキュメントをご覧ください。
Ruby
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Ruby の設定手順を実施してください。詳細については、Pub/Sub Ruby API リファレンス ドキュメントをご覧ください。
トピックにポリシーを設定するためのサンプルコードを以下に示します。
C#
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の C# の設定手順を実施してください。詳細については、Pub/Sub C# API リファレンス ドキュメントをご覧ください。
gcloud
1. トピックのポリシーを保存します。
gcloud pubsub topics get-iam-policy \ projects/${PROJECT}/topics/${TOPIC} \ --format json > topic_policy.json
2. topic_policy.json
を開き、適切なプリンシパルに適切なロールを与えてバインディングを更新します。subscription_policy.json
ファイルの操作の詳細については、IAM ドキュメントのポリシーをご覧ください。
{ "etag": "BwUjMhCsNvY=", "bindings": [ { "role": "roles/pubsub.editor", "members": [ "user:user-1@gmail.com", "user:user-2@gmail.com" ] } ] }
3. 新しいトピックのポリシーを適用します。
gcloud pubsub topics set-iam-policy \ projects/${PROJECT}/topics/${TOPIC} \ topic_policy.json
Go
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Go の設定手順を実施してください。詳細については、Pub/Sub Go API リファレンス ドキュメントをご覧ください。
Java
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Java の設定手順を実施してください。詳細については、Pub/Sub Java API リファレンス ドキュメントをご覧ください。
Node.js
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Node.js の設定手順を実施してください。詳細については、Pub/Sub Node.js API リファレンス ドキュメントをご覧ください。
PHP
Python
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Python の設定手順を実施してください。詳細については、Pub/Sub Python API リファレンス ドキュメントをご覧ください。
Ruby
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Ruby の設定手順を実施してください。詳細については、Pub/Sub Ruby API リファレンス ドキュメントをご覧ください。
権限のテスト
testIamPermissions()
メソッドを使用して、特定の権限のうち特定のリソースに対して追加または削除できる権限を確認できます。これはパラメータとしてリソース名と一連の権限を取得し、権限のサブセットを返します。
サブスクリプションに対する権限をテストするためのサンプルコードを以下に示します。
C#
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の C# の設定手順を実施してください。詳細については、Pub/Sub C# API リファレンス ドキュメントをご覧ください。
gcloud
gcloud iam list-testable-permissions \ https://pubsub.googleapis.com/v1/projects/${PROJECT}/subscriptions/${SUBSCRIPTION} \ --format json
出力:
[ { "name": "pubsub.subscriptions.consume", "stage": "GA" }, { "name": "pubsub.subscriptions.delete", "stage": "GA" }, { "name": "pubsub.subscriptions.get", "stage": "GA" }, { "name": "pubsub.subscriptions.getIamPolicy", "stage": "GA" }, { "name": "pubsub.subscriptions.setIamPolicy", "stage": "GA" }, { "name": "pubsub.subscriptions.update", "stage": "GA" } ]
Go
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Go の設定手順を実施してください。詳細については、Pub/Sub Go API リファレンス ドキュメントをご覧ください。
Java
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Java の設定手順を実施してください。詳細については、Pub/Sub Java API リファレンス ドキュメントをご覧ください。
Node.js
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Node.js の設定手順を実施してください。詳細については、Pub/Sub Node.js API リファレンス ドキュメントをご覧ください。
PHP
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の PHP の設定手順を実施してください。詳細については、Pub/Sub PHP API リファレンス ドキュメントをご覧ください。
Python
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Python の設定手順を実施してください。詳細については、Pub/Sub Python API リファレンス ドキュメントをご覧ください。
Ruby
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Ruby の設定手順を実施してください。詳細については、Pub/Sub Ruby API リファレンス ドキュメントをご覧ください。
トピックに対する権限をテストするためのサンプルコードを以下に示します。
C#
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の C# の設定手順を実施してください。詳細については、Pub/Sub C# API リファレンス ドキュメントをご覧ください。
gcloud
gcloud iam list-testable-permissions \ https://pubsub.googleapis.com/v1/projects/${PROJECT}/topics/${TOPIC} \ --format json
出力
[ { "name": "pubsub.topics.attachSubscription", "stage": "GA" }, { "name": "pubsub.topics.delete", "stage": "GA" }, { "name": "pubsub.topics.detachSubscription", "stage": "GA" }, { "name": "pubsub.topics.get", "stage": "GA" }, { "name": "pubsub.topics.getIamPolicy", "stage": "GA" }, { "name": "pubsub.topics.publish", "stage": "GA" }, { "name": "pubsub.topics.setIamPolicy", "stage": "GA" }, { "name": "pubsub.topics.update", "stage": "GA" } ]
Go
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Go の設定手順を実施してください。詳細については、Pub/Sub Go API リファレンス ドキュメントをご覧ください。
Java
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Java の設定手順を実施してください。詳細については、Pub/Sub Java API リファレンス ドキュメントをご覧ください。
Node.js
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Node.js の設定手順を実施してください。詳細については、Pub/Sub Node.js API リファレンス ドキュメントをご覧ください。
PHP
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の PHP の設定手順を実施してください。詳細については、Pub/Sub PHP API リファレンス ドキュメントをご覧ください。
Python
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Python の設定手順を実施してください。詳細については、Pub/Sub Python API リファレンス ドキュメントをご覧ください。
Ruby
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Ruby の設定手順を実施してください。詳細については、Pub/Sub Ruby API リファレンス ドキュメントをご覧ください。
サンプル ユースケース: プロジェクト間通信
Pub/Sub IAM は、プロジェクト間の通信でアクセス権を適切に調整するのに便利です。
Cloud Project A のサービス アカウントで Cloud Project B のトピックにメッセージをパブリッシュする必要があるとします。まず、Project A で Pub/Sub API を有効にします。
次に、Cloud Project B の編集権限をサービス アカウントに付与します。ただし、このアプローチでは大まかすぎることがよくあります。IAM API を使用すれば、アクセスレベルをより詳細に調整できます。
たとえば、次のスニペットでは、project-b の setIamPolicy()
メソッドと用意されている topic_policy.json
ファイを使用して、トピック projects/
project-b/topics/
topic-b でのパブリッシャーのロールを project-a のサービス アカウント foobar@
project-a.iam.gserviceaccount.com
に付与します。
gcloud pubsub topics set-iam-policy \ projects/project-b/topics/topic-b \ topic_policy.json
Updated IAM policy for topic topic-b. bindings: - members: - serviceAccount:foobar@project-a.iam.gserviceaccount.com role: roles/pubsub.publisher etag: BwWGrQYX6R4=
部分的に可用性を維持する動作
承認チェックは IAM サブシステムによって異なります。データ オペレーション(公開、メッセージの使用)のレスポンス レイテンシを低くするため、システムがキャッシュ内の IAM ポリシーにフォールバックする場合があります。変更が有効になるタイミングについては IAM のドキュメントをご覧ください。