У меня есть два проекта 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. Но что именно?
Кажется, что Cloud Console сломана. Потому что, если я добавляю разрешение подписчика напрямую через API, он работает так, как ожидалось (по-прежнему исследует ...) –
Похоже, вы вызываете 'pubsub.projects(). Subscriptions(). TestIamPermissions' против темы, которая кажется неправильной. –
это правильная тема подписки, в форме 'проекты /% xxx%/subscriptions /% yyyy%'. Клиентский lib создает другое исключение, если я попытаюсь передать недопустимое значение там –