BigQuery Node.js API权限错误
我正在构建一个Node.js服务器来运行对BigQuery的查询。出于安全原因,我希望此服务器为只读。例如,如果我使用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客户端库(对于
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