2016-12-14 87 views
0

我开发并构建了一个jar文件,它处理来自两个BigQuery表的读取操作,然后将其写入另一个BigQuery表。 (有三个GCP项目,每个项目都有自己的BigQuery表。) 该jar文件是由Maven构建和打包的结果。我使用了Dataflow SDK依赖关系。尝试访问GCE上的BigQuery时出现“拒绝访问”

建立一个jar文件后,我在我的Mac上测试了它,并检查了它的效果。 然后,我将一个jar文件上传到GCE并再次进行测试。我认为这将很好地工作,但它发生的一些错误是这样的:

com.google.api.client.googleapis.json.GoogleJsonResponseException:403禁止 { “代码”:403, “错误”:[{ “domain”:“global”, “message”:“访问被拒绝:数据集$ {PROJECT_ID}:$ {DATASET_ID}:用户$ {MY_ACCOUNT_ID}对数据集$ {PROJECT_ID}没有bigquery.tables.list权限:$ {} DATASET_ID “ ”的原因。“:” 存取遭拒 .... }

当我创建GCE比如我设置服务帐户正确,我相信它`不是这个。

我不明白为什么同样的jar运行不同,使错误或不?

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

  1. gcloud身份验证登录
  2. gcloud配置集项目rgpkorea-datalake
  3. gcloud身份验证的应用程序的默认登录

在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. 原谅我可怜的英语。 我怀疑我的英语完全向你介绍我对你有什么问题。

回答

0

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

要纠正这个问题,您可以检查每个项目的权限。即使它是服务帐户,权限也会设置为每个帐户。我的意思是你应该检查帐户都GCP登录帐户和服务帐户被添加为每个项目的成员。 在我的情况下,我添加了一个GCP登录帐户,但没有添加服务帐户。我希望这对你有所帮助

相关问题