Google Cloud BigQuery Admin 服务帐户获得 "does not have bigquery.jobs.create permission"

Google Cloud BigQuery Admin service account gets "does not have bigquery.jobs.create permission"

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

错误:

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.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 云帐户
  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. 我有一个tiny Java project to query a public dataset
  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();

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

  • 使用新的服务帐户
  • 明确删除向服务帐户授予该角色的任何绑定
  • 将这些角色重新授予 "new" 服务帐户。

更多信息,你可以查看这个link

希望对您有所帮助。

我也遇到了这个问题。阅读文档你会解决它。

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

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

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

明确删除所有将角色授予旧服务帐户的绑定。 Re-granting 将这些角色分配给新的服务帐户。 您必须先删除角色绑定,然后再 re-adding 它们。通过将角色授予旧的、已删除的服务帐户,简单地再次授予角色将静默失败。 enter link description here