尝试在 GCE 上访问 BigQuery 时出现“访问被拒绝”

问题描述 投票:0回答:2

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

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

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

当我创建GCE实例时,我正确设置了服务帐户。我确信不是这个问题。

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

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

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

在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 实例或本地计算机等环境的不同而有所不同。

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

附注 原谅我糟糕的英语。 我怀疑我的英语是否准确地表达了我对你的问题。

java google-bigquery dataflow google-compute-engine
2个回答
2
投票

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

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

希望对你有帮助


0
投票

我通过提供服务帐户“存储管理员”权限解决了这个问题。应该探索更精细的访问控制。

© www.soinside.com 2019 - 2024. All rights reserved.