Permissions 从Google PubSub提取消息不起作用-权限被拒绝

Permissions 从Google PubSub提取消息不起作用-权限被拒绝,permissions,google-cloud-platform,google-cloud-pubsub,google-cloud-sdk,Permissions,Google Cloud Platform,Google Cloud Pubsub,Google Cloud Sdk,我正在尝试从现有订阅中提取邮件,但每次尝试时都会出现“权限被拒绝”错误。不过,测试权限会为“pubsub.subscriptions.consume”返回“true”。也许这与使用现有订阅而不是创建新订阅有关?我还没有找到一种方法来做到这一点,而网上的每个例子都是这样做的 TopicName topic=TopicName.create(“云项目”、“sn-1000”); SubscriptionName subscription=SubscriptionName.create(“云项目”、“s

我正在尝试从现有订阅中提取邮件,但每次尝试时都会出现“权限被拒绝”错误。不过,测试权限会为“pubsub.subscriptions.consume”返回“true”。也许这与使用现有订阅而不是创建新订阅有关?我还没有找到一种方法来做到这一点,而网上的每个例子都是这样做的

TopicName topic=TopicName.create(“云项目”、“sn-1000”);
SubscriptionName subscription=SubscriptionName.create(“云项目”、“sn-1000”);
字符串accountFile=“ServiceAccount\u sn-1000.json”;
CredentialsProvider CredentialsProvider=FixedCredentialsProvider.create(
ServiceAccountCredentials.fromStream(新文件输入流(accountFile))
);
订阅管理设置订阅管理设置=
SubscriptionAdminSettings.defaultBuilder()
.setCredentialsProvider(credentialsProvider)
.build();
//这就是它失败的地方
订阅管理客户端订阅管理客户端=
创建(subscriptionAdminSettings);
subscriptionAdminClient.createSubscription(订阅,主题,PushConfig.getDefaultInstance(),0);
Subscriber=Subscriber.defaultBuilder(订阅,新的MyMessageReceiver()).build();
subscriber.addListener(新建subscriber.Listener()){
@凌驾
public void失败(Subscriber.State from,Throwable失败){
//处理失败。当订阅服务器遇到致命错误并正在关闭时调用此函数。
系统错误打印项次(失败);
}
},more executors.directExecutor());
subscriber.startAsync().awaitRunning();
if(subscriber.state().equals(ApiService.state.FAILED)){
subscriber.stopAsync().awaitTerminated();
返回;
}
//打印写入自定义MyMessageReceiver类中缓冲区的消息,该类实现MessageReceiver
subscriber.stopAsync().awaitTerminated();
在控制台中执行此代码时,我收到此错误:

com.google.api.gax.grpc.GrpcApiException:io.grpc.StatusRuntimeException:PERMISSION\u DENIED:User无权执行此操作。
位于com.google.api.gax.grpc.GrpcExceptionCallable$ExceptionOnTransformingFuture.onFailure(GrpcExceptionCallable.java:112)
在com.google.api.core.apifertures$1.onFailure(apifertures.java:53)
位于com.google.common.util.concurrent.Futures$4.run(Futures.java:1123)
在com.google.common.util.concurrent.MoreExecutors$DirectExecutor.execute(MoreExecutors.java:435)
位于com.google.common.util.concurrent.AbstractFuture.executeListener(AbstractFuture.java:900)
位于com.google.common.util.concurrent.AbstractFuture.complete(AbstractFuture.java:811)
位于com.google.common.util.concurrent.AbstractFuture.setException(AbstractFuture.java:675)
在io.grpc.stub.ClientCalls$GrpcFuture.setException(ClientCalls.java:466)
在io.grpc.stub.ClientCalls$UnaryStreamToFuture.onClose(ClientCalls.java:442)中
在io.grpc.internal.ClientCallImpl.closeObserver上(ClientCallImpl.java:426)
在io.grpc.internal.ClientCallImpl.access$100(ClientCallImpl.java:76)
在io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl.close(ClientCallImpl.java:512)处
在io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl.access$700(ClientCallImpl.java:429)
在io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1StreamClosed.runInContext(ClientCallImpl.java:544)
在io.grpc.internal.ContextRunnable.run(ContextRunnable.java:52)
在io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:117)
位于java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
在java.util.concurrent.FutureTask.run(FutureTask.java:266)处
位于java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
位于java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
运行(Thread.java:748)
原因:io.grpc.StatusRuntimeException:权限被拒绝:用户无权执行此操作。
at io.grpc.Status.asRuntimeException(Status.java:543)
... 还有15个

失败的一行是您试图创建订阅,而不是尝试使用消息。“pubsub.subscriptions.consume”权限不足以创建订阅。详细信息包括执行不同操作所需的权限。要创建订阅,所需的权限为“包含云项目上的pubsub.subscriptions.create,以及请求主题上的pubsub.topics.attachSubscription”。请注意,要在项目a中对项目B中的主题T创建订阅,必须同时对项目a和主题T授予相应的权限。”

如果订阅已存在,则无需再次调用createSubscription,只需创建订户对象:

ProjectSubscriptionName subscriptionName = ProjectSubscriptionName.of("cloud-project", "sn-1000");
Subscriber subscriber = Subscriber.newBuilder(subscriptionName, new MyMessageReceiver()).build();

你设法解决了这个问题吗?