בקרת גישה באמצעות ניהול זהויות והרשאות גישה (IAM)

במסמך הזה מתוארות האפשרויות של בקרת הגישה שזמינות לכם ב-Pub/Sub.

סקירה כללית

ב-Pub/Sub משתמשים בניהול זהויות והרשאות גישה (IAM) כדי לשלוט בגישה.

בעזרת IAM אתם יכולים להקצות תפקידים ספציפיים למשתמשים, לקבוצות ולחשבונות שירות, ולתת להם את ההרשאות שנדרשות כדי לבצע את המשימות שלהם. אפשר להקצות את התפקידים האלה ב-IAM באמצעות מסוףGoogle Cloud או ה-API של IAM.

ב-Pub/Sub, אפשר להגדיר בקרת גישה ברמת הפרויקט וברמת המשאב הספציפי. הנה כמה דוגמאות לשימוש בבקרת גישה ב-Pub/Sub:

  • לתת גישה לכל משאב בנפרד, ולא לכל פרויקט הענן.

  • לתת גישה עם יכולות מוגבלות, כמו פרסום הודעות בנושא מסוים בלבד, או צריכת הודעות ממינוי מסוים בלבד, אבל לא למחוק את הנושא או את המינוי.

  • לתת לקבוצת מפתחים גישה לכל המשאבים של Pub/Sub בפרויקט.

אם יש לכם גישה לצפייה בלבד במשאב יחיד, כמו נושא או מינוי, אתם לא יכולים לראות את המשאב באמצעות מסוף Google Cloud . במקום זאת, אתם יכולים להשתמש ב-Google Cloud CLI כדי לראות את המשאב.

למידע מפורט על IAM והמאפיינים שלו, תוכלו לעיין במסמכי העזרה של IAM. כדאי לקרוא באופן ספציפי את הקטע הענקה, שינוי וביטול של הרשאות גישה למשאבים.

סוגי התפקידים ב-Pub/Sub

בדומה למוצרים אחרים של Google Cloud , ב-Pub/Sub יש תמיכה בשלושה סוגים של תפקידים:

  • תפקידים בסיסיים: לתפקידים בסיסיים יש הרבה הרשאות, והם היו קיימים לפני IAM. למידע נוסף על תפקידים בסיסיים, קראו את המאמר תפקידים בסיסיים.

  • תפקידים מוגדרים מראש: תפקידים מוגדרים מראש נותנים גישה פרטנית למשאבים ספציפיים ב-Google Cloud . מידע נוסף על תפקידים מוגדרים מראש זמין במאמר תפקידים מוגדרים מראש. בהמשך החלק הזה מפורטים התפקידים המוגדרים מראש של Pub/Sub.

  • תפקידים בהתאמה אישית: תפקידים בהתאמה אישית עוזרים לאכוף את העיקרון של הרשאות מינימליות. מידע נוסף על תפקידים בהתאמה אישית זמין במאמר תפקידים בהתאמה אישית.

הרשאות נדרשות ב-Pub/Sub

בקטעים הבאים מפורטות ההרשאות שנדרשות כדי לגשת למשאבים שונים ב-Pub/Sub.

ההרשאות הנדרשות לנושאים

בטבלה הבאה מפורטות ההרשאות הנדרשות לכל שיטה של Pub/Sub API שקשורה לנושאים. בטבלה מפורטות ההרשאות הנדרשות ב-IAM כדי להפעיל כל method, וגם תיאור של הפעולה שה-method מבצעת.

‏Method תיאור ההרשאה הנדרשת
projects.topics.create יוצרת את הנושא הנתון עם השם הנתון. pubsub.topics.create בפרויקט בענן שמכיל את המשאב
projects.topics.delete מחיקת הנושא עם השם שצוין. pubsub.topics.delete בנושא המבוקש
projects.topics.get אחזור ההגדרות של נושא. pubsub.topics.get בנושא המבוקש
projects.topics.getIamPolicy הצגת מדיניות בקרת הגישה של IAM לנושא. pubsub.topics.getIamPolicy בנושא המבוקש
projects.topics.list רשימה של כל הנושאים. ‫pubsub.topics.list בפרויקט בענן המבוקש
projects.topics.patch עדכון של נושא קיים. pubsub.topics.update בנושא המבוקש
projects.topics.publish מוסיף הודעה אחת או יותר לנושא. pubsub.topics.publish בנושא המבוקש
projects.topics.setIamPolicy הגדרת מדיניות בקרת הגישה של IAM לנושא. pubsub.topics.setIamPolicy בנושא המבוקש
projects.topics.testIamPermissions הפונקציה מחזירה את ההרשאות שיש לפונקציית קריאה חוזרת (caller) במשאב שצוין. ללא

ההרשאות הנדרשות למינויים

בטבלה הבאה מפורטות ההרשאות הנדרשות לכל שיטה של Pub/Sub API שקשורה למינויים. בטבלה מפורטות ההרשאות הנדרשות ב-IAM כדי להפעיל כל שיטה, וגם תיאור של מה שהשיטה עושה.

‏Method תיאור ההרשאה הנדרשת
projects.subscriptions.acknowledge אישור ההודעות שמשויכות ל-ack_ids ב-AcknowledgeRequest. pubsub.subscriptions.consume במינוי המבוקש
projects.subscriptions.create יצירת מינוי לנושא נתון. ‫pubsub.subscriptions.create בפרויקט בענן שמכיל את הנושא, ו-pubsub.topics.attachSubscription בנושא המבוקש. כדי ליצור מינוי S בפרויקט א' שמצורף לנושא T בפרויקט ב', צריך לתת את ההרשאות המתאימות גם בפרויקט א' וגם בנושא T. במקרה כזה, פרטי הזהות של המשתמש יכולים להופיע ביומני הביקורת של פרויקט ב'.
projects.subscriptions.delete מחיקת מינוי קיים. pubsub.subscriptions.delete במינוי המבוקש
projects.subscriptions.detach ניתוק מינוי מנושא. pubsub.topics.detachSubscription בנושא שאליו מצורף המינוי.
projects.subscriptions.get אחזור פרטי ההגדרות של מינוי. pubsub.subscriptions.get במינוי המבוקש
projects.subscriptions.getIamPolicy הצגת מדיניות בקרת הגישה של IAM למינוי. pubsub.subscriptions.getIamPolicy במינוי המבוקש
projects.subscriptions.list מציג רשימה של מינויים תואמים. ‫pubsub.subscriptions.list בפרויקט בענן המבוקש
projects.subscriptions.modifyAckDeadline משנה את המועד האחרון לאישור של הודעה ספציפית. pubsub.subscriptions.consume במינוי המבוקש
projects.subscriptions.modifyPushConfig משנה את ה-pushConfig של מינוי מסוים. pubsub.subscriptions.update במינוי המבוקש
projects.subscriptions.patch עדכון של מינוי קיים. pubsub.subscriptions.update במינוי המבוקש
projects.subscriptions.pull שליפת הודעות מהשרת. pubsub.subscriptions.consume במינוי המבוקש
projects.subscriptions.seek חיפוש מינוי קיים לנקודת זמן או לתמונת מצב. pubsub.subscriptions.consume במינוי המבוקש ו-pubsub.snapshots.seek בתמונת המצב המבוקשת, אם יש כזו.
projects.subscriptions.setIamPolicy הגדרת מדיניות בקרת הגישה של IAM למינוי. pubsub.subscriptions.setIamPolicy במינוי המבוקש
projects.subscriptions.testIamPermissions הפונקציה מחזירה את ההרשאות שיש לפונקציית קריאה חוזרת (caller) במשאב שצוין. ללא

ההרשאות הנדרשות לסכימות

בטבלה הבאה מפורטות ההרשאות הנדרשות לכל שיטה של Pub/Sub API שקשורה לסכימות. בטבלה מפורטות ההרשאות הנדרשות ב-IAM כדי להפעיל כל שיטה, וגם תיאור של מה שהשיטה עושה.

‏Method תיאור ההרשאה הנדרשת
projects.schemas.commit שומר גרסה חדשה של הסכימה. pubsub.schemas.commit בסכימה המבוקשת
projects.schemas.create יוצר סכימה. pubsub.schemas.create בפרויקט בענן שמכיל את המשאב
projects.schemas.delete מחיקת סכימה. pubsub.schemas.delete בסכימה המבוקשת
projects.schemas.deleteRevision מחיקת גרסה ספציפית של סכימה. pubsub.schemas.delete בסכימה המבוקשת
projects.schemas.get אחזור סכימה. pubsub.schemas.get בסכימה המבוקשת
projects.schemas.getIamPolicy הצגת מדיניות בקרת הגישה של IAM לסכימה. ‫pubsub.schemas.getIamPolicy בסכימה המבוקשת
projects.schemas.list הצגת רשימה של סכימות בפרויקט. ‫pubsub.schemas.list בפרויקט בענן המבוקש
projects.schemas.listRevisions הצגת רשימה של כל גרסאות הסכימה של הסכימה שצוינה. ‫pubsub.schemas.listRevisions בסכימה המבוקשת
projects.schemas.rollback יוצרת גרסת סכימה חדשה מגרסה קודמת. pubsub.schemas.rollback בסכימה המבוקשת
projects.schemas.validate מאמת הגדרת סכימה. pubsub.schemas.validate בפרויקט בענן שמכיל את המשאב
projects.schemas.validateMessage מאמת הודעה מול סכימה. pubsub.schemas.validate בפרויקט בענן שמכיל את המשאב

ההרשאות הנדרשות לתמונות מצב

בטבלה הבאה מפורטות ההרשאות הנדרשות לכל שיטה של Pub/Sub API שקשורה לתמונות מצב. בטבלה מפורטות ההרשאות הנדרשות ב-IAM כדי להפעיל כל שיטה, וגם תיאור של מה שהשיטה עושה.

שיטת REST תיאור ההרשאה הנדרשת
projects.snapshots.create יצירת קובץ snapshot מהמינוי המבוקש. ‫pubsub.snapshots.create בפרויקט בענן שמכיל את המינוי, וההרשאה pubsub.subscriptions.consume במינוי המקור.
projects.snapshots.delete הסרת תמונת מצב קיימת. pubsub.snapshots.delete בקובץ ה-snapshot המבוקש
projects.snapshots.getIamPolicy הצגת מדיניות בקרת הגישה של IAM לתמונת מצב. pubsub.snapshots.getIamPolicy בקובץ ה-snapshot המבוקש
projects.snapshots.list מציג רשימה של הסקירות הקיימות. ‫pubsub.snapshots.list בפרויקט בענן המבוקש
projects.snapshots.patch עדכון של תמונת מצב קיימת. pubsub.snapshots.update בקובץ ה-snapshot המבוקש
projects.snapshots.setIamPolicy הגדרת מדיניות בקרת הגישה ב-IAM לתמונת מצב. pubsub.snapshots.setIamPolicy בקובץ ה-snapshot המבוקש
projects.snapshots.testIamPermissions הפונקציה מחזירה את ההרשאות שיש לפונקציית קריאה חוזרת (caller) במשאב שצוין. ללא

תפקידים זמינים ב-Pub/Sub

בטבלה הבאה מפורטים כל התפקידים ב-Pub/Sub וההרשאות שמשויכות לכל תפקיד:

Role Permissions

(roles/pubsub.admin)

Provides full access to topics and subscriptions.

Lowest-level resources where you can grant this role:

  • Schema
  • Snapshot
  • Subscription
  • Topic

cloudkms.keyHandles.*

  • cloudkms.keyHandles.create
  • cloudkms.keyHandles.get
  • cloudkms.keyHandles.list

cloudkms.operations.get

cloudkms.projects.showEffectiveAutokeyConfig

pubsub.*

  • pubsub.messageTransforms.validate
  • pubsub.schemas.attach
  • pubsub.schemas.commit
  • pubsub.schemas.create
  • pubsub.schemas.delete
  • pubsub.schemas.get
  • pubsub.schemas.getIamPolicy
  • pubsub.schemas.list
  • pubsub.schemas.listRevisions
  • pubsub.schemas.rollback
  • pubsub.schemas.setIamPolicy
  • pubsub.schemas.validate
  • pubsub.snapshots.create
  • pubsub.snapshots.createTagBinding
  • pubsub.snapshots.delete
  • pubsub.snapshots.deleteTagBinding
  • pubsub.snapshots.get
  • pubsub.snapshots.getIamPolicy
  • pubsub.snapshots.list
  • pubsub.snapshots.listEffectiveTags
  • pubsub.snapshots.listTagBindings
  • pubsub.snapshots.seek
  • pubsub.snapshots.setIamPolicy
  • pubsub.snapshots.update
  • pubsub.subscriptions.consume
  • pubsub.subscriptions.create
  • pubsub.subscriptions.createTagBinding
  • pubsub.subscriptions.delete
  • pubsub.subscriptions.deleteTagBinding
  • pubsub.subscriptions.get
  • pubsub.subscriptions.getIamPolicy
  • pubsub.subscriptions.list
  • pubsub.subscriptions.listEffectiveTags
  • pubsub.subscriptions.listTagBindings
  • pubsub.subscriptions.setIamPolicy
  • pubsub.subscriptions.update
  • pubsub.topics.attachSubscription
  • pubsub.topics.create
  • pubsub.topics.createTagBinding
  • pubsub.topics.delete
  • pubsub.topics.deleteTagBinding
  • pubsub.topics.detachSubscription
  • pubsub.topics.get
  • pubsub.topics.getIamPolicy
  • pubsub.topics.list
  • pubsub.topics.listEffectiveTags
  • pubsub.topics.listTagBindings
  • pubsub.topics.publish
  • pubsub.topics.setIamPolicy
  • pubsub.topics.update
  • pubsub.topics.updateTag

resourcemanager.projects.get

serviceusage.catalogs.listMembers

serviceusage.consumerpolicy.analyze

serviceusage.consumerpolicy.get

serviceusage.effectivepolicy.get

serviceusage.groups.*

  • serviceusage.groups.list
  • serviceusage.groups.listExpandedMembers
  • serviceusage.groups.listMembers

serviceusage.quotas.get

serviceusage.services.get

serviceusage.services.list

serviceusage.services.listApis

serviceusage.services.listDependentServices

serviceusage.values.test

(roles/pubsub.editor)

Provides access to modify topics and subscriptions, and access to publish and consume messages.

Lowest-level resources where you can grant this role:

  • Schema
  • Snapshot
  • Subscription
  • Topic

cloudkms.keyHandles.*

  • cloudkms.keyHandles.create
  • cloudkms.keyHandles.get
  • cloudkms.keyHandles.list

cloudkms.operations.get

cloudkms.projects.showEffectiveAutokeyConfig

pubsub.messageTransforms.validate

pubsub.schemas.attach

pubsub.schemas.commit

pubsub.schemas.create

pubsub.schemas.delete

pubsub.schemas.get

pubsub.schemas.getIamPolicy

pubsub.schemas.list

pubsub.schemas.listRevisions

pubsub.schemas.rollback

pubsub.schemas.validate

pubsub.snapshots.create

pubsub.snapshots.createTagBinding

pubsub.snapshots.delete

pubsub.snapshots.deleteTagBinding

pubsub.snapshots.get

pubsub.snapshots.list

pubsub.snapshots.listEffectiveTags

pubsub.snapshots.listTagBindings

pubsub.snapshots.seek

pubsub.snapshots.update

pubsub.subscriptions.consume

pubsub.subscriptions.create

pubsub.subscriptions.createTagBinding

pubsub.subscriptions.delete

pubsub.subscriptions.deleteTagBinding

pubsub.subscriptions.get

pubsub.subscriptions.list

pubsub.subscriptions.listEffectiveTags

pubsub.subscriptions.listTagBindings

pubsub.subscriptions.update

pubsub.topics.attachSubscription

pubsub.topics.create

pubsub.topics.createTagBinding

pubsub.topics.delete

pubsub.topics.deleteTagBinding

pubsub.topics.detachSubscription

pubsub.topics.get

pubsub.topics.list

pubsub.topics.listEffectiveTags

pubsub.topics.listTagBindings

pubsub.topics.publish

pubsub.topics.update

pubsub.topics.updateTag

resourcemanager.projects.get

serviceusage.catalogs.listMembers

serviceusage.consumerpolicy.analyze

serviceusage.consumerpolicy.get

serviceusage.effectivepolicy.get

serviceusage.groups.*

  • serviceusage.groups.list
  • serviceusage.groups.listExpandedMembers
  • serviceusage.groups.listMembers

serviceusage.quotas.get

serviceusage.services.get

serviceusage.services.list

serviceusage.services.listApis

serviceusage.services.listDependentServices

serviceusage.values.test

(roles/pubsub.publisher)

Provides access to publish messages to a topic.

Lowest-level resources where you can grant this role:

  • Topic

pubsub.topics.publish

(roles/pubsub.subscriber)

Provides access to consume messages from a subscription and to attach subscriptions to a topic.

Lowest-level resources where you can grant this role:

  • Snapshot
  • Subscription
  • Topic

pubsub.snapshots.seek

pubsub.subscriptions.consume

pubsub.topics.attachSubscription

(roles/pubsub.viewer)

Provides access to view topics and subscriptions.

Lowest-level resources where you can grant this role:

  • Schema
  • Snapshot
  • Subscription
  • Topic

pubsub.messageTransforms.validate

pubsub.schemas.get

pubsub.schemas.list

pubsub.schemas.listRevisions

pubsub.schemas.validate

pubsub.snapshots.get

pubsub.snapshots.list

pubsub.snapshots.listEffectiveTags

pubsub.snapshots.listTagBindings

pubsub.subscriptions.get

pubsub.subscriptions.list

pubsub.subscriptions.listEffectiveTags

pubsub.subscriptions.listTagBindings

pubsub.topics.get

pubsub.topics.list

pubsub.topics.listEffectiveTags

pubsub.topics.listTagBindings

resourcemanager.projects.get

serviceusage.catalogs.listMembers

serviceusage.consumerpolicy.analyze

serviceusage.consumerpolicy.get

serviceusage.effectivepolicy.get

serviceusage.groups.*

  • serviceusage.groups.list
  • serviceusage.groups.listExpandedMembers
  • serviceusage.groups.listMembers

serviceusage.quotas.get

serviceusage.services.get

serviceusage.services.list

serviceusage.services.listApis

serviceusage.services.listDependentServices

serviceusage.values.test

Service agent roles

Service agent roles should only be granted to service agents.

Role Permissions

(roles/pubsub.serviceAgent)

Grants Cloud Pub/Sub Service Account access to manage resources.

iam.serviceAccounts.get

iam.serviceAccounts.getAccessToken

iam.serviceAccounts.getOpenIdToken

iam.serviceAccounts.implicitDelegation

iam.serviceAccounts.list

iam.serviceAccounts.signBlob

iam.serviceAccounts.signJwt

resourcemanager.projects.get

resourcemanager.projects.list

serviceusage.services.use

שליטה בגישה דרך מסוף Google Cloud

אתם יכולים להשתמש במסוף Google Cloud כדי לנהל את בקרת הגישה לנושאים ולפרויקטים שלכם.

כדי להגדיר אמצעי בקרת גישה ברמת הפרויקט:

  1. נכנסים לדף IAM במסוף Google Cloud .

    כניסה לדף IAM

  2. בוחרים את הפרויקט הרצוי.

  3. לוחצים על הוספה.

  4. מקלידים שם אחד או יותר של חשבונות משתמשים.

  5. ברשימה Select a role, בוחרים את התפקיד שרוצים להקצות.

  6. לוחצים על Save.

  7. מוודאים שחשבון המשתמש מופיע עם התפקיד שנתתם לו.

כדי להגדיר אמצעי בקרת גישה לנושאים ולמינויים, פועלים לפי השלבים הבאים:

  1. במסוף Google Cloud , נכנסים לרשימת הנושאים של Pub/Sub.

    כניסה לדף Topics

  2. אם צריך, בוחרים את הפרויקט שבו מופעל Pub/Sub.

  3. מבצעים את אחת מהפעולות הבאות:

    • כדי להגדיר תפקידים לנושא אחד או יותר, בוחרים את הנושאים.

    • כדי להגדיר תפקידים למינוי שמצורף לנושא, לוחצים על מזהה הנושא. בדף Topic details, לוחצים על מזהה המינוי. מופיע הדף Subscription details.

  4. אם חלונית המידע מוסתרת, לוחצים על Show info panel.

  5. בכרטיסייה Permissions, לוחצים על Add principal.

  6. מקלידים שם אחד או יותר של חשבונות משתמשים.

  7. ברשימה Select a role, בוחרים את התפקיד שרוצים להקצות.

  8. לוחצים על Save.

שליטה בגישה באמצעות IAM API

באמצעות Pub/Sub IAM API אפשר להגדיר ולקבל כללי מדיניות בנושאים ובמינויים ספציפיים בפרויקט, ולבדוק את ההרשאות של המשתמשים במשאב נתון. כמו ב-methods הרגילות של Pub/Sub, אפשר להפעיל את ה-methods של IAM API באמצעות ספריות הלקוח, API Explorer או ישירות דרך HTTP.

שימו לב שאי אפשר להשתמש ב-Pub/Sub IAM API כדי לנהל כללי מדיניות ברמת הפרויקט ב- Google Cloud .

בקטעים הבאים מופיעות דוגמאות להגדרה ולקבלה של מדיניות, ולבדיקת ההרשאות שיש למשתמש ששלח את הקריאה למשאב נתון.

קבלת פרטי מדיניות

ה-method‏ getIamPolicy() מאפשרת לקבל מדיניות קיימת. השיטה הזו מחזירה אובייקט JSON שמכיל את המדיניות שמשויכת למשאב.

הנה קוד לדוגמה כדי לקבל מדיניות למינוי:

C#‎

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי הוראות ההגדרה של C# ‎ במאמר התחלה מהירה: שימוש בספריות לקוח. מידע נוסף מופיע במאמרי העזרה של Pub/Sub C# API.


using Google.Cloud.Iam.V1;
using Google.Cloud.PubSub.V1;

public class GetSubscriptionIamPolicySample
{
    public Policy GetSubscriptionIamPolicy(string projectId, string subscriptionId)
    {
        PublisherServiceApiClient publisher = PublisherServiceApiClient.Create();
        SubscriptionName subscriptionName = SubscriptionName.FromProjectSubscription(projectId, subscriptionId);
        Policy policy = publisher.IAMPolicyClient.GetIamPolicy(new GetIamPolicyRequest
        {
            ResourceAsResourceName = subscriptionName
        });
        return policy;
    }
}

gcloud

המדיניות בנושא מינויים:

gcloud pubsub subscriptions get-iam-policy \
   projects/${PROJECT}/subscriptions/${SUBSCRIPTION} \
   --format json

פלט:

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

המשך

בדוגמה הבאה נעשה שימוש בגרסה הראשית של ספריית הלקוח של Pub/Sub ב-Go‏ (v2). אם אתם עדיין משתמשים בספרייה של גרסה 1, כדאי לעיין במדריך להעברת נתונים לגרסה 2. כאן תוכלו למצוא רשימה של דוגמאות קוד שהוצאו משימוש בגרסה 1.

לפני שתנסו את הדוגמה הזו, פעלו לפי הוראות ההגדרה של Go במאמר מדריך למתחילים: שימוש בספריות לקוח. מידע נוסף מופיע במסמכי העזר של ה-API של Pub/Sub Go.

import (
	"context"
	"fmt"
	"io"

	"cloud.google.com/go/iam/apiv1/iampb"
	"cloud.google.com/go/pubsub/v2"
)

func getIAMPolicy(w io.Writer, projectID, subscription string) error {
	// projectID := "my-project-id"
	// subscription := "projects/my-project/subscriptions/my-sub"
	ctx := context.Background()
	client, err := pubsub.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("pubsub.NewClient: %w", err)
	}
	defer client.Close()

	req := &iampb.GetIamPolicyRequest{
		Resource: subscription,
	}
	policy, err := client.SubscriptionAdminClient.GetIamPolicy(ctx, req)
	if err != nil {
		return fmt.Errorf("Policy: %w", err)
	}
	for _, b := range policy.Bindings {
		for _, m := range b.Members {
			fmt.Fprintf(w, "role: %s, member: %s\n", b.Role, m)
		}
	}
	return nil
}

Java

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי הוראות ההגדרה של Java במאמר התחלה מהירה: שימוש בספריות לקוח. מידע נוסף מופיע במאמרי העזרה של Pub/Sub Java API.


import com.google.cloud.pubsub.v1.SubscriptionAdminClient;
import com.google.iam.v1.GetIamPolicyRequest;
import com.google.iam.v1.Policy;
import com.google.pubsub.v1.ProjectSubscriptionName;
import java.io.IOException;

public class GetSubscriptionPolicyExample {
  public static void main(String... args) throws Exception {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "your-project-id";
    String subscriptionId = "your-subscription-id";

    getSubscriptionPolicyExample(projectId, subscriptionId);
  }

  public static void getSubscriptionPolicyExample(String projectId, String subscriptionId)
      throws IOException {
    try (SubscriptionAdminClient subscriptionAdminClient = SubscriptionAdminClient.create()) {
      ProjectSubscriptionName subscriptionName =
          ProjectSubscriptionName.of(projectId, subscriptionId);
      GetIamPolicyRequest getIamPolicyRequest =
          GetIamPolicyRequest.newBuilder().setResource(subscriptionName.toString()).build();
      Policy policy = subscriptionAdminClient.getIamPolicy(getIamPolicyRequest);
      System.out.println("Subscription policy: " + policy);
    }
  }
}

Node.js

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי הוראות ההגדרה של Node.js במאמר מדריך למתחילים: שימוש בספריות לקוח. מידע נוסף מופיע במאמרי העזרה של Pub/Sub Node.js API.

/**
 * TODO(developer): Uncomment this variable before running the sample.
 */
// const subscriptionNameOrId = 'YOUR_SUBSCRIPTION_NAME_OR_ID';

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

// Creates a client; cache this for further use
const pubSubClient = new PubSub();

async function getSubscriptionPolicy(subscriptionNameOrId) {
  // Retrieves the IAM policy for the subscription
  const [policy] = await pubSubClient
    .subscription(subscriptionNameOrId)
    .iam.getPolicy();

  console.log(`Policy for subscription: ${JSON.stringify(policy.bindings)}.`);
}

Node.js

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי הוראות ההגדרה של Node.js במאמר מדריך למתחילים: שימוש בספריות לקוח. מידע נוסף מופיע במאמרי העזרה של Pub/Sub Node.js API.

/**
 * TODO(developer): Uncomment this variable before running the sample.
 */
// const subscriptionNameOrId = 'YOUR_SUBSCRIPTION_NAME_OR_ID';

// Imports the Google Cloud client library
import {PubSub, Policy} from '@google-cloud/pubsub';

// Creates a client; cache this for further use
const pubSubClient = new PubSub();

async function getSubscriptionPolicy(subscriptionNameOrId: string) {
  // Retrieves the IAM policy for the subscription
  const [policy]: [Policy] = await pubSubClient
    .subscription(subscriptionNameOrId)
    .iam.getPolicy();

  console.log(`Policy for subscription: ${JSON.stringify(policy.bindings)}.`);
}

PHP

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי הוראות ההגדרה של PHP במאמר מדריך למתחילים: שימוש בספריות לקוח. מידע נוסף מופיע במאמרי העזרה של 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

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי הוראות ההגדרה של Python במאמר מדריך למתחילים: שימוש בספריות לקוח. מידע נוסף מופיע במאמרי העזרה של ה-API בשפת Python של Pub/Sub.

from google.cloud import pubsub_v1

# TODO(developer): Choose an existing subscription.
# project_id = "your-project-id"
# subscription_id = "your-subscription-id"

client = pubsub_v1.SubscriberClient()
subscription_path = client.subscription_path(project_id, subscription_id)

policy = client.get_iam_policy(request={"resource": subscription_path})

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

client.close()

Ruby

בדוגמה הבאה נעשה שימוש בגרסה 3 של ספריית הלקוח של Pub/Sub ב-Ruby. אם אתם עדיין משתמשים בספרייה v2, עיינו במדריך להעברת נתונים (מיגרציה) ל-v3. לרשימה של דוגמאות קוד ב-Ruby v2, עיינו ב דוגמאות הקוד שהוצאו משימוש.

לפני שתנסו את הדוגמה הזו, פעלו לפי הוראות ההגדרה של Ruby במאמר מדריך למתחילים: שימוש בספריות לקוח. מידע נוסף מופיע במאמרי העזרה של Pub/Sub Ruby API.

# subscription_id = "your-subscription-id"

pubsub = Google::Cloud::PubSub.new

policy = pubsub.iam.get_iam_policy \
  resource: pubsub.subscription_path(subscription_id)

puts "Subscription policy:"
puts policy.bindings.first.role
הנה קוד לדוגמה כדי לקבל מדיניות לנושא:

C#‎

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי הוראות ההגדרה של C# ‎ במאמר התחלה מהירה: שימוש בספריות לקוח. מידע נוסף מופיע במאמרי העזרה של Pub/Sub C# API.


using Google.Cloud.Iam.V1;
using Google.Cloud.PubSub.V1;

public class GetTopicIamPolicySample
{
    public Policy GetTopicIamPolicy(string projectId, string topicId)
    {
        PublisherServiceApiClient publisher = PublisherServiceApiClient.Create();
        TopicName topicName = TopicName.FromProjectTopic(projectId, topicId);
        Policy policy = publisher.IAMPolicyClient.GetIamPolicy(new GetIamPolicyRequest
        {
            ResourceAsResourceName = topicName
        });
        return policy;
    }
}

gcloud

קבלת מדיניות הנושאים

gcloud pubsub topics get-iam-policy \
    projects/${PROJECT}/topics/${TOPIC} \
    --format json

פלט:

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

המשך

בדוגמה הבאה נעשה שימוש בגרסה הראשית של ספריית הלקוח של Pub/Sub ב-Go‏ (v2). אם אתם עדיין משתמשים בספרייה של גרסה 1, כדאי לעיין במדריך להעברת נתונים לגרסה 2. כאן תוכלו למצוא רשימה של דוגמאות קוד שהוצאו משימוש בגרסה 1.

לפני שתנסו את הדוגמה הזו, פעלו לפי הוראות ההגדרה של Go במאמר מדריך למתחילים: שימוש בספריות לקוח. מידע נוסף מופיע במסמכי העזר של ה-API של Pub/Sub Go.

import (
	"context"
	"fmt"
	"io"

	"cloud.google.com/go/iam/apiv1/iampb"
	"cloud.google.com/go/pubsub/v2"
)

func getIAMPolicy(w io.Writer, projectID, topicID string) error {
	// projectID := "my-project-id"
	// topicID := "my-topic"
	ctx := context.Background()
	client, err := pubsub.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("pubsub.NewClient: %w", err)
	}
	defer client.Close()

	req := &iampb.GetIamPolicyRequest{
		Resource: fmt.Sprintf("projects/%s/topics/%s", projectID, topicID),
	}
	policy, err := client.TopicAdminClient.GetIamPolicy(ctx, req)
	if err != nil {
		return fmt.Errorf("Policy: %w", err)
	}
	for _, b := range policy.Bindings {
		for _, m := range b.Members {
			fmt.Fprintf(w, "role: %s, member: %s\n", b.Role, m)
		}
	}
	return nil
}

Java

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי הוראות ההגדרה של Java במאמר התחלה מהירה: שימוש בספריות לקוח. מידע נוסף מופיע במאמרי העזרה של Pub/Sub Java API.


import com.google.cloud.pubsub.v1.TopicAdminClient;
import com.google.iam.v1.GetIamPolicyRequest;
import com.google.iam.v1.Policy;
import com.google.pubsub.v1.TopicName;
import java.io.IOException;

public class GetTopicPolicyExample {
  public static void main(String... args) throws Exception {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "your-project-id";
    String topicId = "your-topic-id";

    getTopicPolicyExample(projectId, topicId);
  }

  public static void getTopicPolicyExample(String projectId, String topicId) throws IOException {
    try (TopicAdminClient topicAdminClient = TopicAdminClient.create()) {
      TopicName topicName = TopicName.of(projectId, topicId);
      GetIamPolicyRequest getIamPolicyRequest =
          GetIamPolicyRequest.newBuilder().setResource(topicName.toString()).build();
      Policy policy = topicAdminClient.getIamPolicy(getIamPolicyRequest);
      System.out.println("Topic policy: " + policy);
    }
  }
}

Node.js

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי הוראות ההגדרה של Node.js במאמר מדריך למתחילים: שימוש בספריות לקוח. מידע נוסף מופיע במאמרי העזרה של Pub/Sub Node.js API.

/**
 * TODO(developer): Uncomment this variable before running the sample.
 */
// const topicNameOrId = 'YOUR_TOPIC_NAME_OR_ID';

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

// Creates a client; cache this for further use
const pubSubClient = new PubSub();

async function getTopicPolicy(topicNameOrId) {
  // Retrieves the IAM policy for the topic
  const [policy] = await pubSubClient.topic(topicNameOrId).iam.getPolicy();
  console.log('Policy for topic: %j.', policy.bindings);
}

PHP

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי הוראות ההגדרה של PHP במאמר מדריך למתחילים: שימוש בספריות לקוח. מידע נוסף מופיע במאמרי העזרה של 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

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי הוראות ההגדרה של Python במאמר מדריך למתחילים: שימוש בספריות לקוח. מידע נוסף מופיע במאמרי העזרה של ה-API בשפת Python של Pub/Sub.

from google.cloud import pubsub_v1

# TODO(developer): Choose an existing topic.
# project_id = "your-project-id"
# topic_id = "your-topic-id"

client = pubsub_v1.PublisherClient()
topic_path = client.topic_path(project_id, topic_id)

policy = client.get_iam_policy(request={"resource": topic_path})

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

Ruby

בדוגמה הבאה נעשה שימוש בגרסה 3 של ספריית הלקוח של Pub/Sub ב-Ruby. אם אתם עדיין משתמשים בספרייה v2, עיינו במדריך להעברת נתונים (מיגרציה) ל-v3. לרשימה של דוגמאות קוד ב-Ruby v2, עיינו ב דוגמאות הקוד שהוצאו משימוש.

לפני שתנסו את הדוגמה הזו, פעלו לפי הוראות ההגדרה של Ruby במאמר התחלה מהירה: שימוש בספריות לקוח. מידע נוסף מופיע במאמרי העזרה של Pub/Sub Ruby API.

# topic_id = "your-topic-id"

pubsub = Google::Cloud::PubSub.new

policy = pubsub.iam.get_iam_policy resource: pubsub.topic_path(topic_id)

puts "Topic policy:"
puts policy.bindings.first.role

הגדרת מדיניות

השיטה setIamPolicy() מאפשרת לצרף מדיניות למשאב. השיטה setIamPolicy() מקבלת את SetIamPolicyRequest, שמכיל את המדיניות שצריך להגדיר ואת המשאב שאליו המדיניות מצורפת. הפונקציה מחזירה את המדיניות שנוצרה.

הנה קוד לדוגמה להגדרת מדיניות למינוי:

C#‎

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי הוראות ההגדרה של C# ‎ במאמר התחלה מהירה: שימוש בספריות לקוח. מידע נוסף מופיע במאמרי העזרה של Pub/Sub C# API.


using Google.Cloud.Iam.V1;
using Google.Cloud.PubSub.V1;

public class SetSubscriptionIamPolicySample
{
    public Policy SetSubscriptionIamPolicy(string projectId, string subscriptionId, string role, string member)
    {
        PublisherServiceApiClient publisher = PublisherServiceApiClient.Create();
        string roleToBeAddedToPolicy = $"roles/{role}";

        Policy policy = new Policy
        {
            Bindings = {
                new Binding
                {
                    Role = roleToBeAddedToPolicy,
                    Members = { member }
                }
            }
        };
        SetIamPolicyRequest request = new SetIamPolicyRequest
        {
            ResourceAsResourceName = SubscriptionName.FromProjectSubscription(projectId, subscriptionId),
            Policy = policy
        };
        Policy response = publisher.IAMPolicyClient.SetIamPolicy(request);
        return response;
    }
}

gcloud

1. שומרים את המדיניות של המינוי.

gcloud pubsub subscriptions get-iam-policy \
   projects/${PROJECT}/subscriptions/${SUBSCRIPTION} \
   --format json > subscription_policy.json

2. פותחים את subscription_policy.json ומעדכנים את הקישורים על ידי הקצאת תפקידים מתאימים לחשבונות המשתמשים המתאימים. למידע נוסף על עבודה עם קובצי subscription_policy.json, קראו את המאמר מדיניות במסמכי התיעוד של IAM.

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

3. מחילים את המדיניות בנושא מינויים החדשה.

gcloud pubsub subscriptions set-iam-policy \
  projects/${PROJECT}/subscriptions/${SUBSCRIPTION} \
  subscription_policy.json

המשך

בדוגמה הבאה נעשה שימוש בגרסה הראשית של ספריית הלקוח של Pub/Sub ב-Go‏ (v2). אם אתם עדיין משתמשים בספרייה של גרסה 1, כדאי לעיין במדריך להעברת נתונים לגרסה 2. כאן תוכלו למצוא רשימה של דוגמאות קוד שהוצאו משימוש בגרסה 1.

לפני שתנסו את הדוגמה הזו, פעלו לפי הוראות ההגדרה של Go במאמר מדריך למתחילים: שימוש בספריות לקוח. מידע נוסף מופיע במסמכי העזר של ה-API של Pub/Sub Go.

import (
	"context"
	"fmt"
	"io"

	"cloud.google.com/go/iam/apiv1/iampb"
	"cloud.google.com/go/pubsub/v2"
)

func addUsersToSubscription(w io.Writer, projectID, subID string) error {
	// projectID := "my-project-id"
	// subID := "my-sub"
	ctx := context.Background()
	client, err := pubsub.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("pubsub.NewClient: %w", err)
	}
	defer client.Close()

	subName := fmt.Sprintf("projects/%s/subscriptions/%s", projectID, subID)
	req := &iampb.GetIamPolicyRequest{
		Resource: subName,
	}
	policy, err := client.SubscriptionAdminClient.GetIamPolicy(ctx, req)
	if err != nil {
		return fmt.Errorf("error calling GetIamPolicy: %w", err)
	}
	b := &iampb.Binding{
		Role: "roles/editor",
		// Other valid prefixes are "serviceAccount:", "user:"
		// See the documentation for more values.
		Members: []string{"group:cloud-logs@google.com"},
	}
	policy.Bindings = append(policy.Bindings, b)

	setRequest := &iampb.SetIamPolicyRequest{
		Resource: subName,
		Policy:   policy,
	}
	_, err = client.SubscriptionAdminClient.SetIamPolicy(ctx, setRequest)
	if err != nil {
		return fmt.Errorf("error calling SetIamPolicy: %w", err)
	}
	fmt.Fprintln(w, "Added roles to subscription.")
	return nil
}

Java

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי הוראות ההגדרה של Java במאמר התחלה מהירה: שימוש בספריות לקוח. מידע נוסף מופיע במאמרי העזרה של Pub/Sub Java API.


import com.google.cloud.pubsub.v1.SubscriptionAdminClient;
import com.google.iam.v1.Binding;
import com.google.iam.v1.GetIamPolicyRequest;
import com.google.iam.v1.Policy;
import com.google.iam.v1.SetIamPolicyRequest;
import com.google.pubsub.v1.ProjectSubscriptionName;
import java.io.IOException;

public class SetSubscriptionPolicyExample {
  public static void main(String... args) throws Exception {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "your-project-id";
    String subscriptionId = "your-subscription-id";

    setSubscriptionPolicyExample(projectId, subscriptionId);
  }

  public static void setSubscriptionPolicyExample(String projectId, String subscriptionId)
      throws IOException {
    try (SubscriptionAdminClient subscriptionAdminClient = SubscriptionAdminClient.create()) {
      ProjectSubscriptionName subscriptionName =
          ProjectSubscriptionName.of(projectId, subscriptionId);
      GetIamPolicyRequest getIamPolicyRequest =
          GetIamPolicyRequest.newBuilder().setResource(subscriptionName.toString()).build();
      Policy oldPolicy = subscriptionAdminClient.getIamPolicy(getIamPolicyRequest);

      // Create new role -> members binding
      Binding binding =
          Binding.newBuilder()
              .setRole("roles/pubsub.editor")
              .addMembers("domain:google.com")
              .build();

      // Add new binding to updated policy
      Policy updatedPolicy = Policy.newBuilder(oldPolicy).addBindings(binding).build();

      SetIamPolicyRequest setIamPolicyRequest =
          SetIamPolicyRequest.newBuilder()
              .setResource(subscriptionName.toString())
              .setPolicy(updatedPolicy)
              .build();
      Policy newPolicy = subscriptionAdminClient.setIamPolicy(setIamPolicyRequest);
      System.out.println("New subscription policy: " + newPolicy);
    }
  }
}

Node.js

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי הוראות ההגדרה של Node.js במאמר מדריך למתחילים: שימוש בספריות לקוח. מידע נוסף מופיע במאמרי העזרה של Pub/Sub Node.js API.

/**
 * TODO(developer): Uncomment this variable before running the sample.
 */
// const subscriptionNameOrId = 'YOUR_SUBSCRIPTION_NAME_OR_ID';

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

// Creates a client; cache this for further use
const pubSubClient = new PubSub();

async function setSubscriptionPolicy(subscriptionNameOrId) {
  // 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 pubSubClient
    .subscription(subscriptionNameOrId)
    .iam.setPolicy(newPolicy);

  console.log('Updated policy for subscription: %j', updatedPolicy.bindings);
}

PHP

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

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי הוראות ההגדרה של Python במאמר מדריך למתחילים: שימוש בספריות לקוח. מידע נוסף מופיע במאמרי העזרה של ה-API בשפת Python של Pub/Sub.

from google.cloud import pubsub_v1

# TODO(developer): Choose an existing subscription.
# project_id = "your-project-id"
# subscription_id = "your-subscription-id"

client = pubsub_v1.SubscriberClient()
subscription_path = client.subscription_path(project_id, subscription_id)

policy = client.get_iam_policy(request={"resource": subscription_path})

# Add all users as viewers.
policy.bindings.add(role="roles/pubsub.viewer", members=["domain:google.com"])

# 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(
    request={"resource": subscription_path, "policy": policy}
)

print("IAM policy for subscription {} set: {}".format(subscription_id, policy))

client.close()

Ruby

בדוגמה הבאה נעשה שימוש בגרסה 3 של ספריית הלקוח של Pub/Sub ב-Ruby. אם אתם עדיין משתמשים בספרייה v2, עיינו במדריך להעברת נתונים (מיגרציה) ל-v3. לרשימה של דוגמאות קוד ב-Ruby v2, עיינו ב דוגמאות הקוד שהוצאו משימוש.

לפני שתנסו את הדוגמה הזו, פעלו לפי הוראות ההגדרה של Ruby במאמר מדריך למתחילים: שימוש בספריות לקוח. מידע נוסף מופיע במאמרי העזרה של Pub/Sub Ruby API.

# subscription_id       = "your-subscription-id"
# role                  = "roles/pubsub.subscriber"
# service_account_email =
# "serviceAccount:account_name@project_name.iam.gserviceaccount.com"

pubsub = Google::Cloud::PubSub.new

bindings = Google::Iam::V1::Binding.new \
  role: role,
  members: [service_account_email]

pubsub.iam.set_iam_policy resource: pubsub.subscription_path(subscription_id),
                          policy: {
                            bindings: [bindings]
                          }

הנה קוד לדוגמה להגדרת מדיניות לנושא:

C#‎

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי הוראות ההגדרה של C# ‎ במאמר התחלה מהירה: שימוש בספריות לקוח. מידע נוסף מופיע במאמרי העזרה של Pub/Sub C# API.


using Google.Cloud.Iam.V1;
using Google.Cloud.PubSub.V1;

public class SetTopicIamPolicySample
{
    public Policy SetTopicIamPolicy(string projectId, string topicId, string role, string member)
    {
        PublisherServiceApiClient publisher = PublisherServiceApiClient.Create();
        string roleToBeAddedToPolicy = $"roles/{role}";

        Policy policy = new Policy
        {
            Bindings = {
                new Binding
                {
                    Role = roleToBeAddedToPolicy,
                    Members = { member }
                }
            }
        };
        SetIamPolicyRequest request = new SetIamPolicyRequest
        {
            ResourceAsResourceName = TopicName.FromProjectTopic(projectId, topicId),
            Policy = policy
        };
        Policy response = publisher.IAMPolicyClient.SetIamPolicy(request);
        return response;
    }
}

gcloud

1. שומרים את המדיניות של הנושא.

gcloud pubsub topics get-iam-policy \
   projects/${PROJECT}/topics/${TOPIC} \
   --format json > topic_policy.json

2. פותחים את topic_policy.json ומעדכנים את הקישורים על ידי הקצאת תפקידים מתאימים לחשבונות המשתמשים המתאימים. למידע נוסף על עבודה עם קובצי subscription_policy.json, קראו את המאמר מדיניות במסמכי התיעוד של IAM.

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

3. מחילים את מדיניות הנושאים החדשה.

gcloud pubsub topics set-iam-policy  \
   projects/${PROJECT}/topics/${TOPIC}     \
   topic_policy.json

המשך

בדוגמה הבאה נעשה שימוש בגרסה הראשית של ספריית הלקוח של Pub/Sub ב-Go‏ (v2). אם אתם עדיין משתמשים בספרייה של גרסה 1, כדאי לעיין במדריך להעברת נתונים לגרסה 2. כאן תוכלו למצוא רשימה של דוגמאות קוד שהוצאו משימוש בגרסה 1.

לפני שתנסו את הדוגמה הזו, פעלו לפי הוראות ההגדרה של Go במאמר מדריך למתחילים: שימוש בספריות לקוח. מידע נוסף מופיע במסמכי העזר של ה-API של Pub/Sub Go.

import (
	"context"
	"fmt"
	"io"

	"cloud.google.com/go/iam/apiv1/iampb"
	"cloud.google.com/go/pubsub/v2"
)

func addUsersToTopic(w io.Writer, projectID, topicID string) error {
	// projectID := "my-project-id"
	// topicID := "my-topic"
	ctx := context.Background()
	client, err := pubsub.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("pubsub.NewClient: %w", err)
	}
	defer client.Close()

	topicName := fmt.Sprintf("projects/%s/topics/%s", projectID, topicID)
	req := &iampb.GetIamPolicyRequest{
		Resource: topicName,
	}
	policy, err := client.TopicAdminClient.GetIamPolicy(ctx, req)
	if err != nil {
		return fmt.Errorf("error calling GetIamPolicy: %w", err)
	}
	b := &iampb.Binding{
		Role: "roles/editor",
		// Other valid prefixes are "serviceAccount:", "user:"
		// See the documentation for more values.
		Members: []string{"group:cloud-logs@google.com"},
	}
	policy.Bindings = append(policy.Bindings, b)

	setRequest := &iampb.SetIamPolicyRequest{
		Resource: topicName,
		Policy:   policy,
	}
	_, err = client.TopicAdminClient.SetIamPolicy(ctx, setRequest)
	if err != nil {
		return fmt.Errorf("error calling SetIamPolicy: %w", err)
	}
	fmt.Fprintln(w, "Added roles to topic.")
	return nil
}

Java

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי הוראות ההגדרה של Java במאמר התחלה מהירה: שימוש בספריות לקוח. מידע נוסף מופיע במאמרי העזרה של Pub/Sub Java API.


import com.google.cloud.pubsub.v1.TopicAdminClient;
import com.google.iam.v1.Binding;
import com.google.iam.v1.GetIamPolicyRequest;
import com.google.iam.v1.Policy;
import com.google.iam.v1.SetIamPolicyRequest;
import com.google.pubsub.v1.TopicName;
import java.io.IOException;

public class SetTopicPolicyExample {
  public static void main(String... args) throws Exception {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "your-project-id";
    String topicId = "your-topic-id";

    setTopicPolicyExample(projectId, topicId);
  }

  public static void setTopicPolicyExample(String projectId, String topicId) throws IOException {
    try (TopicAdminClient topicAdminClient = TopicAdminClient.create()) {
      TopicName topicName = TopicName.of(projectId, topicId);
      GetIamPolicyRequest getIamPolicyRequest =
          GetIamPolicyRequest.newBuilder().setResource(topicName.toString()).build();
      Policy oldPolicy = topicAdminClient.getIamPolicy(getIamPolicyRequest);

      // Create new role -> members binding
      Binding binding =
          Binding.newBuilder()
              .setRole("roles/pubsub.editor")
              .addMembers("domain:google.com")
              .build();

      // Add new binding to updated policy
      Policy updatedPolicy = Policy.newBuilder(oldPolicy).addBindings(binding).build();

      SetIamPolicyRequest setIamPolicyRequest =
          SetIamPolicyRequest.newBuilder()
              .setResource(topicName.toString())
              .setPolicy(updatedPolicy)
              .build();
      Policy newPolicy = topicAdminClient.setIamPolicy(setIamPolicyRequest);
      System.out.println("New topic policy: " + newPolicy);
    }
  }
}

Node.js

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי הוראות ההגדרה של Node.js במאמר מדריך למתחילים: שימוש בספריות לקוח. מידע נוסף מופיע במאמרי העזרה של Pub/Sub Node.js API.

/**
 * TODO(developer): Uncomment this variable before running the sample.
 */
// const topicNameOrId = 'YOUR_TOPIC_NAME_OR_ID';

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

// Creates a client; cache this for further use
const pubSubClient = new PubSub();

async function setTopicPolicy(topicNameOrId) {
  // 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 pubSubClient
    .topic(topicNameOrId)
    .iam.setPolicy(newPolicy);
  console.log('Updated policy for topic: %j', updatedPolicy.bindings);
}

PHP

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

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי הוראות ההגדרה של Python במאמר מדריך למתחילים: שימוש בספריות לקוח. מידע נוסף מופיע במאמרי העזרה של ה-API בשפת Python של Pub/Sub.

from google.cloud import pubsub_v1

# TODO(developer): Choose an existing topic.
# project_id = "your-project-id"
# topic_id = "your-topic-id"

client = pubsub_v1.PublisherClient()
topic_path = client.topic_path(project_id, topic_id)

policy = client.get_iam_policy(request={"resource": topic_path})

# Add all users as viewers.
policy.bindings.add(role="roles/pubsub.viewer", members=["domain:google.com"])

# 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(request={"resource": topic_path, "policy": policy})

print("IAM policy for topic {} set: {}".format(topic_id, policy))

Ruby

בדוגמה הבאה נעשה שימוש בגרסה 3 של ספריית הלקוח של Pub/Sub ב-Ruby. אם אתם עדיין משתמשים בספרייה v2, עיינו במדריך להעברת נתונים (מיגרציה) ל-v3. לרשימה של דוגמאות קוד ב-Ruby v2, עיינו ב דוגמאות הקוד שהוצאו משימוש.

לפני שתנסו את הדוגמה הזו, פעלו לפי הוראות ההגדרה של Ruby במאמר התחלה מהירה: שימוש בספריות לקוח. מידע נוסף מופיע במאמרי העזרה של Pub/Sub Ruby API.

# topic_id              = "your-topic-id"
# role                  = "roles/pubsub.publisher"
# service_account_email =
# "serviceAccount:account_name@project_name.iam.gserviceaccount.com"

pubsub = Google::Cloud::PubSub.new

bindings = Google::Iam::V1::Binding.new \
  role: role,
  members: [service_account_email]

pubsub.iam.set_iam_policy resource: pubsub.topic_path(topic_id),
                          policy: {
                            bindings: [bindings]
                          }

בדיקת ההרשאות

אפשר להשתמש ב-method‏ testIamPermissions() כדי לבדוק אילו מההרשאות שניתנו אפשר להוסיף או להסיר במשאב הנתון. היא מקבלת כפרמטרים שם של משאב וקבוצת הרשאות, ומחזירה את קבוצת המשנה של ההרשאות.

הנה קוד לדוגמה לבדיקת הרשאות למינוי:

C#‎

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי הוראות ההגדרה של C# ‎ במאמר התחלה מהירה: שימוש בספריות לקוח. מידע נוסף מופיע במאמרי העזרה של Pub/Sub C# API.


using Google.Cloud.Iam.V1;
using Google.Cloud.PubSub.V1;

public class TestSubscriptionIamPermissionsSample
{
    public TestIamPermissionsResponse TestSubscriptionIamPermissionsResponse(string projectId, string subscriptionId)
    {
        TestIamPermissionsRequest request = new TestIamPermissionsRequest
        {
            ResourceAsResourceName = SubscriptionName.FromProjectSubscription(projectId, subscriptionId),
            Permissions = { "pubsub.subscriptions.get", "pubsub.subscriptions.update" }
        };
        PublisherServiceApiClient publisher = PublisherServiceApiClient.Create();
        TestIamPermissionsResponse response = publisher.IAMPolicyClient.TestIamPermissions(request);
        return response;
    }
}

gcloud

gcloud iam list-testable-permissions \
   https://pubsub.googleapis.com/v1/projects/${PROJECT}/subscriptions/${SUBSCRIPTION} \
   --format json

פלט:

 [
    {
     "name": "pubsub.subscriptions.consume",
     "stage": "GA"
   },
   {
     "name": "pubsub.subscriptions.delete",
     "stage": "GA"
   },
   {
     "name": "pubsub.subscriptions.get",
     "stage": "GA"
   },
   {
     "name": "pubsub.subscriptions.getIamPolicy",
     "stage": "GA"
    },
   {
     "name": "pubsub.subscriptions.setIamPolicy",
     "stage": "GA"
   },
   {
     "name": "pubsub.subscriptions.update",
     "stage": "GA"
   }
 ]

המשך

בדוגמה הבאה נעשה שימוש בגרסה הראשית של ספריית הלקוח של Pub/Sub ב-Go‏ (v2). אם אתם עדיין משתמשים בספרייה של גרסה 1, כדאי לעיין במדריך להעברת נתונים לגרסה 2. כאן תוכלו למצוא רשימה של דוגמאות קוד שהוצאו משימוש בגרסה 1.

לפני שתנסו את הדוגמה הזו, פעלו לפי הוראות ההגדרה של Go במאמר מדריך למתחילים: שימוש בספריות לקוח. מידע נוסף מופיע במסמכי העזר של ה-API של Pub/Sub Go.

import (
	"context"
	"fmt"
	"io"

	"cloud.google.com/go/iam/apiv1/iampb"
	"cloud.google.com/go/pubsub/v2"
)

func testPermissions(w io.Writer, projectID, subID string) ([]string, error) {
	// projectID := "my-project-id"
	// subID := "my-sub"
	ctx := context.Background()
	client, err := pubsub.NewClient(ctx, projectID)
	if err != nil {
		return nil, fmt.Errorf("pubsub.NewClient: %w", err)
	}

	req := &iampb.TestIamPermissionsRequest{
		Resource: fmt.Sprintf("projects/%s/subscriptions/%s", projectID, subID),
		Permissions: []string{
			"pubsub.subscriptions.consume",
			"pubsub.subscriptions.update",
		},
	}
	resp, err := client.SubscriptionAdminClient.TestIamPermissions(ctx, req)
	if err != nil {
		return nil, fmt.Errorf("error calling TestIamPermissions: %w", err)
	}
	for _, perm := range resp.Permissions {
		fmt.Fprintf(w, "Allowed: %v\n", perm)
	}
	return resp.Permissions, nil
}

Java

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי הוראות ההגדרה של Java במאמר התחלה מהירה: שימוש בספריות לקוח. מידע נוסף מופיע במאמרי העזרה של Pub/Sub Java API.


import com.google.cloud.pubsub.v1.SubscriptionAdminClient;
import com.google.iam.v1.TestIamPermissionsRequest;
import com.google.iam.v1.TestIamPermissionsResponse;
import com.google.pubsub.v1.ProjectSubscriptionName;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;

public class TestSubscriptionPermissionsExample {
  public static void main(String... args) throws Exception {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "your-project-id";
    String subscriptionId = "your-subscription-id";

    testSubscriptionPermissionsExample(projectId, subscriptionId);
  }

  public static void testSubscriptionPermissionsExample(String projectId, String subscriptionId)
      throws IOException {
    try (SubscriptionAdminClient subscriptionAdminClient = SubscriptionAdminClient.create()) {
      ProjectSubscriptionName subscriptionName =
          ProjectSubscriptionName.of(projectId, subscriptionId);

      List<String> permissions = new LinkedList<>();
      permissions.add("pubsub.subscriptions.consume");
      permissions.add("pubsub.subscriptions.update");

      TestIamPermissionsRequest testIamPermissionsRequest =
          TestIamPermissionsRequest.newBuilder()
              .setResource(subscriptionName.toString())
              .addAllPermissions(permissions)
              .build();

      TestIamPermissionsResponse testedPermissionsResponse =
          subscriptionAdminClient.testIamPermissions(testIamPermissionsRequest);

      System.out.println("Tested:\n" + testedPermissionsResponse);
    }
  }
}

Node.js

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי הוראות ההגדרה של Node.js במאמר מדריך למתחילים: שימוש בספריות לקוח. מידע נוסף מופיע במאמרי העזרה של Pub/Sub Node.js API.

/**
 * TODO(developer): Uncomment this variable before running the sample.
 */
// const subscriptionNameOrId = 'YOUR_SUBSCRIPTION_NAME_OR_ID';

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

// Creates a client; cache this for further use
const pubSubClient = new PubSub();

async function testSubscriptionPermissions(subscriptionNameOrId) {
  const permissionsToTest = [
    'pubsub.subscriptions.consume',
    'pubsub.subscriptions.update',
  ];

  // Tests the IAM policy for the specified subscription
  const [permissions] = await pubSubClient
    .subscription(subscriptionNameOrId)
    .iam.testPermissions(permissionsToTest);

  console.log('Tested permissions for subscription: %j', permissions);
}

PHP

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי הוראות ההגדרה של PHP במאמר מדריך למתחילים: שימוש בספריות לקוח. מידע נוסף מופיע במאמרי העזרה של 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

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי הוראות ההגדרה של Python במאמר מדריך למתחילים: שימוש בספריות לקוח. מידע נוסף מופיע במאמרי העזרה של ה-API בשפת Python של Pub/Sub.

from google.cloud import pubsub_v1

# TODO(developer): Choose an existing subscription.
# project_id = "your-project-id"
# subscription_id = "your-subscription-id"

client = pubsub_v1.SubscriberClient()
subscription_path = client.subscription_path(project_id, subscription_id)

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

allowed_permissions = client.test_iam_permissions(
    request={"resource": subscription_path, "permissions": permissions_to_check}
)

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

client.close()

Ruby

בדוגמה הבאה נעשה שימוש בספריית הלקוח של Ruby Pub/Sub בגרסה 3. אם אתם עדיין משתמשים בספרייה v2, עיינו במדריך להעברת נתונים (מיגרציה) ל-v3. לרשימה של דוגמאות קוד ב-Ruby v2, עיינו ב דוגמאות הקוד שהוצאו משימוש.

לפני שתנסו את הדוגמה הזו, פעלו לפי הוראות ההגדרה של Ruby במאמר מדריך למתחילים: שימוש בספריות לקוח. מידע נוסף מופיע במאמרי העזרה של Pub/Sub Ruby API.

# subscription_id = "your-subscription-id"

pubsub = Google::Cloud::PubSub.new
subscription_admin = pubsub.subscription_admin
permissions = ["pubsub.subscriptions.consume", "pubsub.subscriptions.update"]

response = pubsub.iam.test_iam_permissions \
  resource: pubsub.subscription_path(subscription_id),
  permissions: permissions

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

הנה קוד לדוגמה לבדיקת הרשאות לנושא:

C#‎

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי הוראות ההגדרה של C# ‎ במאמר התחלה מהירה: שימוש בספריות לקוח. מידע נוסף מופיע במאמרי העזרה של Pub/Sub C# API.


using Google.Cloud.Iam.V1;
using Google.Cloud.PubSub.V1;

public class TestTopicIamPermissionsSample
{
    public TestIamPermissionsResponse TestTopicIamPermissions(string projectId, string topicId)
    {
        TestIamPermissionsRequest request = new TestIamPermissionsRequest
        {
            ResourceAsResourceName = TopicName.FromProjectTopic(projectId, topicId),
            Permissions = { "pubsub.topics.get", "pubsub.topics.update" }
        };
        PublisherServiceApiClient publisher = PublisherServiceApiClient.Create();
        TestIamPermissionsResponse response = publisher.IAMPolicyClient.TestIamPermissions(request);
        return response;
    }
}

gcloud

gcloud iam list-testable-permissions \
   https://pubsub.googleapis.com/v1/projects/${PROJECT}/topics/${TOPIC} \
   --format json

תשובה

 [
   {
     "name": "pubsub.topics.attachSubscription",
     "stage": "GA"
   },
   {
     "name": "pubsub.topics.delete",
     "stage": "GA"
   },
   {
     "name": "pubsub.topics.detachSubscription",
     "stage": "GA"
   },
   {
     "name": "pubsub.topics.get",
     "stage": "GA"
   },
   {
     "name": "pubsub.topics.getIamPolicy",
     "stage": "GA"
   },
   {
     "name": "pubsub.topics.publish",
     "stage": "GA"
   },
   {
     "name": "pubsub.topics.setIamPolicy",
     "stage": "GA"
   },
   {
     "name": "pubsub.topics.update",
     "stage": "GA"
   }
 ]

המשך

בדוגמה הבאה נעשה שימוש בגרסה הראשית של ספריית הלקוח של Pub/Sub ב-Go‏ (v2). אם אתם עדיין משתמשים בספרייה של גרסה 1, כדאי לעיין במדריך להעברת נתונים לגרסה 2. כאן תוכלו למצוא רשימה של דוגמאות קוד שהוצאו משימוש בגרסה 1.

לפני שתנסו את הדוגמה הזו, פעלו לפי הוראות ההגדרה של Go במאמר מדריך למתחילים: שימוש בספריות לקוח. מידע נוסף מופיע במסמכי העזר של ה-API של Pub/Sub Go.

import (
	"context"
	"fmt"
	"io"

	"cloud.google.com/go/iam/apiv1/iampb"
	"cloud.google.com/go/pubsub/v2"
)

func testPermissions(w io.Writer, projectID, topicID string) ([]string, error) {
	// projectID := "my-project-id"
	// topicID := "my-topic"
	ctx := context.Background()
	client, err := pubsub.NewClient(ctx, projectID)
	if err != nil {
		return nil, fmt.Errorf("pubsub.NewClient: %w", err)
	}

	req := &iampb.TestIamPermissionsRequest{
		Resource: fmt.Sprintf("projects/%s/topics/%s", projectID, topicID),
		Permissions: []string{
			"pubsub.topics.publish",
			"pubsub.topics.update",
		},
	}
	resp, err := client.TopicAdminClient.TestIamPermissions(ctx, req)
	if err != nil {
		return nil, fmt.Errorf("error calling TestIamPermissions: %w", err)
	}
	for _, perm := range resp.Permissions {
		fmt.Fprintf(w, "Allowed: %v\n", perm)
	}
	return resp.Permissions, nil
}

Java

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי הוראות ההגדרה של Java במאמר התחלה מהירה: שימוש בספריות לקוח. מידע נוסף מופיע במאמרי העזרה של Pub/Sub Java API.


import com.google.cloud.pubsub.v1.TopicAdminClient;
import com.google.iam.v1.TestIamPermissionsRequest;
import com.google.iam.v1.TestIamPermissionsResponse;
import com.google.pubsub.v1.ProjectTopicName;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;

public class TestTopicPermissionsExample {

  public static void main(String... args) throws Exception {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "your-project-id";
    String topicId = "your-topic-id";

    testTopicPermissionsExample(projectId, topicId);
  }

  public static void testTopicPermissionsExample(String projectId, String topicId)
      throws IOException {
    try (TopicAdminClient topicAdminClient = TopicAdminClient.create()) {
      ProjectTopicName topicName = ProjectTopicName.of(projectId, topicId);

      List<String> permissions = new LinkedList<>();
      permissions.add("pubsub.topics.attachSubscription");
      permissions.add("pubsub.topics.publish");
      permissions.add("pubsub.topics.update");

      TestIamPermissionsRequest testIamPermissionsRequest =
          TestIamPermissionsRequest.newBuilder()
              .setResource(topicName.toString())
              .addAllPermissions(permissions)
              .build();

      TestIamPermissionsResponse testedPermissionsResponse =
          topicAdminClient.testIamPermissions(testIamPermissionsRequest);

      System.out.println("Tested:\n" + testedPermissionsResponse);
    }
  }
}

Node.js

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי הוראות ההגדרה של Node.js במאמר מדריך למתחילים: שימוש בספריות לקוח. מידע נוסף מופיע במאמרי העזרה של Pub/Sub Node.js API.

/**
 * TODO(developer): Uncomment this variable before running the sample.
 */
// const topicNameOrId = 'YOUR_TOPIC_NAME_OR_ID';

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

// Creates a client; cache this for further use
const pubSubClient = new PubSub();

async function testTopicPermissions(topicNameOrId) {
  const permissionsToTest = [
    'pubsub.topics.attachSubscription',
    'pubsub.topics.publish',
    'pubsub.topics.update',
  ];

  // Tests the IAM policy for the specified topic
  const [permissions] = await pubSubClient
    .topic(topicNameOrId)
    .iam.testPermissions(permissionsToTest);

  console.log('Tested permissions for topic: %j', permissions);
}

PHP

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי הוראות ההגדרה של PHP במאמר מדריך למתחילים: שימוש בספריות לקוח. מידע נוסף מופיע במאמרי העזרה של 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

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי הוראות ההגדרה של Python במאמר מדריך למתחילים: שימוש בספריות לקוח. מידע נוסף מופיע במאמרי העזרה של ה-API בשפת Python של Pub/Sub.

from google.cloud import pubsub_v1

# TODO(developer): Choose an existing topic.
# project_id = "your-project-id"
# topic_id = "your-topic-id"

client = pubsub_v1.PublisherClient()
topic_path = client.topic_path(project_id, topic_id)

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

allowed_permissions = client.test_iam_permissions(
    request={"resource": topic_path, "permissions": permissions_to_check}
)

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

Ruby

בדוגמה הבאה נעשה שימוש בגרסה 3 של ספריית הלקוח של Pub/Sub ב-Ruby. אם אתם עדיין משתמשים בספרייה v2, עיינו במדריך להעברת נתונים (מיגרציה) ל-v3. לרשימה של דוגמאות קוד ב-Ruby v2, עיינו ב דוגמאות הקוד שהוצאו משימוש.

לפני שתנסו את הדוגמה הזו, פעלו לפי הוראות ההגדרה של Ruby במאמר מדריך למתחילים: שימוש בספריות לקוח. מידע נוסף מופיע במאמרי העזרה של Pub/Sub Ruby API.

# topic_id = "your-topic-id"

pubsub = Google::Cloud::PubSub.new
topic_admin = pubsub.topic_admin
permissions = ["pubsub.topics.attachSubscription", "pubsub.topics.publish",
               "pubsub.topics.update"]

response = pubsub.iam.test_iam_permissions \
  resource: pubsub.topic_path(topic_id),
  permissions: permissions

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

תקשורת בין פרויקטים

ה-IAM של Pub/Sub שימושי לכוונון הגישה בתקשורת בין פרויקטים.

פרסום לנושא בפרויקט אחר

נניח שאתם רוצים שחשבון שירות בפרויקט א' יפרסם הודעות בנושא בפרויקט ב'. כדי להפעיל את התרחיש הזה:

  1. מפעילים את Pub/Sub API בפרויקט א'.

  2. מקצים לחשבון השירות את ההרשאה pubsub.topics.publish בפרויקט ב' או בנושא. התפקיד פרסום הודעות ב-Pub/Sub (roles/pubsub.publisher) כולל את ההרשאה הזו.

יצירת מינוי בפרויקט אחר

נניח שאתם רוצים שחשבון שירות בפרויקט א' ייצור מינוי בפרויקט א' לנושא בפרויקט ב'. כדי להפעיל את התרחיש הזה:

  1. מפעילים את Pub/Sub API בשני הפרויקטים.

  2. נותנים לחשבון השירות את ההרשאות הבאות:

    • ‫pubsub.subscriptions.create בפרויקט א'.
    • ‫pubsub.topics.attachSubscription בנושא בפרויקט ב'.

    התפקיד עריכה ב-Pub/Sub (roles/pubsub.editor) כולל את ההרשאות האלה.

  3. יוצרים מינוי בפרויקט א' שמקושר לנושא בפרויקט ב'.

קבלת הודעות מנושא בפרויקט אחר

נניח שאתם רוצים שחשבון שירות בפרויקט א' יקבל הודעות ממינוי בפרויקט ב'. כדי להפעיל את התרחיש הזה:

  1. מפעילים את Pub/Sub API בפרויקט א'.

  2. מקצים לחשבון השירות את התפקיד מנוי Pub/Sub (roles/pubsub.subscriber) בפרויקט ב' או במינוי.

התנהגות במצב של זמינות חלקית

בדיקות ההרשאה תלויות במערכת המשנה של IAM. כדי להציע זמן אחזור נמוך באופן עקבי לפעולות של נתונים (פרסום וצריכת הודעות), המערכת עשויה לחזור למדיניות IAM שנשמרה במטמון. במאמרי העזרה של IAM מוסבר מתי השינויים ייכנסו לתוקף.

המאמרים הבאים