Google compute engine 使用Google Cloud Dataflow如何在GCE计算实例上使用正确的凭据运行?

Google compute engine 使用Google Cloud Dataflow如何在GCE计算实例上使用正确的凭据运行?,google-compute-engine,google-cloud-dataflow,Google Compute Engine,Google Cloud Dataflow,我对谷歌云数据流还不熟悉,下面的问题很明显 我已经编写了一个数据流应用程序,并且可以在本地和GCE实例上使用我的个人凭据让它毫无问题地运行。但是,我似乎无法使用计算引擎实例的服务凭据或我使用控制台的API&AUTH部分创建的服务凭据来破解使其运行的正确步骤。当我运行时,总是出现401未授权错误 这是我试过的 1) 创建虚拟机,授予对存储、数据存储、sql和计算引擎的访问权限。我的理解是,这可能创建了一个特定于CI的服务帐户,该帐户是服务器的默认凭据。当应用程序在此实例上运行时,应使用与用户身份验

我对谷歌云数据流还不熟悉,下面的问题很明显

我已经编写了一个数据流应用程序,并且可以在本地和GCE实例上使用我的个人凭据让它毫无问题地运行。但是,我似乎无法使用计算引擎实例的服务凭据或我使用控制台的API&AUTH部分创建的服务凭据来破解使其运行的正确步骤。当我运行时,总是出现401未授权错误

这是我试过的

1) 创建虚拟机,授予对存储、数据存储、sql和计算引擎的访问权限。我的理解是,这可能创建了一个特定于CI的服务帐户,该帐户是服务器的默认凭据。当应用程序在此实例上运行时,应使用与用户身份验证相同的方法来使用它们。这是我拿到401的地方。我的问题是。。。我在哪里可以看到本应创建的服务帐户?还是我只是相信它存在于某个地方

2) 在开发人员控制台的API和身份验证部分创建了服务凭据。然后使用cloud auth activate service account并通过将命令指向我下载的凭据json文件来激活该帐户。有点像使用gcloudauth登录时的OAUTH往返。这里我也得到了401

3) 最后一件事是使用步骤2中与GCE实例分离的服务凭据,然后创建一个实现CredentialFactory接口的对象,并将其传递给PipelineOptions。但是,当它运行时,应用程序现在崩溃,并出现一个错误,表示它正在寻找一个不在CredentialFactory接口中的方法fromOptions。选项是如何配置的,凭证工厂是什么样子的,以及下面的堆栈跟踪

我很乐意使用上述三种方法中的任何一种来使用服务凭据,如果我能让它们中的任何一种起作用的话。如果您能提供任何关于我做错了什么、我遗漏了哪些步骤以及其他未探索的选项的见解,我们将不胜感激。文件有点不连贯。如果有一个明确的分步指南,那么链接就足够了。到目前为止,我自己的发现几乎没有什么帮助

如果我能提供任何其他信息,请让我知道

下面是一些可能有用的代码,以及使用凭证工厂运行代码时得到的堆栈跟踪

选项设置代码如下所示:

GcrDataflowPipelineOptions=PipelineOptionsFactory.fromArgs(args)
.withValidation()
.as(GcrDataflowPipelineOptions.class);
期权。setKind(“县”);
options.setCredentialFactoryClass(GoogleCredentialProvider.class);
GoogleCredentialProvider.java

请注意,作为创建服务帐户(重命名)的一部分,我下载的json文件是作为资源从我的apps类路径加载的

公共类GoogleCredentialProvider实现CredentialFactory{
@凌驾
公共凭据getCredential()引发IOException,GeneralSecurityException{
最终字符串env=System.getProperty(“gcr_dataflow_env”,“local”);
Properties props=新属性();
ClassLoader=this.getClass().getClassLoader();
load(loader.getResourceAsStream(env+“-gcr dataflow.properties”);
最后一个字符串credFileName=props.getProperty(“gcloud.dataflow.service.account.file”);
InputStream credStream=loader.getResourceAsStream(credFileName);
GoogleCredential credential=GoogleCredential.fromStream(credStream);
返回凭证;
}
}
堆栈跟踪:

java.lang.RuntimeException:java.lang.RuntimeException:找不到工厂方法com.scotcro.gcr.dataflow.components.pipelines.GoogleCredentialProvider#fromOptions
位于com.google.cloud.dataflow.sdk.runners.dataflow.BasicSerializableSourceFormat.evaluateReadHelper(BasicSerializableSourceFormat.java:268)
在com.google.cloud.dataflow.sdk.io.Read$Bound$1.evaluate上(Read.java:123)
在com.google.cloud.dataflow.sdk.io.Read$Bound$1.evaluate上(Read.java:120)
位于com.google.cloud.dataflow.sdk.runners.DirectPipelineRunner$Evaluator.visitTransform(DirectPipelineRunner.java:684)
位于com.google.cloud.dataflow.sdk.runners.TransformTreeNode.visit(TransformTreeNode.java:200)
位于com.google.cloud.dataflow.sdk.runners.TransformTreeNode.visit(TransformTreeNode.java:196)
位于com.google.cloud.dataflow.sdk.runners.TransformHierarchy.visit(TransformHierarchy.java:99)
在com.google.cloud.dataflow.sdk.Pipeline.traversetopological上(Pipeline.java:208)
位于com.google.cloud.dataflow.sdk.runners.DirectPipelineRunner$Evaluator.run(DirectPipelineRunner.java:640)
位于com.google.cloud.dataflow.sdk.runners.DirectPipelineRunner.run(DirectPipelineRunner.java:354)
位于com.google.cloud.dataflow.sdk.runners.DirectPipelineRunner.run(DirectPipelineRunner.java:76)
位于com.google.cloud.dataflow.sdk.Pipeline.run(Pipeline.java:149)
位于com.scotcro.gcr.dataflow.app.GcrDataflowApp.run(GcrDataflowApp.java:65)
位于com.scotcro.gcr.dataflow.app.GcrDataflowApp.main(GcrDataflowApp.java:49)
原因:java.lang.RuntimeException:找不到工厂方法com.scotcro.gcr.dataflow.components.pipelines.GoogleCredentialProvider#fromOptions
位于com.google.cloud.dataflow.sdk.util.InstanceBuilder.buildFromMethod(InstanceBuilder.java:224)
位于com.google.cloud.dataflow.sdk.util.InstanceBuilder.build(InstanceBuilder.java:161)
在com.google.cloud.dataflow.sdk.options.GcpOptions$gcpuserredentialsfactory.create(GcpOptions.java:180)上
位于com.google.cloud.dataflow.sdk.options.GcpOptions$gcpuserredentialsfactory.create(GcpOptions.java:175)
位于com.google.cloud.dataflow.sdk.options.ProxyInvocationHandler.getDefault(ProxyInvocationHandler.java:288)
在com.google.cloud.dataflow.sdk.o上