尝试访问GCE上的BigQuery时“访问被拒绝”

时间:2016-12-14 06:08:17

标签: java google-bigquery dataflow google-compute-engine

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

在构建一个jar文件后,我在我的Mac上测试了它,我检查它运行良好。 然后,我将一个jar文件上传到GCE并再次测试它。我认为它会运作良好,但它会发生一些错误:

com.google.api.client.googleapis.json.GoogleJsonResponseException:403 Forbidden {   “代码”:403,   “错误”:[{     “域名”:“全球”,     “message”:“拒绝访问:数据集$ {PROJECT_ID}:$ {DATASET_ID}:用户$ {MY_ACCOUNT_ID}没有数据集$ {PROJECT_ID}的bigquery.tables.list权限:$ {DATASET_ID}。”,     “理由”:“accessDenied .... }

当我创建GCE实例时,我正确设置了服务帐户。我确信这不是关于这一点的。

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

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

  1. gcloud auth login
  2. gcloud config set project rgpkorea-datalake
  3. gcloud auth application-default login
  4. 在Java项目中,我创建了凭证对象并使用凭证对象构建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();
    

    为了安全起见,我将项目ID和数据集ID替换为EL表达式。

    如您所知,Google-Cloud-SDK支持“gcloud init”命令。我也试过“gcloud init”命令,但结果没有什么不同。 在我的猜测中,上述命令的工作方式不同取决于GCP实例或本地机器等环境。

    如何解决“拒绝访问”问题?请帮忙。

    P.S。 原谅我可怜的英语。 我怀疑我的英语确切地向你展示了我的问题。

1 个答案:

答案 0 :(得分:0)

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

要更正此问题,您可以检查每个项目的权限。即使是服务帐户,也会为每个帐户设置权限。我的意思是你应该检查帐户GCP登录帐户和服务帐户是否作为成员添加到每个项目。 就我而言,我添加了一个GCP登录帐户,但没有添加服务帐户。

我希望这可以帮到你

相关问题