Google cloud platform Google云运行权限查询bigquery

Google cloud platform Google云运行权限查询bigquery,google-cloud-platform,google-bigquery,google-cloud-run,google-iam,google-cloud-iam,Google Cloud Platform,Google Bigquery,Google Cloud Run,Google Iam,Google Cloud Iam,我有一个运行在谷歌云上的小python应用程序,用docker运行。应用程序由http请求触发,在大查询中执行查询并返回结果。很遗憾,我遇到以下权限错误: Reason: 403 POST https://bigquery.googleapis.com/bigquery/v2/projects/XXXX/jobs: Access Denied: Project XXXX: User does not have bigquery.jobs.create permission in project

我有一个运行在谷歌云上的小python应用程序,用docker运行。应用程序由http请求触发,在大查询中执行查询并返回结果。很遗憾,我遇到以下权限错误:

Reason: 403 POST https://bigquery.googleapis.com/bigquery/v2/projects/XXXX/jobs: Access Denied: Project XXXX: User does not have bigquery.jobs.create permission in project XXXX.\n\n(job ID: XXXX-XX-XX-XX-XXXX)\n\n

我知道我需要提供从云运行到大查询的访问权限。我该怎么做?给哪个用户?我怎么知道

您需要通过IAM角色向分配给Cloud Run的服务帐户添加BiqQuery权限

要允许Cloud Run创建大查询作业(bigquery.jobs.create),您需要以下角色之一:

  • 角色/bigquery.user
  • 角色/bigquery.jobUser
云运行的服务帐户显示在服务的“云运行”部分的Google云控制台中。这很可能是
计算引擎默认服务帐户

要添加BiqQuery角色,可以使用Google云控制台。转到IAM,找到服务帐户。向服务帐户添加角色

文件:


问题之一可能是您的云运行作业使用的服务帐户没有对BigQuery的权限

您可以更新服务帐户权限并添加
角色/bigquery.user
角色以创建作业。 此外,根据您的应用程序需求添加相关角色。您可以查看有关不同BigQuery角色的详细信息

一个好的规则是只向服务帐户提供所需的权限

我希望这有帮助

应用程序由http请求触发,在大查询中执行查询并返回结果

从安全的角度来看,所需的权限与自定义网站从此处使用的权限相同。我是作者。该网站也由http请求触发,在BQ中执行查询并返回结果。仅授予创建作业的权限(通过
bigquery.jobUser
role)是不够的

您可以通过不同的方式(例如,更广泛的权限和更受限制的权限)向服务帐户授予所需的权限,详细信息见步骤6

一般来说,权限越受限制,粒度越细,安全性越好

我正在添加额外的说明,并粘贴与谷歌工具使用相关的具体说明

  • 要添加创建和运行作业的权限(BQ错误消息表示缺少此权限),请执行以下命令:

    gcloud projects add-iam-policy-binding <project-name> --member=serviceAccount:<sa-name>@<project-name>.iam.gserviceaccount.com --role roles/bigquery.jobUser
    
    然后继续下一步。除非您使用的是一次性项目,否则不推荐使用。这种方法的缺点是授予查看所有项目数据集的权限

    • 通过允许服务帐户只查询一个数据集,采用更细粒度的方法(推荐)。这是下面描述的方法
    执行命令,用数据集名称替换
    (由查询使用):

    执行命令以对数据集进行更改:

    bq update --source /tmp/mydataset.json <ds-name>
    
    bq更新——source/tmp/mydataset.json
    

  • 你的答案实际上是正确的,应该能解决问题。然而,我发现我的问题是,我在一个项目上部署应用程序,在另一个项目上访问bigquery。我接受了你的回答,因为它回答了我的问题,解决了我解释过的问题。但是,您知道如何允许我刚才提到的场景吗?这可能是一种不好的做法吗?服务帐户或用户帐户可以在多个项目中拥有权限。只需将标识添加到每个项目并分配角色。
    bq show --format=prettyjson <ds-name>  >/tmp/mydataset.json  
    vi /tmp/mydataset.json
    
    ,
    {  
    "role": "READER",  
    "userByEmail": "[<sa-name>@<project-name>.iam.gserviceaccount.com](mailto:<sa-name>@<project-name>.iam.gserviceaccount.com)"  
    }
    
    bq update --source /tmp/mydataset.json <ds-name>