Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java &引用;“拒绝访问”;尝试访问GCE上的BigQuery时_Java_Google Bigquery_Dataflow_Google Compute Engine - Fatal编程技术网

Java &引用;“拒绝访问”;尝试访问GCE上的BigQuery时

Java &引用;“拒绝访问”;尝试访问GCE上的BigQuery时,java,google-bigquery,dataflow,google-compute-engine,Java,Google Bigquery,Dataflow,Google Compute Engine,我开发并构建了一个jar文件,用于处理从两个BigQuery表读取的数据,然后将其写入另一个BigQuery表。 (有三个GCP项目,每个项目都有自己的BigQuery表。) jar文件是Maven构建和打包的结果。我使用了数据流SDK依赖项 在构建了一个jar文件之后,我在Mac上对它进行了测试,并检查了它是否工作正常。 然后,我将一个jar文件上传到GCE并再次测试。我认为它会很好地工作,但会出现如下错误: com.google.api.client.googleapis.json.goog

我开发并构建了一个jar文件,用于处理从两个BigQuery表读取的数据,然后将其写入另一个BigQuery表。 (有三个GCP项目,每个项目都有自己的BigQuery表。) jar文件是Maven构建和打包的结果。我使用了数据流SDK依赖项

在构建了一个jar文件之后,我在Mac上对它进行了测试,并检查了它是否工作正常。 然后,我将一个jar文件上传到GCE并再次测试。我认为它会很好地工作,但会出现如下错误:

com.google.api.client.googleapis.json.googlejson响应异常:403禁止 { “代码”:403, “错误”:[{ “域”:“全局”, “消息”:“拒绝访问:数据集${PROJECT\u ID}:${Dataset\u ID}:用户${MY\u ACCOUNT\u ID}没有数据集${PROJECT\u ID}:${Dataset\u ID}的bigquery.tables.list权限。”, “原因”:“拒绝访问” .... }

当我创建GCE实例时,我正确地设置了服务帐户。我确信这与此无关

我不明白为什么同一个jar运行方式不同,是否会出错

测试帐户是三个项目的成员或所有者。 在测试之前,我在Mac和GCE上使用以下命令:

  • gcloud身份验证登录
  • gcloud配置集项目rgpkorea datalake
  • gcloud auth应用程序默认登录
  • 在Java项目中,我创建了credential对象,并使用credential对象构建了BigQuery服务

    GoogleCredential credential = GoogleCredential.getApplicationDefault(HTTP_TRANSPORT, JSON_FACTORY);
    Bigquery bigquery = new Bigquery.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential)
                    .setApplicationName("BdtAndroidGaSessionMigrator" + CalendarUtil.getYesterdayAsDateFormat()).build();
    List<Tables> tableList = bigquery.tables().list("${PROJECT_ID}", "${DATASET_ID}").setMaxResults(9999999L).execute().getTables();
    
    GoogleCredential credential=GoogleCredential.getApplicationDefault(HTTP_传输,JSON_工厂);
    Bigquery Bigquery=new Bigquery.Builder(HTTP_传输、JSON_工厂、凭证)
    .setApplicationName(“BdtAndroidGaSessionMigrator”+CalendarUtil.getYesterdayAsDateFormat()).build();
    List tableList=bigquery.tables().List(“${PROJECT\u ID}”,“${DATASET\u ID}”).setMaxResults(9999999L.execute().getTables();
    
    为了安全起见,我将项目id和数据集id替换为EL表达式

    正如大家所知,Google Cloud SDK支持“gcloud init”命令。我也尝试了“gcloud init”命令,但结果并没有什么不同。 在我看来,根据GCP实例或本地计算机等环境的不同,上述命令的工作方式也有所不同

    如何解决“拒绝访问”问题?请帮助解决此问题

    附言。 请原谅我的英语不好。
    我怀疑我的英语能准确地向你反映我的问题。

    我自己解决这个问题。 对于像我这样遇到同样问题的人

    若要更正此问题,您可以检查每个项目是否设置了权限。每个帐户都设置了权限,即使它是服务帐户。我的意思是,您应该检查帐户GCP登录帐户和服务帐户是否作为成员添加到每个项目中。 在我的例子中,我添加了一个GCP登录帐户,但没有添加服务帐户


    我希望这能帮助你

    我自己解决这个问题。 对于像我这样遇到同样问题的人

    若要更正此问题,您可以检查每个项目是否设置了权限。每个帐户都设置了权限,即使它是服务帐户。我的意思是,您应该检查帐户GCP登录帐户和服务帐户是否作为成员添加到每个项目中。 在我的例子中,我添加了一个GCP登录帐户,但没有添加服务帐户

    我希望这对你有帮助