2016-02-29 4 views
0

У меня есть два проекта Project-A и Project-B.Кросс-проект подписки PubSub через IAM ServiceAccount

В Project-A У меня есть служебная учетная запись [email protected], которую я хочу использовать для чтения сообщений из темы PubSub Project-B.

Я создал подписку на тему Project-B projects/project-b/subscriptions/data. Затем добавили [email protected] на вкладку «Разрешения» как Subscriber. Я считаю, что это должно дать мне доступ.

Но если я стараюсь:

TestIamPermissionsRequest iamreq = new TestIamPermissionsRequest(); 
iamreq.setPermissions(Arrays.asList(
     "pubsub.subscriptions.consume", 
     "pubsub.subscriptions.get" 
)); 
pubsub.projects().subscriptions() 
     .testIamPermissions(topicSubscription, iamreq).execute(); 

возвращает пустой список разрешений.

И для фактического запроса тяговой:

PullRequest pull = new PullRequest(); 
pull.setMaxMessages(1); 
pull.setReturnImmediately(true); 
pubsub.projects().subscriptions().pull(topicSubsription, pull).execute(); 

Он терпит неудачу с:

com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 
{ 
    "code" : 403, 
    "errors" : [ { 
    "domain" : "global", 
    "message" : "User not authorized to perform this action.", 
    "reason" : "forbidden" 
    } ], 
    "message" : "User not authorized to perform this action.", 
    "status" : "PERMISSION_DENIED" 
} 

Я проверил, что учетная запись службы в списке абонентов, а также попытался удалить/добавить его снова, и т. д. Пробовал с другим проектом. Это ничего не меняет.

Если у меня есть подписка на подписку и учетную запись в PubSub в рамках одного проекта Cloud Project, то она отлично работает, как для запросов testIamPermissions, так и для pull. Означает ли это, что учетная запись службы IAM не может использоваться для доступа к PubSub из другого проекта?

Обратите внимание, что он отлично подходит для доступа к хранилищу из другого проекта. Это означает, что проблема специфична только для PubSub. Вот почему я думаю, что что-то пропустил на стороне конфигурации PubSub. Но что именно?

+0

Кажется, что Cloud Console сломана. Потому что, если я добавляю разрешение подписчика напрямую через API, он работает так, как ожидалось (по-прежнему исследует ...) –

+0

Похоже, вы вызываете 'pubsub.projects(). Subscriptions(). TestIamPermissions' против темы, которая кажется неправильной. –

+0

это правильная тема подписки, в форме 'проекты /% xxx%/subscriptions /% yyyy%'. Клиентский lib создает другое исключение, если я попытаюсь передать недопустимое значение там –

ответ

0

Для потребления из темы Подписная подписка должна быть предоставлена ​​подписчикам. К сожалению, сейчас это невозможно с Cloud Console.

Проблема заключалась в том, что Cloud Console вводит в заблуждение, выбирая тему, которую я планирую установить для разрешений на тему подписки на темы (поскольку в конце концов нет отдельного интерфейса для подписчиков по темам). Но это не работает. Форма разрешений применяет изменения только к выбранной теме, игнорируя все существующие подписки на тему. В принципе, вы не можете просматривать или редактировать разрешения для подписчиков, в настоящее время нет такого пользовательского интерфейса.

PS Есть способ сделать это через API. Но это не работает для моей ситуации