1

我是 Google Cloud 和 BigQuery 的新手。我查看了其他十几个似乎相关的问题,但没有看到我从这些答案中遗漏了什么。我正在尝试查询公共数据集。

错误:

Caused by: com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 Forbidden
{
  "code" : 403,
  "errors" : [ {
    "domain" : "global",
    "message" : "Access Denied: Project airy-advantage-235802: The user kafka-learning@airy-advantage-235802.iam.gserviceaccount.com does not have bigquery.jobs.create permission in project airy-advantage-235802.",
    "reason" : "accessDenied"
  } ],
  "message" : "Access Denied: Project airy-advantage-235802: The user kafka-learning@airy-advantage-235802.iam.gserviceaccount.com does not have bigquery.jobs.create permission in project airy-advantage-235802."
}
    at com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:150)
    at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:113)
    at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:40)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest$1.interceptResponse(AbstractGoogleClientRequest.java:401)
    at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1132)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:499)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:432)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:549)
    at com.google.cloud.bigquery.spi.v2.HttpBigQueryRpc.create(HttpBigQueryRpc.java:183)

我做了什么:

  1. 创建了新的 Google Cloud 帐户
  2. 创建了新项目,Google 为其分配了项目 ID airy-advantage-235802,项目名称为 Kafka Learning。
  3. 创建了一个服务帐户 kafka-learning@airy-advantage-235802.iam.gserviceaccount.com
  4. 授予该用户项目中的 BigQuery Admin 角色(我最初尝试使用 BigQuery User 和 BigQuery Data Viewer)
  5. 我将 JSON 凭据文件保存到本地文件夹
  6. 我将环境变量设置GOOGLE_APPLICATION_CREDENTIALS为 JSON 文件的路径
  7. 我有一个小型 Java 项目来查询公共数据集
  8. 收到上述错误
  9. 已启用验证计费(据我所知,见下文)

我错过了一步吗?

谷歌云项目设置

服务帐户设置

在此处输入图像描述

var bigquery = BigQueryOptions.getDefaultInstance().getService();
var query = "SELECT * FROM `bigquery-public-data.google_analytics_sample.ga_sessions_20160801` LIMIT 10";
var queryConfig = QueryJobConfiguration.newBuilder(query).build();
var table = bigquery.query(queryConfig);

我还尝试通过将构建器更改为此显式设置项目 ID(也在 json 文件中):

var bigquery = BigQueryOptions.newBuilder().setProjectId("airy-advantage-235802").build().getService();
4

2 回答 2

2

这通常发生在您删除并创建与“新”服务帐户同名的服务帐户时,可能会绑定旧角色。因此,您可以:

  • 使用新的服务帐号
  • 显式删除将该角色授予服务帐户的任何绑定
  • 将这些角色重新授予“新”服务帐户。

有关更多信息,您可以查看此链接

希望能帮助到你。

于 2019-03-27T16:06:14.350 回答
0

我也遇到这个问题。阅读文档您将解决它。

可以删除一个服务帐户,然后创建一个具有相同名称的新服务帐户。如果您重复使用已删除服务帐户的名称,可能会导致意外行为。

删除服务帐户时,不会立即删除其角色绑定。如果您创建一个与最近删除的服务帐户同名的新服务帐户,旧的绑定可能仍然存在;但是,即使两个帐户具有相同的电子邮件地址,它们也不适用于新的服务帐户。出现此行为是因为服务帐号在创建时在 Cloud IAM 中被赋予了唯一 ID。在内部,所有角色绑定都是使用这些 ID 授予的,而不是服务帐户的电子邮件地址。因此,已删除服务帐户的任何角色绑定都不适用于使用相同电子邮件地址的新服务帐户。

为避免混淆,我们建议使用唯一的服务帐户名称。如果这不可能,您可以通过以下方式向新服务帐户授予角色:

显式删除将该角色授予旧服务帐户的所有绑定。将这些角色重新授予新服务帐户。您必须先删除角色绑定,然后才能重新添加它们。通过将角色授予旧的、已删除的服务帐户,只需再次授予该角色就会静默失败。 在此处输入链接描述

于 2019-05-17T08:51:38.743 回答