액세스 제어

이 문서에서는 Cloud Pub/Sub에서 사용할 수 있는 액세스 제어 옵션을 설명합니다.

  1. 개요
  2. 권한 및 역할
    1. 필수 권한
    2. 역할
  3. GCP 콘솔을 통한 액세스 제어
  4. Cloud Pub/Sub IAM API를 통한 액세스 제어
    1. 정책 가져오기
    2. 정책 설정
    3. 권한 테스트
  5. 샘플 사용 사례: 프로젝트 간 통신
  6. 부분 가용성 동작

개요

Cloud Pub/Sub는 액세스 제어를 위해 Google Cloud ID 및 액세스 관리(Cloud IAM)를 사용합니다.

Cloud Pub/Sub에서는 프로젝트 수준과 개별 리소스 수준에서 액세스 제어를 구성할 수 있습니다. 예를 들면 다음과 같습니다.

  • 전체 Cloud 프로젝트가 아닌 주제별 또는 구독별로 액세스 권한 부여
  • 주제에 대한 메시지 게시, 구독에서 온 메시지 소비, 주제 또는 구독 미삭제 같은 제한된 기능으로 액세스 권한 부여
  • 프로젝트 내의 모든 Cloud Pub/Sub 리소스 액세스 권한을 개발자 그룹에 부여

IAM 및 IAM 기능에 대한 자세한 설명은 Cloud ID 및 액세스 관리 개발자 가이드를 참조하세요. 특히 IAM 정책 관리 섹션을 확인하시기 바랍니다.

모든 클라우드 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. 프로젝트 B의 주제 T에 대한 프로젝트 A의 구독을 만들려면 프로젝트 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 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/owner, roles/editor, roles/viewer 역할에는 다른 Google Cloud Platform 서비스의 권한도 포함됩니다.

GCP 콘솔을 통한 액세스 제어

GCP 콘솔로 주제와 프로젝트의 액세스 제어를 관리할 수 있습니다.

프로젝트 수준의 액세스 제어 설정 방법은 다음과 같습니다.

  1. Google Cloud Platform 콘솔에서 IAM 페이지를 엽니다.
  2. 프로젝트를 선택한 다음 계속을 클릭합니다.
  3. 구성원 추가를 클릭합니다.
  4. 이전에 어떤 IAM 역할도 부여하지 않은 새 구성원의 이메일 주소를 입력합니다.
  5. 드롭다운 메뉴에서 원하는 역할을 선택합니다.
  6. 추가를 클릭합니다.
  7. 부여한 역할 아래에 구성원이 나타나는지 확인합니다.

주제와 구독의 액세스 제어 설정 방법은 다음과 같습니다.

  1. GCP 콘솔의 Pub/Sub 주제 페이지로 이동한 다음 Cloud Pub/Sub를 설정한 프로젝트를 선택합니다.
  2. 권한을 설정할 주제나 구독을 선택합니다.

    한 번에 여러 주제에 대한 권한을 설정할 수 있습니다. 주제의 구독에 대한 권한을 설정하려면 주제를 펼친 다음 구독을 클릭해 자체 페이지에서 열어야 합니다.

  3. 권한을 클릭합니다. 권한 창이 화면 측면에 표시됩니다.
  4. 구성원 이름(복수 가능)을 입력하고, 오른쪽 드롭다운 메뉴에서 역할을 선택한 다음 추가를 클릭합니다.

Cloud Pub/Sub IAM API를 통한 액세스 제어

Cloud Pub/Sub IAM API를 사용하면 프로젝트의 개별 주제 및 구독에 대한 정책을 설정하고 가져오며, 특정 리소스에 대한 사용자의 권한을 테스트할 수 있습니다. 일반 Cloud Pub/Sub 메소드처럼 클라이언트 라이브러리나 API 탐색기를 통해, 또는 HTTP를 통해 바로 IAM 메소드를 호출할 수도 있습니다.

Cloud Pub/Sub IAM API로 클라우드 프로젝트 수준의 정책을 관리할 수는 없습니다.

다음 섹션에서는 정책을 설정하고 가져오는 방법과, 주어진 리소스에 대해 호출자가 보유한 권한을 테스트하는 방법을 예제를 통해 설명합니다.

정책 가져오기

메소드 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 빠른 시작의 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);

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

자바

이 샘플을 시도해 보기 전에 클라이언트 라이브러리를 사용하는 Cloud Pub/Sub 빠른 시작의 자바 설정 안내를 따르세요. 자세한 내용은 Cloud Pub/Sub 자바 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

다음은 주제에 대한 정책을 가져오는 샘플 코드입니다.

프로토콜

요청:

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 빠른 시작의 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);

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

자바

이 샘플을 시도해 보기 전에 클라이언트 라이브러리를 사용하는 Cloud Pub/Sub 빠른 시작의 자바 설정 안내를 따르세요. 자세한 내용은 Cloud Pub/Sub 자바 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를 사용합니다. 이 메소드는 결과로 나오는 정책을 반환합니다.

다음은 구독의 정책을 설정하는 샘플 코드입니다.

프로토콜

요청:

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 빠른 시작의 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}");

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.

자바

이 샘플을 시도해 보기 전에 클라이언트 라이브러리를 사용하는 Cloud Pub/Sub 빠른 시작의 자바 설정 안내를 따르세요. 자세한 내용은 Cloud Pub/Sub 자바 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

다음은 주제의 정책을 설정하는 샘플 코드입니다.

프로토콜

요청:

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 빠른 시작의 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}");

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.

자바

이 샘플을 시도해 보기 전에 클라이언트 라이브러리를 사용하는 Cloud Pub/Sub 빠른 시작의 자바 설정 안내를 따르세요. 자세한 내용은 Cloud Pub/Sub 자바 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() 메소드를 이용해 주어진 리소스에 대해 호출자가 어떤 권한을 가지고 있는지 확인할 수 있습니다. 이 메소드는 리소스 이름과 권한 집합을 매개변수로 사용해 호출자가 가진 사용 권한의 하위 집합을 반환합니다.

다음은 구독의 권한을 테스트하는 샘플 코드입니다.

프로토콜

요청:

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 빠른 시작의 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;

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

자바

이 샘플을 시도해 보기 전에 클라이언트 라이브러리를 사용하는 Cloud Pub/Sub 빠른 시작의 자바 설정 안내를 따르세요. 자세한 내용은 Cloud Pub/Sub 자바 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"

다음은 주제의 권한을 테스트하는 샘플 코드입니다.

프로토콜

요청:

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 빠른 시작의 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;

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

자바

이 샘플을 시도해 보기 전에 클라이언트 라이브러리를 사용하는 Cloud Pub/Sub 빠른 시작의 자바 설정 안내를 따르세요. 자세한 내용은 Cloud Pub/Sub 자바 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을 이용하면 프로젝트 간 통신에서 액세스를 쉽게 세부 조정할 수 있습니다. 예를 들어 클라우드 프로젝트 A에 있는 서비스 계정이 클라우드 프로젝트 B에 있는 주제에 메시지를 게시하려 한다고 가정해 보겠습니다. 서비스 계정에 클라우드 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 정책을 사용하기도 합니다. 캐시된 IAM 정책은 길어도 한 시간이 지나면 만료됩니다.

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...

Cloud Pub/Sub 문서