【问题标题】:xxxx@gmail.com does not have bigquery.jobs.create permission in project yyyyxxxx@gmail.com 在项目 yyyy 中没有 bigquery.jobs.create 权限
【发布时间】:2018-12-24 07:10:45
【问题描述】:

我是 Google Cloud 和 BigQuery 的新手

我有一个包含 2 个项目的云实例。一个是 Compute Engine 项目,另一个是 BigQuery 项目。我可以从 Compute Engine 项目成功获取访问令牌和刷新令牌。但是,当我尝试访问 BigQuery 项目时,出现以下错误:

xxxx@gmail.com 在项目 yyyy 中没有 bigquery.jobs.create 权限

我在 BigQuery 中创建了数据集,并将公共数据复制到每个数据集中。我还确认 xxxx@gmail.com 是每个数据集的所有者。我能够成功查询数据集。

In IAM, the xxxx@gmail.com has the following:
roles/bigquery.user
roles/bigquery.admin
roles/bigquery.owner
roles/bigquery.viewer

我查看了以下链接,但建议没有帮助。有关如何解决错误的任何想法?

https://cloud.google.com/bigquery/docs/access-control

Google Big-query api 403-Forbidden Exception

Google API OAuth2, Service Account, "error" : "invalid_grant"

The user does not have bigquery.jobs.create permission in project gdelt-bq

Running queries in BigQuery without being a project User

https://github.com/getredash/redash/issues/1684

The user does not have bigquery.jobs.create permission in project gdelt-bq

Error :service account does not have bigquery.jobs.create permission

虽然错误不在服务账户上,但我也查看了: Error :service account does not have bigquery.jobs.create permission

The service accounts for both the Compute Engine project and the BigQuery 
project have the following: 
roles/bigquery.user 
roles/bigquery.admin 
roles/bigquery.data viewer 
roles/bigquery.data editor

谢谢!

【问题讨论】:

  • 欢迎来到 StackOverflow!您可以使用帖子下方的“编辑”按钮,而不是在 cmets 中进行此更正。
  • @ricky3350 谢谢。我已删除更正并使用该信息更新了原始帖子。我现在也删除了更正

标签: google-bigquery


【解决方案1】:

bigquery.user 和 bigquery.admin 角色都包含 bigquery.jobs.create 权限,因此任何一个都应该足够了。

请确保用户 xxxx@gmail.com 对正在运行作业的项目 (yyyy) 拥有这些权限,这可能与包含数据本身的项目不同。

特别是,您可以访问此处查看项目 yyyy 的 IAM 政策:

https://console.cloud.google.com/iam-admin/iam?project=yyyy

在那里,确保 xxxx@gmail.com 在该项目中具有两个角色之一。

【讨论】:

  • 谢谢。作业正在运行的项目是 Compute Engine。我在 Iam 中向用户 xxxx@gmail.com Compute Admin、Compute Instance Admin (v1)、Compute Network Admin 添加了以下内容;业主之前在场。错误还是一样。
  • 不需要。您可以从错误消息(您写为“yyyy”的内容)中获取作业的项目 ID。替换上面链接中的真实项目 ID 以查看该项目的 IAM 设置,并确保用户 xxxx@gmail.com 具有 BQ 用户或管理员角色。
  • 谢谢。如果不需要它们,我将删除它们。 yyyy 项目是 BigQuery 项目。我们可以称它为 Bigquery2。 xxxx@gmail.com 帐户在 Bigquery2 IAM 设置中分配了以下内容:BigQuery Admin BigQuery Data Editor BigQuery Data Viewer BigQuery User Owner
  • 应该足够了。如果还是不行,请将 BQ 工作 ID 和具体用户/项目(xxxx@gmail.com 和 yyyy)发送到 jcondit@google.com,我会尽量缩小问题范围。
  • 嗨@JeremyCondit,我遇到了同样的问题,服务帐户具有正确的权限(bigquery.admin 和/或bigquery.user),但bigquery.jobs.create permission 似乎不见了。我也可以给你发一封电子邮件吗?
【解决方案2】:

您将下载的密钥,请确保您使用选项卡高级系统设置在 Windows 10 中设置环境变量 GOOGLE_CREDENTIALS_APPLICATION。并在您的程序中使用相同的密钥位置路径。

 spark.sqlContext.setGcpJsonKeyFile(jsonKeyFile)
    // Set up BigQuery project and bucket
    spark.sqlContext.setBigQueryProjectId("inductive-cocoa-250507")
    // Set up BigQuery dataset location, default is US
    spark.sqlContext.setBigQueryDatasetLocation("US")
    spark.sqlContext.setBigQueryGcsBucket("bucket-for-practice")

【讨论】:

  • GOOGLE_APPLICATION_CREDENTIALS
【解决方案3】:

最多有 3 个独立的服务帐号。 一个是默认数据流服务帐户,另一个是控制器服务帐户,然后是触发作业的用户帐户或服务帐户。

在上述情况下,为触发作业的用户帐户或服务帐户以及具有相同权限的控制器服务帐户提供所需的权限非常重要。如果您不使用传递给数据流作业的控制器服务帐户,则会采用默认计算帐户及其权限。

【讨论】:

    【解决方案4】:

    如果您在 A 项目中创建服务帐户,并且将此服务帐户作为 IAM Memeber(ex) role:bigquery.admin 添加到 B 项目中。当您在 B 项目上执行插入查询作业时,您必须在 client.query(project=B) 上添加 'project' 参数,或者当您制作客户端时,您需要添加 'proeject' 参数,例如 client = bigquery.Client.from_service_account_json(SERVICE_ACCOUNT_JSON_PATH , 项目='B')

    EX1)

    client = bigquery.Client.from_service_account_json(SERVICE_ACCOUNT_JSON_PATH)
    
    job_config = bigquery.QueryJobConfig(dry_run=False, use_query_cache=True)
    
    # Start the query, passing in the extra configuration.
    
    query_job = client.query(
        (
            "INSERT INTO `{your_project}.{your_dataset}.{your_table}` (name, gender, count) "
            "values('test', 'F', 190), ('test', 'F', 190), ('test', 'F', 190) "
        ),
        job_config=job_config,
        project='B'
    )
    

    EX2)

    client = bigquery.Client.from_service_account_json(SERVICE_ACCOUNT_JSON_PATH,project='B')
    
    job_config = bigquery.QueryJobConfig(dry_run=False, use_query_cache=True)
    
    # Start the query, passing in the extra configuration.
    
    query_job = client.query(
        (
            "INSERT INTO `{your_project}.{your_dataset}.{your_table}` (name, gender, count) "
            "values('test', 'F', 190), ('test', 'F', 190), ('test', 'F', 190) "
        ),
        job_config=job_config,
    )
    

    【讨论】:

      【解决方案5】:

      您需要roles/bigquery.jobUser 项目级别的角色。

      BigQuery 作业用户角色“提供在项目内运行作业(包括查询)的权限”。

      查看更多here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-07-25
        • 2022-01-11
        • 2022-10-06
        • 1970-01-01
        • 1970-01-01
        • 2021-07-19
        • 2019-06-01
        • 2019-08-17
        相关资源
        最近更新 更多