アクセス制御

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

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

概要

Google Cloud Pub/Sub は Google Cloud Identity and Access Management(IAM)を使用してアクセスを制御します。

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

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

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

すべての Google Cloud Pub/Sub メソッドでは、発信者が必要な権限を持っている必要があります。Google Cloud Pub/Sub IAM でサポートされる権限と役割のリストについては、次のセクションを参照してください。

権限と役割

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

必要な権限

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

メソッド 必要な権限
projects.subscriptions.acknowledge リクエストされたサブスクリプションに対する pubsub.subscriptions.consume
projects.subscriptions.create 含まれている Cloud トピックに対する pubsub.subscriptions.create、およびリクエストされたトピックに対する pubsub.topics.attachSubscription
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

役割

次の表に、Google Cloud Pub/Sub 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 トピックのページに移動し、Google Cloud Pub/Sub が有効なプロジェクトを選択します。
  2. 権限を設定するトピックまたはサブスクリプションを選択します。

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

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

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

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

Google Cloud Pub/Sub IAM API を使用して Cloud Project レベルでポリシーを管理することはできません。

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

ポリシーの取得

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

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

プロトコル

リクエスト:

GET https://pubsub.googleapis.com/v1/projects/myproject/subscriptions/mysubscription:getIamPolicy?key={YOUR_API_KEY}

レスポンス:

200 OK
{
  "etag": "AxxxxxxY/c=",
  "bindings": [
    {
      "role": "roles/pubsub.admin",
      "members": [
        "user:minka@example.com"
      ]
    },
    {
      "role": "roles/pubsub.editor",
      "members": [
        "user:trevor@example.com",
        "user:nate@example.com"
      ]
    }
  ]
}

C#

Cloud Pub/Sub クライアントのインストールと作成について、詳しくは Cloud Pub/Sub クライアント ライブラリをご覧ください。

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

Go

Cloud Pub/Sub クライアントのインストールと作成について、詳しくは Cloud Pub/Sub クライアント ライブラリをご覧ください。

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 クライアントのインストールと作成について、詳しくは Cloud Pub/Sub クライアント ライブラリをご覧ください。

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

Node.js

Cloud Pub/Sub クライアントのインストールと作成について、詳しくは Cloud Pub/Sub クライアント ライブラリをご覧ください。

// 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 = 'your-subscription';

// Retrieves the IAM policy for the subscription
pubsub
  .subscription(subscriptionName)
  .iam.getPolicy()
  .then(results => {
    const policy = results[0];
    console.log(`Policy for subscription: %j.`, policy.bindings);
  })
  .catch(err => {
    console.error('ERROR:', err);
  });

PHP

Cloud Pub/Sub クライアントのインストールと作成について、詳しくは Cloud Pub/Sub クライアント ライブラリをご覧ください。

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 クライアントのインストールと作成について、詳しくは Cloud Pub/Sub クライアント ライブラリをご覧ください。

def get_subscription_policy(project, subscription_name):
    """Prints the IAM policy for the given subscription."""
    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 クライアントのインストールと作成について、詳しくは Cloud Pub/Sub クライアント ライブラリをご覧ください。

pubsub       = Google::Cloud::Pubsub.new project: "my-gcp-project-id"
subscription = pubsub.subscription "my-subscription"

policy = subscription.policy

puts "Subscription policy:"
puts policy.roles

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

プロトコル

リクエスト:

GET https://pubsub.googleapis.com/v1/projects/myproject/topics/mytopic:getIamPolicy?key={YOUR_API_KEY}

レスポンス:

200 OK
{
  "etag": "Awxxxxxxxxc=",
  "bindings": [
    {
      "role": "roles/viewer",
      "members": [
        "user:touki@example.com"
      ]
    }
  ]
}

C#

Cloud Pub/Sub クライアントのインストールと作成について、詳しくは Cloud Pub/Sub クライアント ライブラリをご覧ください。

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

Go

Cloud Pub/Sub クライアントのインストールと作成について、詳しくは Cloud Pub/Sub クライアント ライブラリをご覧ください。

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 クライアントのインストールと作成について、詳しくは Cloud Pub/Sub クライアント ライブラリをご覧ください。

try (TopicAdminClient topicAdminClient = TopicAdminClient.create()) {
  TopicName topicName = TopicName.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 クライアントのインストールと作成について、詳しくは Cloud Pub/Sub クライアント ライブラリをご覧ください。

// 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 = 'your-topic';

// Retrieves the IAM policy for the topic
pubsub
  .topic(topicName)
  .iam.getPolicy()
  .then(results => {
    const policy = results[0];
    console.log(`Policy for topic: %j.`, policy.bindings);
  })
  .catch(err => {
    console.error('ERROR:', err);
  });

PHP

Cloud Pub/Sub クライアントのインストールと作成について、詳しくは Cloud Pub/Sub クライアント ライブラリをご覧ください。

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 クライアントのインストールと作成について、詳しくは Cloud Pub/Sub クライアント ライブラリをご覧ください。

def get_topic_policy(project, topic_name):
    """Prints the IAM policy for the given topic."""
    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 クライアントのインストールと作成について、詳しくは Cloud Pub/Sub クライアント ライブラリをご覧ください。

pubsub = Google::Cloud::Pubsub.new project: "my-gcp-project-id"
topic  = pubsub.topic "my-topic"

policy = topic.policy

puts "Topic policy:"
puts policy.roles

ポリシーの設定

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

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

プロトコル

リクエスト:

POST https://pubsub.googleapis.com/v1/projects/myproject/subscriptions/mysubscription:setIamPolicy?key={YOUR_API_KEY}
{
  "policy": {
    "bindings": [
      {
        "role": "roles/pubsub.admin",
        "members": [
          "user:rowan@example.com"
        ]
      },
      {
        "role": "roles/pubsub.editor",
        "members": [
          "user:trevor@example.com",
          "user:nate@example.com"
        ]
      }
    ]
  }
}

レスポンス:

200 OK
{
  "etag": "Awxxxxxxxxc=",
  "bindings": [
    {
      "role": "roles/pubsub.admin",
      "members": [
        "user:rowan@example.com"
      ]
    },
    {
      "role": "roles/pubsub.editor",
      "members": [
        "user:trevor@example.com",
        "user:nate@example.com"
      ]
    }
  ]
}

C#

Cloud Pub/Sub クライアントのインストールと作成について、詳しくは Cloud Pub/Sub クライアント ライブラリをご覧ください。

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}");

Go

Cloud Pub/Sub クライアントのインストールと作成について、詳しくは Cloud Pub/Sub クライアント ライブラリをご覧ください。

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 クライアントのインストールと作成について、詳しくは Cloud Pub/Sub クライアント ライブラリをご覧ください。

try (SubscriptionAdminClient subscriptionAdminClient = SubscriptionAdminClient.create()) {
  SubscriptionName subscriptionName = SubscriptionName.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 クライアントのインストールと作成について、詳しくは Cloud Pub/Sub クライアント ライブラリをご覧ください。

// 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 = 'your-subscription';

// 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
pubsub
  .subscription(subscriptionName)
  .iam.setPolicy(newPolicy)
  .then(results => {
    const updatedPolicy = results[0];
    console.log(
      `Updated policy for subscription: %j`,
      updatedPolicy.bindings
    );
  })
  .catch(err => {
    console.error('ERROR:', err);
  });

PHP

Cloud Pub/Sub クライアントのインストールと作成について、詳しくは Cloud Pub/Sub クライアント ライブラリをご覧ください。

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 クライアントのインストールと作成について、詳しくは Cloud Pub/Sub クライアント ライブラリをご覧ください。

def set_subscription_policy(project, subscription_name):
    """Sets the IAM policy for a topic."""
    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 クライアントのインストールと作成について、詳しくは Cloud Pub/Sub クライアント ライブラリをご覧ください。

pubsub       = Google::Cloud::Pubsub.new project: "my-gcp-project-id"
subscription = pubsub.subscription "my-subscription"

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

puts subscription.policy.roles

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

プロトコル

リクエスト:

POST https://pubsub.googleapis.com/v1/projects/myproject/topics/mytopic:setIamPolicy?key={YOUR_API_KEY}
{
  "policy": {
    "bindings": [
      {
        "role": "roles/pubsub.admin",
        "members": [
          "user:lindy@example.com"
        ]
      },
      {
        "role": "roles/pubsub.viewer",
        "members": [
          "user:penny@example.com"
        ]
      }
    ]
  }
}

レスポンス:

200 OK
{
  "etag": "Axxxxxxz+pc=",
  "bindings": [
    {
      "role": "roles/pubsub.admin",
        "members": [
        "user:lindy@example.com"
      ]
    },
    {
      "role": "roles/pubsub.viewer",
        "members": [
        "user:penny@example.com"
      ]
    }
  ]
}

C#

Cloud Pub/Sub クライアントのインストールと作成について、詳しくは Cloud Pub/Sub クライアント ライブラリをご覧ください。

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}");

Go

Cloud Pub/Sub クライアントのインストールと作成について、詳しくは Cloud Pub/Sub クライアント ライブラリをご覧ください。

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 クライアントのインストールと作成について、詳しくは Cloud Pub/Sub クライアント ライブラリをご覧ください。

try (TopicAdminClient topicAdminClient = TopicAdminClient.create()) {
  String topicName = TopicName.of(projectId, topicId).toString();
  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 クライアントのインストールと作成について、詳しくは Cloud Pub/Sub クライアント ライブラリをご覧ください。

// 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 = 'your-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
pubsub
  .topic(topicName)
  .iam.setPolicy(newPolicy)
  .then(results => {
    const updatedPolicy = results[0];
    console.log(`Updated policy for topic: %j`, updatedPolicy.bindings);
  })
  .catch(err => {
    console.error('ERROR:', err);
  });

PHP

Cloud Pub/Sub クライアントのインストールと作成について、詳しくは Cloud Pub/Sub クライアント ライブラリをご覧ください。

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 クライアントのインストールと作成について、詳しくは Cloud Pub/Sub クライアント ライブラリをご覧ください。

def set_topic_policy(project, topic_name):
    """Sets the IAM policy for a topic."""
    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 クライアントのインストールと作成について、詳しくは Cloud Pub/Sub クライアント ライブラリをご覧ください。

pubsub = Google::Cloud::Pubsub.new project: "my-gcp-project-id"
topic  = pubsub.topic "my-topic"

policy = topic.policy do |p|
  p.add "roles/pubsub.publisher",
        "serviceAccount:account-name@other-project.iam.gserviceaccount.com"
end

puts topic.policy.roles

権限のテスト

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

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

プロトコル

リクエスト:

POST https://pubsub.googleapis.com/v1/projects/myproject/subscriptions/mysubscription:testIamPermissions?key={YOUR_API_KEY}
{
  "permissions": [
    "pubsub.subscriptions.consume",
    "pubsub.subscriptions.update"
  ]
}

レスポンス:

200 OK
{
  "permissions": [
    "pubsub.subscriptions.consume"
  ]
}

C#

Cloud Pub/Sub クライアントのインストールと作成について、詳しくは Cloud Pub/Sub クライアント ライブラリをご覧ください。

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;

Go

Cloud Pub/Sub クライアントのインストールと作成について、詳しくは Cloud Pub/Sub クライアント ライブラリをご覧ください。

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 クライアントのインストールと作成について、詳しくは Cloud Pub/Sub クライアント ライブラリをご覧ください。

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

Node.js

Cloud Pub/Sub クライアントのインストールと作成について、詳しくは Cloud Pub/Sub クライアント ライブラリをご覧ください。

// 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 = 'your-subscription';

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

// Tests the IAM policy for the specified subscription
pubsub
  .subscription(subscriptionName)
  .iam.testPermissions(permissionsToTest)
  .then(results => {
    const permissions = results[0];
    console.log(`Tested permissions for subscription: %j`, permissions);
  })
  .catch(err => {
    console.error('ERROR:', err);
  });

PHP

Cloud Pub/Sub クライアントのインストールと作成について、詳しくは Cloud Pub/Sub クライアント ライブラリをご覧ください。

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 クライアントのインストールと作成について、詳しくは Cloud Pub/Sub クライアント ライブラリをご覧ください。

def check_subscription_permissions(project, subscription_name):
    """Checks to which permissions are available on the given subscription."""
    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 クライアントのインストールと作成について、詳しくは Cloud Pub/Sub クライアント ライブラリをご覧ください。

pubsub       = Google::Cloud::Pubsub.new project: "my-gcp-project-id"
subscription = pubsub.subscription "my-subscription"

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

puts permissions.include? "pubsub.subscriptions.consume"
puts permissions.include? "pubsub.subscriptions.update"

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

プロトコル

リクエスト:

POST https://pubsub.googleapis.com/v1/projects/myproject/topics/mytopic:testIamPermissions?key={YOUR_API_KEY}
{
  "permissions": [
    "pubsub.topics.get",
    "pubsub.topics.update"
  ]
}

レスポンス:

200 OK
{
  "permissions": [
    "pubsub.topics.get"
  ]
}

C#

Cloud Pub/Sub クライアントのインストールと作成について、詳しくは Cloud Pub/Sub クライアント ライブラリをご覧ください。

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;

Go

Cloud Pub/Sub クライアントのインストールと作成について、詳しくは Cloud Pub/Sub クライアント ライブラリをご覧ください。

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 クライアントのインストールと作成について、詳しくは Cloud Pub/Sub クライアント ライブラリをご覧ください。

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

Node.js

Cloud Pub/Sub クライアントのインストールと作成について、詳しくは Cloud Pub/Sub クライアント ライブラリをご覧ください。

// 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 = 'your-topic';

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

// Tests the IAM policy for the specified topic
pubsub
  .topic(topicName)
  .iam.testPermissions(permissionsToTest)
  .then(results => {
    const permissions = results[0];
    console.log(`Tested permissions for topic: %j`, permissions);
  })
  .catch(err => {
    console.error('ERROR:', err);
  });

PHP

Cloud Pub/Sub クライアントのインストールと作成について、詳しくは Cloud Pub/Sub クライアント ライブラリをご覧ください。

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 クライアントのインストールと作成について、詳しくは Cloud Pub/Sub クライアント ライブラリをご覧ください。

def check_topic_permissions(project, topic_name):
    """Checks to which permissions are available on the given topic."""
    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 クライアントのインストールと作成について、詳しくは Cloud Pub/Sub クライアント ライブラリをご覧ください。

pubsub = Google::Cloud::Pubsub.new project: "my-gcp-project-id"
topic  = pubsub.topic "my-topic"

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

puts permissions.include? "pubsub.topics.attachSubscription"
puts permissions.include? "pubsub.topics.publish"
puts permissions.include? "pubsub.topics.update"

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

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

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

POST https://pubsub.googleapis.com/v1/projects/myproject/topics/mytopic:setIamPolicy?key={YOUR_API_KEY}
{
  "policy": {
    "bindings": [
      {
        "members": [
          "serviceAccount:foobar@appspot.gserviceaccount.com"
        ],
        "role": "roles/pubsub.publisher"
      }
    ]
  }
}

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

認証チェックの実行は、IAM サブシステムによって異なります。分散システムの場合、このシステムを使用できなくなる可能性はほとんどありません。可能性は低いものの IAM が使用不能になった場合、Google Cloud Pub/Sub ではフォールバックを行い、それによる影響を低減します。このフォールバック動作は、単に Google Cloud Pub/Sub を介したメッセージのフローを維持するだけであるため、フォールバックは pubsub.topics.publish 権限と pubsub.subscriptions.consume 権限の読み取りのみに使用されます。Google Cloud Pub/Sub は IAM サービスから正常に処理された最後の結果を記憶し、それを使用します。サーバーがフォールバック状態になると、Google Cloud Pub/Sub は Google Cloud Platform ステータス ダッシュボードで通知を出し、インシデントの期間を記録します。

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

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

Cloud Pub/Sub ドキュメント