我开发并构建了一个 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 上使用此命令:
在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 实例或本地计算机等环境的不同而有所不同。
如何解决“访问被拒绝”问题?请帮忙。
附注 原谅我糟糕的英语。 我怀疑我的英语是否准确地表达了我对你的问题。
我自己解决了这个问题。 对于像我一样遇到同样问题的人。
要纠正此问题,您可以检查每个项目的权限设置。即使它是服务帐户,也会为每个帐户设置权限。我的意思是,您应该检查 GCP 登录帐户和服务帐户是否已作为成员添加到每个项目中。 就我而言,我添加了 GCP 登录帐户,但没有添加服务帐户。
希望对你有帮助
我通过提供服务帐户“存储管理员”权限解决了这个问题。应该探索更精细的访问控制。