アクセス制御

このドキュメントでは、Cloud Pub/Sub で使用可能なアクセス制御オプションについて説明します。

  1. 概要
  2. 権限と役割
    1. 必要な権限
    2. 役割
  3. GCP Console によるアクセス制御
  4. Cloud Pub/Sub IAM API からのアクセス制御
    1. ポリシーの取得
    2. ポリシーの設定
    3. 権限のテスト
  5. サンプル ユースケース: プロジェクト間通信
  6. 部分的に可用性を維持する動作

概要

Cloud Pub/Sub では、アクセス制御に Cloud Identity and Access Management(Cloud IAM)が使用されます。

Cloud Pub/Sub では、アクセス制御をプロジェクト レベルと個々のリソースレベルで構成できます。次に例を示します。

  • Cloud プロジェクト全体ではなく、トピックごと、またはサブスクリプションごとにアクセス権を付与します。
  • 機能が限定されたアクセス権を付与します。たとえば、トピックへのメッセージのパブリッシュのみ、またはサブスクリプションからのメッセージのコンシュームのみは行えるが、トピックまたはサブスクリプションの削除は行えないアクセス権などです。
  • プロジェクト内のすべての Cloud Pub/Sub リソースに対するアクセス権限を、デベロッパーのグループに付与できます。

IAM とその機能の詳しい説明については、Cloud Identity and Access Management デベロッパー ガイドをご覧ください。特に、IAM ポリシーの管理に関するセクションをご覧ください。

どの Cloud Pub/Sub メソッドでも、呼び出し側に一定の権限が必要になります。Cloud Pub/Sub IAM でサポートされる権限と役割については、次のセクションをご覧ください。

権限と役割

ここでは、Cloud Pub/Sub IAM でサポートされる権限と役割を簡単に説明します。

必要な権限

次の表に、各メソッドを呼び出すために呼び出し元が持っている必要のある権限のリストを示します。

メソッド 必要な権限
projects.subscriptions.acknowledge リクエストされたサブスクリプションに対する pubsub.subscriptions.consume
projects.subscriptions.create 含まれている Cloud プロジェクトに対する pubsub.subscriptions.create、およびリクエストされたトピックに対する pubsub.topics.attachSubscription。プロジェクト A 内で、プロジェクト B のトピック T に対するサブスクリプションを作成するには、プロジェクト A とトピック T の両方に対する適切な権限が付与されている必要があります。
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.pull リクエストされたサブスクリプションに対する pubsub.subscriptions.consume
projects.subscriptions.setIamPolicy リクエストされたサブスクリプションに対する pubsub.subscriptions.setIamPolicy
projects.subscriptions.testIamPermissions なし。
projects.topics.create 含まれている Cloud プロジェクトに対する pubsub.topics.create
projects.topics.delete リクエストされたトピックに対する pubsub.topics.delete
projects.topics.get リクエストされたトピックに対する pubsub.topics.get
projects.topics.getIamPolicy リクエストされたトピックに対する pubsub.topics.getIamPolicy
projects.topics.list リクエストされた Cloud プロジェクトに対する pubsub.topics.list
projects.topics.publish リクエストされたトピックに対する pubsub.topics.publish
projects.topics.setIamPolicy リクエストされたトピックに対する pubsub.topics.setIamPolicy
projects.topics.testIamPermissions なし。
projects.topics.subscriptions.list リクエストされたトピックに対する pubsub.topics.get

役割

次の表に、Cloud Pub/Sub Cloud IAM の役割と、各役割に含まれているすべての権限に対応するリストを示します。各権限は、特定のリソースタイプに適用できます。

多くの一般的なユースケースには、これらの事前構成された役割で対応できます。ただし、権限のカスタムセットが含まれた役割が必要になる場合もあります。たとえば、ユーザーがプロジェクト内でのサブスクリプションの作成は行えるものの、プロジェクト内の既存のトピックやサブスクリプションの削除や更新は行えないようにする役割が必要になるといった場合です。そのような場合は、ニーズを満たすカスタムの Cloud IAM 役割を作成することもできます。

役割 含まれている権限 リソースタイプ
roles/pubsub.publisher pubsub.topics.publish トピック
roles/pubsub.subscriber
pubsub.subscriptions.consume サブスクリプション
pubsub.topics.attachSubscription トピック
roles/pubsub.viewer または
roles/viewer
pubsub.topics.list プロジェクト
pubsub.topics.get トピック
pubsub.subscriptions.list プロジェクト
pubsub.subscriptions.get サブスクリプション
roles/pubsub.editor または
roles/editor
上記のすべてと次のもの
pubsub.topics.create プロジェクト
pubsub.topics.delete トピック
pubsub.topics.update トピック
pubsub.subscriptions.create プロジェクト
pubsub.subscriptions.delete サブスクリプション
pubsub.subscriptions.update サブスクリプション
roles/pubsub.admin または
roles/owner
上記のすべてと次のもの
pubsub.topics.getIamPolicy トピック
pubsub.topics.setIamPolicy トピック
pubsub.subscriptions.getIamPolicy サブスクリプション
pubsub.subscriptions.setIamPolicy サブスクリプション
役割 roles/ownerroles/editorroles/viewer には、他の Google Cloud Platform サービスに対する権限も含まれていることに注意してください。

GCP Console によるアクセス制御

GCP Console を使用すると、トピックやプロジェクトのアクセス制御を管理できます。

プロジェクト レベルでアクセス制御を設定するには:

  1. Google Cloud Platform Console で [IAM] ページを開きます。
  2. プロジェクトを選択し、[続行] をクリックします。
  3. [メンバーを追加] をクリックします。
  4. 以前に IAM の役割を付与していない新しいメンバーのメールアドレスを入力します。
  5. プルダウン メニューから目的の役割を選択します。
  6. [追加] をクリックします。
  7. 権限を付与した役割の下に、そのメンバーがリストされていることを確認します。

トピックおよびサブスクリプションに対するアクセス制御を設定するには:

  1. GCP Console で、Pub/Sub の [トピック] ページを開き、Cloud Pub/Sub が有効なプロジェクトを選択します。
  2. 権限を設定するトピックまたはサブスクリプションを選択します。

    同時に複数のトピックに対して権限を設定できます。トピックのサブスクリプションに対して権限を設定するには、トピックを展開表示し、サブスクリプションをクリックして、そのページを開きます。

  3. [権限] をクリックします。[権限] ペインが画面のサイドに表示されます。
  4. メンバー名(複数可能)を入力し、右側のプルダウン メニューから役割を選択して、[追加] をクリックします。

Cloud Pub/Sub IAM API からのアクセス制御

Cloud Pub/Sub IAM API を使用して、プロジェクト内の個々のトピックとサブスクリプションに対し、ポリシーを設定および取得して、所定のリソースに対するユーザーの権限をテストできます。通常の Cloud Pub/Sub メソッドと同様に、クライアント ライブラリまたは API Explorer を介して IAM メソッドを呼び出したり、HTTP を介して直接呼び出したりすることができます。

Cloud Pub/Sub IAM API を使用して Cloud プロジェクト レベルでポリシーを管理することはできません。

次のセクションでは、ポリシーの設定および取得方法、所定のリソースに対して呼び出し元がどの権限を持っているかをテストする方法について説明します。

ポリシーの取得

getIamPolicy() メソッドを使用すると、以前に設定したポリシーを取得できます。このメソッドでは、リソースに関連付けられたポリシーを含む JSON オブジェクトが返されます。

次に、サブスクリプションのポリシーを取得するためのサンプルコードをいくつか紹介します。

C#

このサンプルを試す前に、Cloud Pub/Sub クイックスタート: クライアント ライブラリの使用にある C# 向けの手順に従って設定を行ってください。詳細については、Cloud Pub/Sub C# API のリファレンス ドキュメントをご覧ください。

SubscriptionName subscriptionName = new SubscriptionName(projectId, subscriptionId);
Policy policy = publisher.GetIamPolicy(subscriptionName.ToString());
Console.WriteLine($"Subscription IAM Policy found for {subscriptionId}:");
Console.WriteLine(policy.Bindings);

gcloud コマンド

トピックのポリシーを保存するには、次のコマンドを実行します。

gcloud beta pubsub subscriptions get-iam-policy projects/{your_project}/subscriptions/ \
{your_topic} --format json > subscription_policy.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

このサンプルを試す前に、Cloud Pub/Sub クイックスタート: クライアント ライブラリの使用にある Go 向けの手順に従って設定を行ってください。 詳細については、Cloud Pub/Sub Go API のリファレンス ドキュメントをご覧ください。

policy, err := c.Subscription(subName).IAM().Policy(ctx)
if err != nil {
	return nil, err
}
for _, role := range policy.Roles() {
	log.Printf("%q: %q", role, policy.Members(role))
}

Java

このサンプルを試す前に、Cloud Pub/Sub クイックスタート: クライアント ライブラリの使用にある Java 向けの手順に従って設定を行ってください。詳細については、Cloud Pub/Sub Java API のリファレンス ドキュメントをご覧ください。

try (SubscriptionAdminClient subscriptionAdminClient = SubscriptionAdminClient.create()) {
  ProjectSubscriptionName subscriptionName =
      ProjectSubscriptionName.of(projectId, subscriptionId);
  Policy policy = subscriptionAdminClient.getIamPolicy(subscriptionName.toString());
  if (policy == null) {
    // subscription was not found
  }
  return policy;
}

Node.js

このサンプルを試す前に、Cloud Pub/Sub クイックスタート: クライアント ライブラリの使用にある Node.js 向けの手順に従って設定を行ってください。詳細については、Cloud Pub/Sub Node.js API のリファレンス ドキュメントをご覧ください。

// Imports the Google Cloud client library
const {PubSub} = require('@google-cloud/pubsub');

// Creates a client
const pubsub = new PubSub();

/**
 * TODO(developer): Uncomment the following line to run the sample.
 */
// const subscriptionName = 'my-sub';

// Retrieves the IAM policy for the subscription
const [policy] = await pubsub.subscription(subscriptionName).iam.getPolicy();
console.log(`Policy for subscription: ${JSON.stringify(policy.bindings)}.`);

PHP

このサンプルを試す前に、Cloud Pub/Sub クイックスタート: クライアント ライブラリの使用にある PHP 向けの手順に従って設定を行ってください。詳細については、Cloud Pub/Sub PHP API のリファレンス ドキュメントをご覧ください。

use Google\Cloud\PubSub\PubSubClient;

/**
 * Prints the policy for a PubSub subscription.
 *
 * @param string $projectId  The Google project ID.
 * @param string $subscriptionName  The Pub/Sub subscription name.
 */
function get_subscription_policy($projectId, $subscriptionName)
{
    $pubsub = new PubSubClient([
        'projectId' => $projectId,
    ]);
    $subscription = $pubsub->subscription($subscriptionName);
    $policy = $subscription->iam()->policy();
    print_r($policy);
}

Python

このサンプルを試す前に、Cloud Pub/Sub クイックスタート: クライアント ライブラリの使用にある Python 向けの手順に従って設定を行ってください。詳細については、Cloud Pub/Sub Python API のリファレンス ドキュメントをご覧ください。

client = pubsub_v1.SubscriberClient()
subscription_path = client.subscription_path(project, subscription_name)

policy = client.get_iam_policy(subscription_path)

print('Policy for subscription {}:'.format(subscription_path))
for binding in policy.bindings:
    print('Role: {}, Members: {}'.format(binding.role, binding.members))

Ruby

このサンプルを試す前に、Cloud Pub/Sub クイックスタート: クライアント ライブラリの使用にある Ruby 向けの手順に従って設定を行ってください。詳細については、Cloud Pub/Sub Ruby API のリファレンス ドキュメントをご覧ください。

# project_id        = "Your Google Cloud Project ID"
# subscription_name = "Your Pubsub subscription name"
require "google/cloud/pubsub"

pubsub = Google::Cloud::Pubsub.new project: project_id

subscription = pubsub.subscription subscription_name
policy       = subscription.policy

puts "Subscription policy:"
puts policy.roles

トピックのポリシーを取得するためのサンプルコードをいくつか紹介します。

C#

このサンプルを試す前に、Cloud Pub/Sub クイックスタート: クライアント ライブラリの使用にある C# 向けの手順に従って設定を行ってください。詳細については、Cloud Pub/Sub C# API のリファレンス ドキュメントをご覧ください。

TopicName topicName = new TopicName(projectId, topicId);
Policy policy = publisher.GetIamPolicy(topicName.ToString());
Console.WriteLine($"Topic IAM Policy found for {topicId}:");
Console.WriteLine(policy.Bindings);

gcloud コマンド

トピックのポリシーを取得するには、次のコマンドを実行します。

gcloud beta pubsub topics get-iam-policy projects/{your_project}/topics/{your_topic} \
--format json > topic_policy.json

出力:

    {
      "etag": "BwUjMhCsNvY=",
      "bindings": [
        {
          "role":" roles/pubsub.viewer",
          "members": [
            "user:user-1@gmail.com"
          ]
        }
      ]
    }

Go

このサンプルを試す前に、Cloud Pub/Sub クイックスタート: クライアント ライブラリの使用にある Go 向けの手順に従って設定を行ってください。 詳細については、Cloud Pub/Sub Go API のリファレンス ドキュメントをご覧ください。

policy, err := c.Topic(topicName).IAM().Policy(ctx)
if err != nil {
	return nil, err
}
for _, role := range policy.Roles() {
	log.Print(policy.Members(role))
}

Java

このサンプルを試す前に、Cloud Pub/Sub クイックスタート: クライアント ライブラリの使用にある Java 向けの手順に従って設定を行ってください。詳細については、Cloud Pub/Sub Java API のリファレンス ドキュメントをご覧ください。

try (TopicAdminClient topicAdminClient = TopicAdminClient.create()) {
  ProjectTopicName topicName = ProjectTopicName.of(projectId, topicId);
  Policy policy = topicAdminClient.getIamPolicy(topicName.toString());
  if (policy == null) {
    // topic iam policy was not found
  }
  return policy;
}

Node.js

このサンプルを試す前に、Cloud Pub/Sub クイックスタート: クライアント ライブラリの使用にある Node.js 向けの手順に従って設定を行ってください。詳細については、Cloud Pub/Sub Node.js API のリファレンス ドキュメントをご覧ください。

// Imports the Google Cloud client library
const {PubSub} = require('@google-cloud/pubsub');

// Creates a client
const pubsub = new PubSub();

/**
 * TODO(developer): Uncomment the following line to run the sample.
 */
// const topicName = 'my-topic';

// Retrieves the IAM policy for the topic
const [policy] = await pubsub.topic(topicName).iam.getPolicy();
console.log(`Policy for topic: %j.`, policy.bindings);

PHP

このサンプルを試す前に、Cloud Pub/Sub クイックスタート: クライアント ライブラリの使用にある PHP 向けの手順に従って設定を行ってください。詳細については、Cloud Pub/Sub PHP API のリファレンス ドキュメントをご覧ください。

use Google\Cloud\PubSub\PubSubClient;

/**
 * Prints the policy for a Pub/Sub topic.
 *
 * @param string $projectId  The Google project ID.
 * @param string $topicName  The Pub/Sub topic name.
 */
function get_topic_policy($projectId, $topicName)
{
    $pubsub = new PubSubClient([
        'projectId' => $projectId,
    ]);
    $topic = $pubsub->topic($topicName);
    $policy = $topic->iam()->policy();
    print_r($policy);
}

Python

このサンプルを試す前に、Cloud Pub/Sub クイックスタート: クライアント ライブラリの使用にある Python 向けの手順に従って設定を行ってください。詳細については、Cloud Pub/Sub Python API のリファレンス ドキュメントをご覧ください。

client = pubsub_v1.PublisherClient()
topic_path = client.topic_path(project, topic_name)

policy = client.get_iam_policy(topic_path)

print('Policy for topic {}:'.format(topic_path))
for binding in policy.bindings:
    print('Role: {}, Members: {}'.format(binding.role, binding.members))

Ruby

このサンプルを試す前に、Cloud Pub/Sub クイックスタート: クライアント ライブラリの使用にある Ruby 向けの手順に従って設定を行ってください。詳細については、Cloud Pub/Sub Ruby API のリファレンス ドキュメントをご覧ください。

# project_id = "Your Google Cloud Project ID"
# topic_name = "Your Pubsub topic name"
require "google/cloud/pubsub"

pubsub = Google::Cloud::Pubsub.new project: project_id

topic  = pubsub.topic topic_name
policy = topic.policy

puts "Topic policy:"
puts policy.roles

ポリシーの設定

setIamPolicy() メソッドを使用すると、ポリシーをリソースに接続できます。setIamPolicy() メソッドは SetIamPolicyRequest を受け取ります。これは、ポリシーとポリシーを設定する対象のリソースを含みます。これにより、結果のポリシーが返されます。

サブスクリプションにポリシーを設定するためのサンプルコードを以下に示します。

C#

このサンプルを試す前に、Cloud Pub/Sub クイックスタート: クライアント ライブラリの使用にある C# 向けの手順に従って設定を行ってください。詳細については、Cloud Pub/Sub C# API のリファレンス ドキュメントをご覧ください。

Policy policy = new Policy
{
    Bindings =
    {
        new Binding { Role = roleToBeAddedToPolicy,
            Members = { member } }
    }
};
SetIamPolicyRequest request = new SetIamPolicyRequest
{
    Resource = new SubscriptionName(projectId, subscriptionId).ToString(),
    Policy = policy
};
Policy response = publisher.SetIamPolicy(request);
Console.WriteLine($"Subscription IAM Policy updated: {response}");

gcloud コマンド

1. サブスクリプションのポリシーを取得します。

gcloud beta pubsub subscriptions get-iam-policy projects/{your_project}/subscriptions/ \
{your_subscription} --format json > subscription_policy.json

2. subscription_policy.json を開き、適切なメンバーに適切な役割を与えてバインディングを更新します。subscription_policy.json ファイルの操作について詳しくは、Cloud Identity and Access Management ポリシー ドキュメントをご覧ください。

    {
      "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 beta pubsub subscriptions set-iam-policy projects/{your_project}/subscriptions/ \
{your_subscription} subscription_policy.json

Go

このサンプルを試す前に、Cloud Pub/Sub クイックスタート: クライアント ライブラリの使用にある Go 向けの手順に従って設定を行ってください。 詳細については、Cloud Pub/Sub Go API のリファレンス ドキュメントをご覧ください。

sub := c.Subscription(subName)
policy, err := sub.IAM().Policy(ctx)
if err != nil {
	return err
}
// Other valid prefixes are "serviceAccount:", "user:"
// See the documentation for more values.
policy.Add(iam.AllUsers, iam.Viewer)
policy.Add("group:cloud-logs@google.com", iam.Editor)
if err := sub.IAM().SetPolicy(ctx, policy); err != nil {
	return err
}
// NOTE: It may be necessary to retry this operation if IAM policies are
// being modified concurrently. SetPolicy will return an error if the policy
// was modified since it was retrieved.

Java

このサンプルを試す前に、Cloud Pub/Sub クイックスタート: クライアント ライブラリの使用にある Java 向けの手順に従って設定を行ってください。詳細については、Cloud Pub/Sub Java API のリファレンス ドキュメントをご覧ください。

try (SubscriptionAdminClient subscriptionAdminClient = SubscriptionAdminClient.create()) {
  ProjectSubscriptionName subscriptionName =
      ProjectSubscriptionName.of(projectId, subscriptionId);
  Policy policy = subscriptionAdminClient.getIamPolicy(subscriptionName.toString());
  // Create a role => members binding
  Binding binding =
      Binding.newBuilder()
          .setRole(Role.viewer().toString())
          .addMembers(Identity.allAuthenticatedUsers().toString())
          .build();
  // Update policy
  Policy updatedPolicy = policy.toBuilder().addBindings(binding).build();

  updatedPolicy =
      subscriptionAdminClient.setIamPolicy(subscriptionName.toString(), updatedPolicy);
  return updatedPolicy;
}

Node.js

このサンプルを試す前に、Cloud Pub/Sub クイックスタート: クライアント ライブラリの使用にある Node.js 向けの手順に従って設定を行ってください。詳細については、Cloud Pub/Sub Node.js API のリファレンス ドキュメントをご覧ください。

// Imports the Google Cloud client library
const {PubSub} = require('@google-cloud/pubsub');

// Creates a client
const pubsub = new PubSub();

/**
 * TODO(developer): Uncomment the following line to run the sample.
 */
// const subscriptionName = 'my-sub';

// The new IAM policy
const newPolicy = {
  bindings: [
    {
      // Add a group as editors
      role: `roles/pubsub.editor`,
      members: [`group:cloud-logs@google.com`],
    },
    {
      // Add all users as viewers
      role: `roles/pubsub.viewer`,
      members: [`allUsers`],
    },
  ],
};

// Updates the IAM policy for the subscription
const [updatedPolicy] = await pubsub
  .subscription(subscriptionName)
  .iam.setPolicy(newPolicy);
console.log(`Updated policy for subscription: %j`, updatedPolicy.bindings);

PHP

このサンプルを試す前に、Cloud Pub/Sub クイックスタート: クライアント ライブラリの使用にある PHP 向けの手順に従って設定を行ってください。詳細については、Cloud Pub/Sub PHP API のリファレンス ドキュメントをご覧ください。

use Google\Cloud\PubSub\PubSubClient;

/**
 * Adds a user to the policy for a Pub/Sub subscription.
 *
 * @param string $projectId  The Google project ID.
 * @param string $subscriptionName  The Pub/Sub subscription name.
 * @param string $userEmail  The user email to add to the policy.
 */
function set_subscription_policy($projectId, $subscriptionName, $userEmail)
{
    $pubsub = new PubSubClient([
        'projectId' => $projectId,
    ]);
    $subscription = $pubsub->subscription($subscriptionName);
    $policy = $subscription->iam()->policy();
    $policy['bindings'][] = [
        'role' => 'roles/pubsub.subscriber',
        'members' => ['user:' . $userEmail]
    ];
    $subscription->iam()->setPolicy($policy);

    printf('User %s added to policy for %s' . PHP_EOL,
        $userEmail,
        $subscriptionName);
}

Python

このサンプルを試す前に、Cloud Pub/Sub クイックスタート: クライアント ライブラリの使用にある Python 向けの手順に従って設定を行ってください。詳細については、Cloud Pub/Sub Python API のリファレンス ドキュメントをご覧ください。

client = pubsub_v1.SubscriberClient()
subscription_path = client.subscription_path(project, subscription_name)

policy = client.get_iam_policy(subscription_path)

# Add all users as viewers.
policy.bindings.add(
    role='roles/pubsub.viewer',
    members=['allUsers'])

# Add a group as an editor.
policy.bindings.add(
    role='roles/editor',
    members=['group:cloud-logs@google.com'])

# Set the policy
policy = client.set_iam_policy(subscription_path, policy)

print('IAM policy for subscription {} set: {}'.format(
    subscription_name, policy))

Ruby

このサンプルを試す前に、Cloud Pub/Sub クイックスタート: クライアント ライブラリの使用にある Ruby 向けの手順に従って設定を行ってください。詳細については、Cloud Pub/Sub Ruby API のリファレンス ドキュメントをご覧ください。

# project_id        = "Your Google Cloud Project ID"
# subscription_name = "Your Pubsub subscription name"
require "google/cloud/pubsub"

pubsub = Google::Cloud::Pubsub.new project: project_id

subscription = pubsub.subscription subscription_name
subscription.policy do |policy|
  policy.add "roles/pubsub.subscriber",
             "serviceAccount:account-name@project-name.iam.gserviceaccount.com"
end

トピックにポリシーを設定するためのサンプルコードを以下に示します。

C#

このサンプルを試す前に、Cloud Pub/Sub クイックスタート: クライアント ライブラリの使用にある C# 向けの手順に従って設定を行ってください。詳細については、Cloud Pub/Sub C# API のリファレンス ドキュメントをご覧ください。

Policy policy = new Policy
{
    Bindings =
        {
            new Binding { Role = roleToBeAddedToPolicy,
                Members = { member } }
        }
};
SetIamPolicyRequest request = new SetIamPolicyRequest
{
    Resource = new TopicName(projectId, topicId).ToString(),
    Policy = policy
};
Policy response = publisher.SetIamPolicy(request);
Console.WriteLine($"Topic IAM Policy updated: {response}");

gcloud コマンド

1. トピックのポリシーを取得します。

gcloud beta pubsub topics get-iam-policy projects/{your_project}/topics/{your_topic} \
--format json > topic_policy.json

2. topic_policy.json を開き、適切なメンバーに適切な役割を与えてバインディングを更新します。subscription_policy.json ファイルの操作について詳しくは、Cloud Identity and Access Management ポリシー ドキュメントをご覧ください。

    {
      "etag": "BwUjMhCsNvY=",
      "bindings": [
        {
          "role": "roles/pubsub.editor",
          "members": [
            "user:user-1@gmail.com",
            "user:user-2@gmail.com"
          ]
        }
      ]
    }

3. 新しいトピックのポリシーを適用します。

gcloud beta pubsub topics set-iam-policy projects/{your_project}/ \
topics/{your_topic} topic_policy.json

Go

このサンプルを試す前に、Cloud Pub/Sub クイックスタート: クライアント ライブラリの使用にある Go 向けの手順に従って設定を行ってください。 詳細については、Cloud Pub/Sub Go API のリファレンス ドキュメントをご覧ください。

topic := c.Topic(topicName)
policy, err := topic.IAM().Policy(ctx)
if err != nil {
	return err
}
// Other valid prefixes are "serviceAccount:", "user:"
// See the documentation for more values.
policy.Add(iam.AllUsers, iam.Viewer)
policy.Add("group:cloud-logs@google.com", iam.Editor)
if err := topic.IAM().SetPolicy(ctx, policy); err != nil {
	log.Fatalf("SetPolicy: %v", err)
}
// NOTE: It may be necessary to retry this operation if IAM policies are
// being modified concurrently. SetPolicy will return an error if the policy
// was modified since it was retrieved.

Java

このサンプルを試す前に、Cloud Pub/Sub クイックスタート: クライアント ライブラリの使用にある Java 向けの手順に従って設定を行ってください。詳細については、Cloud Pub/Sub Java API のリファレンス ドキュメントをご覧ください。

try (TopicAdminClient topicAdminClient = TopicAdminClient.create()) {
  String topicName = ProjectTopicName.format(projectId, topicId);
  Policy policy = topicAdminClient.getIamPolicy(topicName);
  // add role -> members binding
  Binding binding =
      Binding.newBuilder()
          .setRole(Role.viewer().toString())
          .addMembers(Identity.allAuthenticatedUsers().toString())
          .build();
  // create updated policy
  Policy updatedPolicy = Policy.newBuilder(policy).addBindings(binding).build();
  updatedPolicy = topicAdminClient.setIamPolicy(topicName, updatedPolicy);
  return updatedPolicy;
}

Node.js

このサンプルを試す前に、Cloud Pub/Sub クイックスタート: クライアント ライブラリの使用にある Node.js 向けの手順に従って設定を行ってください。詳細については、Cloud Pub/Sub Node.js API のリファレンス ドキュメントをご覧ください。

// Imports the Google Cloud client library
const {PubSub} = require('@google-cloud/pubsub');

// Creates a client
const pubsub = new PubSub();

/**
 * TODO(developer): Uncomment the following line to run the sample.
 */
// const topicName = 'my-topic';

// The new IAM policy
const newPolicy = {
  bindings: [
    {
      // Add a group as editors
      role: `roles/pubsub.editor`,
      members: [`group:cloud-logs@google.com`],
    },
    {
      // Add all users as viewers
      role: `roles/pubsub.viewer`,
      members: [`allUsers`],
    },
  ],
};

// Updates the IAM policy for the topic
const [updatedPolicy] = await pubsub
  .topic(topicName)
  .iam.setPolicy(newPolicy);
console.log(`Updated policy for topic: %j`, updatedPolicy.bindings);

PHP

このサンプルを試す前に、Cloud Pub/Sub クイックスタート: クライアント ライブラリの使用にある PHP 向けの手順に従って設定を行ってください。詳細については、Cloud Pub/Sub PHP API のリファレンス ドキュメントをご覧ください。

use Google\Cloud\PubSub\PubSubClient;

/**
 * Adds a user to the policy for a Pub/Sub topic.
 *
 * @param string $projectId  The Google project ID.
 * @param string $topicName  The Pub/Sub topic name.
 * @param string $userEmail  The user email to add to the policy.
 */
function set_topic_policy($projectId, $topicName, $userEmail)
{
    $pubsub = new PubSubClient([
        'projectId' => $projectId,
    ]);
    $topic = $pubsub->topic($topicName);
    $policy = $topic->iam()->policy();
    $policy['bindings'][] = [
        'role' => 'roles/pubsub.publisher',
        'members' => ['user:' . $userEmail]
    ];
    $topic->iam()->setPolicy($policy);

    printf('User %s added to policy for %s' . PHP_EOL,
        $userEmail,
        $topicName);
}

Python

このサンプルを試す前に、Cloud Pub/Sub クイックスタート: クライアント ライブラリの使用にある Python 向けの手順に従って設定を行ってください。詳細については、Cloud Pub/Sub Python API のリファレンス ドキュメントをご覧ください。

client = pubsub_v1.PublisherClient()
topic_path = client.topic_path(project, topic_name)

policy = client.get_iam_policy(topic_path)

# Add all users as viewers.
policy.bindings.add(
    role='roles/pubsub.viewer',
    members=['allUsers'])

# Add a group as a publisher.
policy.bindings.add(
    role='roles/pubsub.publisher',
    members=['group:cloud-logs@google.com'])

# Set the policy
policy = client.set_iam_policy(topic_path, policy)

print('IAM policy for topic {} set: {}'.format(
    topic_name, policy))

Ruby

このサンプルを試す前に、Cloud Pub/Sub クイックスタート: クライアント ライブラリの使用にある Ruby 向けの手順に従って設定を行ってください。詳細については、Cloud Pub/Sub Ruby API のリファレンス ドキュメントをご覧ください。

# project_id = "Your Google Cloud Project ID"
# topic_name = "Your Pubsub topic name"
require "google/cloud/pubsub"

pubsub = Google::Cloud::Pubsub.new project: project_id

topic = pubsub.topic topic_name
topic.policy do |policy|
  policy.add "roles/pubsub.publisher",
             "serviceAccount:account_name@project_name.iam.gserviceaccount.com"
end

権限のテスト

testIamPermissions() メソッドを使用して、所定のリソースに対して呼び出し元が持っている権限を確認できます。これはパラメータとしてリソース名と一連の権限を取得し、呼び出し元が持っている権限のサブセットを返します。

サブスクリプションに対する権限をテストするためのサンプルコードを以下に示します。

C#

このサンプルを試す前に、Cloud Pub/Sub クイックスタート: クライアント ライブラリの使用にある C# 向けの手順に従って設定を行ってください。詳細については、Cloud Pub/Sub C# API のリファレンス ドキュメントをご覧ください。

List<string> permissions = new List<string>();
permissions.Add("pubsub.subscriptions.get");
permissions.Add("pubsub.subscriptions.update");
TestIamPermissionsRequest request = new TestIamPermissionsRequest
{
    Resource = new SubscriptionName(_projectId, subscriptionId).ToString(),
    Permissions = { permissions }
};
TestIamPermissionsResponse response = publisher.TestIamPermissions(request);
return response;

gcloud コマンド

gcloud iam list-testable-permissions https://pubsub.googleapis.com/v1/projects/ \
{your_project}/subscriptions/{your_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

このサンプルを試す前に、Cloud Pub/Sub クイックスタート: クライアント ライブラリの使用にある Go 向けの手順に従って設定を行ってください。 詳細については、Cloud Pub/Sub Go API のリファレンス ドキュメントをご覧ください。

sub := c.Subscription(subName)
perms, err := sub.IAM().TestPermissions(ctx, []string{
	"pubsub.subscriptions.consume",
	"pubsub.subscriptions.update",
})
if err != nil {
	return nil, err
}
for _, perm := range perms {
	log.Printf("Allowed: %v", perm)
}

Java

このサンプルを試す前に、Cloud Pub/Sub クイックスタート: クライアント ライブラリの使用にある Java 向けの手順に従って設定を行ってください。詳細については、Cloud Pub/Sub Java API のリファレンス ドキュメントをご覧ください。

try (TopicAdminClient topicAdminClient = TopicAdminClient.create()) {
  List<String> permissions = new LinkedList<>();
  permissions.add("pubsub.subscriptions.get");
  ProjectSubscriptionName subscriptionName =
      ProjectSubscriptionName.of(projectId, subscriptionId);
  TestIamPermissionsResponse testedPermissions =
      topicAdminClient.testIamPermissions(subscriptionName.toString(), permissions);
  return testedPermissions;
}

Node.js

このサンプルを試す前に、Cloud Pub/Sub クイックスタート: クライアント ライブラリの使用にある Node.js 向けの手順に従って設定を行ってください。詳細については、Cloud Pub/Sub Node.js API のリファレンス ドキュメントをご覧ください。

// Imports the Google Cloud client library
const {PubSub} = require('@google-cloud/pubsub');

// Creates a client
const pubsub = new PubSub();

/**
 * TODO(developer): Uncomment the following line to run the sample.
 */
// const subscriptionName = 'my-sub';

const permissionsToTest = [
  `pubsub.subscriptions.consume`,
  `pubsub.subscriptions.update`,
];

// Tests the IAM policy for the specified subscription
const [permissions] = await pubsub
  .subscription(subscriptionName)
  .iam.testPermissions(permissionsToTest);
console.log(`Tested permissions for subscription: %j`, permissions);

PHP

このサンプルを試す前に、Cloud Pub/Sub クイックスタート: クライアント ライブラリの使用にある PHP 向けの手順に従って設定を行ってください。詳細については、Cloud Pub/Sub PHP API のリファレンス ドキュメントをご覧ください。

use Google\Cloud\PubSub\PubSubClient;

/**
 * Prints the permissions of a subscription.
 *
 * @param string $projectId  The Google project ID.
 * @param string $subscriptionName  The Pub/Sub subscription name.
 */
function test_subscription_permissions($projectId, $subscriptionName)
{
    $pubsub = new PubSubClient([
        'projectId' => $projectId,
    ]);
    $subscription = $pubsub->subscription($subscriptionName);
    $permissions = $subscription->iam()->testPermissions([
        'pubsub.subscriptions.consume',
        'pubsub.subscriptions.update'
    ]);
    foreach ($permissions as $permission) {
        printf('Permission: %s' . PHP_EOL, $permission);
    }
}

Python

このサンプルを試す前に、Cloud Pub/Sub クイックスタート: クライアント ライブラリの使用にある Python 向けの手順に従って設定を行ってください。詳細については、Cloud Pub/Sub Python API のリファレンス ドキュメントをご覧ください。

client = pubsub_v1.SubscriberClient()
subscription_path = client.subscription_path(project, subscription_name)

permissions_to_check = [
    'pubsub.subscriptions.consume',
    'pubsub.subscriptions.update'
]

allowed_permissions = client.test_iam_permissions(
    subscription_path, permissions_to_check)

print('Allowed permissions for subscription {}: {}'.format(
    subscription_path, allowed_permissions))

Ruby

このサンプルを試す前に、Cloud Pub/Sub クイックスタート: クライアント ライブラリの使用にある Ruby 向けの手順に従って設定を行ってください。詳細については、Cloud Pub/Sub Ruby API のリファレンス ドキュメントをご覧ください。

# project_id        = "Your Google Cloud Project ID"
# subscription_name = "Your Pubsub subscription name"
require "google/cloud/pubsub"

pubsub = Google::Cloud::Pubsub.new project: project_id

subscription = pubsub.subscription subscription_name
permissions  = subscription.test_permissions "pubsub.subscriptions.consume",
                                             "pubsub.subscriptions.update"

puts "Permission to consume" if permissions.include? "pubsub.subscriptions.consume"
puts "Permission to update" if permissions.include? "pubsub.subscriptions.update"

トピックに対する権限をテストするためのサンプルコードを以下に示します。

C#

このサンプルを試す前に、Cloud Pub/Sub クイックスタート: クライアント ライブラリの使用にある C# 向けの手順に従って設定を行ってください。詳細については、Cloud Pub/Sub C# API のリファレンス ドキュメントをご覧ください。

List<string> permissions = new List<string>();
permissions.Add("pubsub.topics.get");
permissions.Add("pubsub.topics.update");
TestIamPermissionsRequest request = new TestIamPermissionsRequest
{
    Resource = new TopicName(_projectId, topicId).ToString(),
    Permissions = { permissions }
};
TestIamPermissionsResponse response = publisher.TestIamPermissions(request);
return response;

gcloud コマンド

gcloud beta iam list-testable-permissions https://pubsub.googleapis.com/v1/projects/ \
{your_project}/subscriptions/{your_subscription} --format json

出力

  [
    {
      "name": "pubsub.topics.attachSubscription",
      "stage": "GA"
    },
    {
      "name": "pubsub.topics.delete",
      "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

このサンプルを試す前に、Cloud Pub/Sub クイックスタート: クライアント ライブラリの使用にある Go 向けの手順に従って設定を行ってください。 詳細については、Cloud Pub/Sub Go API のリファレンス ドキュメントをご覧ください。

topic := c.Topic(topicName)
perms, err := topic.IAM().TestPermissions(ctx, []string{
	"pubsub.topics.publish",
	"pubsub.topics.update",
})
if err != nil {
	return nil, err
}
for _, perm := range perms {
	log.Printf("Allowed: %v", perm)
}

Java

このサンプルを試す前に、Cloud Pub/Sub クイックスタート: クライアント ライブラリの使用にある Java 向けの手順に従って設定を行ってください。詳細については、Cloud Pub/Sub Java API のリファレンス ドキュメントをご覧ください。

try (TopicAdminClient topicAdminClient = TopicAdminClient.create()) {
  List<String> permissions = new LinkedList<>();
  permissions.add("pubsub.topics.get");
  ProjectTopicName topicName = ProjectTopicName.of(projectId, topicId);
  TestIamPermissionsResponse testedPermissions =
      topicAdminClient.testIamPermissions(topicName.toString(), permissions);
  return testedPermissions;
}

Node.js

このサンプルを試す前に、Cloud Pub/Sub クイックスタート: クライアント ライブラリの使用にある Node.js 向けの手順に従って設定を行ってください。詳細については、Cloud Pub/Sub Node.js API のリファレンス ドキュメントをご覧ください。

// Imports the Google Cloud client library
const {PubSub} = require('@google-cloud/pubsub');

// Creates a client
const pubsub = new PubSub();

/**
 * TODO(developer): Uncomment the following line to run the sample.
 */
// const topicName = 'my-topic';

const permissionsToTest = [
  `pubsub.topics.attachSubscription`,
  `pubsub.topics.publish`,
  `pubsub.topics.update`,
];

// Tests the IAM policy for the specified topic
const [permissions] = await pubsub
  .topic(topicName)
  .iam.testPermissions(permissionsToTest);
console.log(`Tested permissions for topic: %j`, permissions);

PHP

このサンプルを試す前に、Cloud Pub/Sub クイックスタート: クライアント ライブラリの使用にある PHP 向けの手順に従って設定を行ってください。詳細については、Cloud Pub/Sub PHP API のリファレンス ドキュメントをご覧ください。

use Google\Cloud\PubSub\PubSubClient;

/**
 * Prints the permissions of a topic.
 *
 * @param string $projectId  The Google project ID.
 * @param string $topicName  The Pub/Sub topic name.
 */
function test_topic_permissions($projectId, $topicName)
{
    $pubsub = new PubSubClient([
        'projectId' => $projectId,
    ]);
    $topic = $pubsub->topic($topicName);
    $permissions = $topic->iam()->testPermissions([
        'pubsub.topics.attachSubscription',
        'pubsub.topics.publish',
        'pubsub.topics.update'
    ]);
    foreach ($permissions as $permission) {
        printf('Permission: %s' . PHP_EOL, $permission);
    }
}

Python

このサンプルを試す前に、Cloud Pub/Sub クイックスタート: クライアント ライブラリの使用にある Python 向けの手順に従って設定を行ってください。詳細については、Cloud Pub/Sub Python API のリファレンス ドキュメントをご覧ください。

client = pubsub_v1.PublisherClient()
topic_path = client.topic_path(project, topic_name)

permissions_to_check = [
    'pubsub.topics.publish',
    'pubsub.topics.update'
]

allowed_permissions = client.test_iam_permissions(
    topic_path, permissions_to_check)

print('Allowed permissions for topic {}: {}'.format(
    topic_path, allowed_permissions))

Ruby

このサンプルを試す前に、Cloud Pub/Sub クイックスタート: クライアント ライブラリの使用にある Ruby 向けの手順に従って設定を行ってください。詳細については、Cloud Pub/Sub Ruby API のリファレンス ドキュメントをご覧ください。

# project_id = "Your Google Cloud Project ID"
# topic_name = "Your Pubsub topic name"
require "google/cloud/pubsub"

pubsub = Google::Cloud::Pubsub.new project: project_id

topic       = pubsub.topic topic_name
permissions = topic.test_permissions "pubsub.topics.attachSubscription",
                                     "pubsub.topics.publish", "pubsub.topics.update"

puts "Permission to attach subscription" if permissions.include? "pubsub.topics.attachSubscription"
puts "Permission to publish" if permissions.include? "pubsub.topics.publish"
puts "Permission to update" if permissions.include? "pubsub.topics.update"

サンプル ユースケース: プロジェクト間通信

Cloud Pub/Sub IAM は、プロジェクト間の通信でアクセス権を適切に調整するのに便利です。たとえば、Cloud Project A のサービス アカウントで Cloud Project B のトピックにメッセージをパブリッシュする必要があるとします。これは、Cloud Project B でサービス アカウントに編集権限を付与することで行えます。しかし、この手法では詳細な調整を行えないことがあります。IAM API を使用すれば、アクセスレベルをより詳細に調整できます。

たとえばこのスニペットでは、setIamPolicy() メソッドと用意されている topic_policy.json ファイルを使用して、トピック projects/myproject/topics/mytopic でのパブリッシャーの役割をサービス アカウント foobar@appspot.gserviceaccount.com に付与します。

gcloud beta pubsub topics set-iam-policy projects/{your_project}/topics/ \
{your_topic} topic_policy.json

出力:

Updated IAM policy for topic [your-topic].
bindings:
- members:
  - serviceAccount:foobar@appspot.gserviceaccount.com
  role: roles/pubsub.publisher
etag: BwWGrQYX6R4=

部分的に可用性を維持する動作

承認チェックは Cloud IAM サブシステムによって異なります。データ オペレーション(公開、メッセージの使用)のレスポンスのレイテンシを低くするため、システムがキャッシュ内の IAM ポリシーにフォールバックする場合があります。変更が有効になるタイミングについては Cloud IAM のドキュメントをご覧ください。

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Cloud Pub/Sub ドキュメント