Google Cloud 运行 查询 bigquery 的权限

Google Cloud Run permissions to query bigquery

我在 google 云 运行 中有一个小型 python 应用程序 运行ning docker。该应用程序由 http 请求触发,在大查询中执行查询并 return 结果。不幸的是,我收到以下权限错误:

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 角色将 BiqQuery 权限添加到分配给 Cloud 运行 的服务帐户。

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

  • roles/bigquery.用户
  • roles/bigquery.jobUser

云 运行 的服务帐户显示在您的服务的云 运行 部分的 Google 云控制台中。这很可能是 Compute Engine default service account.

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

文档:

其中一个问题可能是您的 Cloud 运行 作业正在使用的服务帐户没有 BigQuery 权限。

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

一个好的规则是只为服务帐户提供必需的权限。

希望对您有所帮助。

The application is triggered by http requests, executes a query in big query and return the result.

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

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

一般来说,权限越严格越细化越安全。

我添加了额外的说明并粘贴了与 Google 的工具使用相关的具体说明。

  1. 添加创建和运行作业的权限(BQ报错提示缺少此权限)执行命令:

    gcloud projects add-iam-policy-binding <project-name> --member=serviceAccount:<sa-name>@<project-name>.iam.gserviceaccount.com --role roles/bigquery.jobUser
    

    命令可以在云 Shell 中执行,使用 BigQuery Web UI 中的 "Activate Cloud Shell" 图标或从其他 Google 控制台页面打开它。替换占位符:

    <sa-name> - 替换为 Cloud 运行、
    使用的服务帐户名称 <project-name> - 替换为项目名称。

    该命令将角色 bigquery.jobUser 添加到服务帐户。不要添加其他permissions/roles来解决无法create/run作业,因为过多的权限不利于安全。

  2. 读取BQ数据需要另一个权限。有两种添加方式:

    • bigquery.dataViewer 角色授予服务帐户:
    gcloud projects add-iam-policy-binding <project-name> --member=serviceAccount:<sa-name>@<project-name>.iam.gserviceaccount.com --role roles/bigquery.dataViewer
    

    然后进行下一步。不推荐,除非您使用的是一次性项目。这种方法的缺点是授予查看所有项目数据集的权限。

    • 采取更精细的方法(推荐),允许服务帐户仅查询一个数据集。这是下面描述的方法。

    执行将 <ds-name> 替换为数据集名称(由您的查询使用)的命令:

    bq show --format=prettyjson <ds-name>  >/tmp/mydataset.json  
    vi /tmp/mydataset.json
    

    使用 vi,将以下项目附加到现有 access 数组并在保存文件之前替换占位符:

    ,
    {  
    "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>