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 的工具使用相关的具体说明。
添加创建和运行作业的权限(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作业,因为过多的权限不利于安全。
读取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>
我在 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 的工具使用相关的具体说明。
添加创建和运行作业的权限(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作业,因为过多的权限不利于安全。读取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>
- 将