BigQuery Node.js API权限错误

BigQuery Node.js API权限错误,node.js,google-cloud-platform,google-bigquery,google-api-nodejs-client,Node.js,Google Cloud Platform,Google Bigquery,Google Api Nodejs Client,我正在构建一个Node.js服务器来运行对BigQuery的查询。出于安全原因,我希望此服务器为只读。例如,如果我使用DROP、INSERT、ALTER等语句编写查询,我的查询应该被拒绝。但是,应该允许类似于SELECT*FROM DATASET.TABLE LIMIT 10的内容 为了解决这个问题,我决定使用。根据BQ文档,这应该允许我运行查询,但我不能“修改/删除表” 因此,我使用Google云控制台UI,将该文件作为下面代码中的keyFilename参数传递给BigQuery客户端库(对于

我正在构建一个Node.js服务器来运行对BigQuery的查询。出于安全原因,我希望此服务器为只读。例如,如果我使用
DROP
INSERT
ALTER
等语句编写查询,我的查询应该被拒绝。但是,应该允许类似于
SELECT*FROM DATASET.TABLE LIMIT 10
的内容

为了解决这个问题,我决定使用。根据BQ文档,这应该允许我运行查询,但我不能“修改/删除表”

因此,我使用Google云控制台UI,将该文件作为下面代码中的
keyFilename
参数传递给BigQuery客户端库(对于Node.js)

//获取.env文件的服务帐户密钥
require('dotenv').config()
const BigQuery=require('@googlecloud/BigQuery');
//这里有疑问
常量查询=`
选择*
来自“dataset.table0”
限制10
`
//创建一个客户端
const bigquery=新的bigquery({
项目D:process.env.BQ_项目,
keyFilename:process.env.BQ\u服务\u帐户
});
//使用标准sql
常量查询\u选项={
查询:查询,
useLegacySql:false,
useQueryCache:false
}
//运行查询并记录结果
大查询
.query(查询选项)
.然后(console.log)
.catch(console.log)
然后,我运行了上面的代码。但是,运行此代码会导致以下错误消息(仅供参考:
examplification-city-194015
是我测试帐户的项目ID)

奇怪的是,我的服务帐户(
testbq-jobuser@exemplary-city-194015.iam.gserviceaccount.com
)和作业用户角色。所以这个错误消息没有意义

事实上,我测试了所有可能的访问控制级别(dataViewer、dataEditor、…、admin),除了“admin”角色之外,我得到了每个角色的错误消息。因此,要么我的服务帐户配置不正确,要么@googlecloud/bigquery有一些bug。我不想使用具有“管理员”级别访问权限的服务帐户,因为这允许我运行
DROP TABLE
-esque查询

解决方案:


我创建了一个服务帐户,并为其分配了
bigquery.jobs.create
bigquery.tables.getData
权限。这似乎奏效了。我可以运行基本的
SELECT
查询,但是
DROP TABLE
和其他写入操作失败,这正是我想要的。

如错误消息所示,您的服务帐户没有创建BigQuery作业的权限

您需要授予it roles/bigquery.user或roles/bigquery.jobUser访问权限,请参阅,正如您在本参考资料中所看到的,dataViewer和dataEditor没有创建作业/查询的功能,但管理员有,但您不需要

要执行所需的角色,您可以按照中的说明进行操作

从命令行使用,运行

其中,
BQ\u PROJECT
是您的项目id,
SERVICE\u account\u EMAIL
是您的服务帐户EMAIL/id


或者通过搜索或添加您的服务帐户电子邮件/id,并为其提供所需的ACL,我解决了自己的问题。要进行查询,您需要
bigquery.jobs.create
bigquery.tables.getData
权限。
JobUser
角色具有前者,但不具有后者。我创建了一个自定义角色(并将我的服务帐户分配给该自定义角色),该角色同时具有权限,现在可以工作了。我使用谷歌云控制台用户界面
(IAM->角色->+添加)
然后
(IAM->IAM->)

出现我的服务帐户(测试bq-jobuser@exemplary-city-194015.iam.gserviceaccount.com)确实具有作业用户角色。
{ ApiError: Access Denied: Project exemplary-city-194015: The user test-bq-jobuser@exemplary-city-194015.iam.gserviceaccount.com does not have bigquery.jobs.create permission in project exemplary-city-194015.
gcloud projects add-iam-policy-binding $BQ_PROJECT \
    --member serviceAccount:$SERVICE_ACOUNT_EMAIL \
    --role roles/bigquery.user