我正在构建一个Node.js服务器来运行针对BigQuery的查询。出于安全原因,我希望此服务器是只读的。例如,如果我使用DROP
,INSERT
,ALTER
等语句编写查询,我的查询应该被拒绝。但是,应允许SELECT * FROM DATASET.TABLE LIMIT 10
之类的内容。
为了解决这个问题,我决定使用service account with "jobUser" level access。根据BQ文档,这应该允许我运行查询,但我不能“修改/删除表”。
所以我created such a service account使用Google Cloud Console UI并将该文件作为下面代码中的keyFilename
参数传递给BigQuery Client Library(对于Node.js)。
// Get service account key for .env file
require( 'dotenv' ).config()
const BigQuery = require( '@google-cloud/bigquery' );
// Query goes here
const query = `
SELECT *
FROM \`dataset.table0\`
LIMIT 10
`
// Creates a client
const bigquery = new BigQuery({
projectId: process.env.BQ_PROJECT,
keyFilename: process.env.BQ_SERVICE_ACCOUNT
});
// Use standard sql
const query_options = {
query : query,
useLegacySql : false,
useQueryCache : false
}
// Run query and log results
bigquery
.query( query_options )
.then( console.log )
.catch( console.log )
然后我针对my test dataset/table in BigQuery运行了上述代码。但是,运行此代码会导致以下错误消息(fyi:exemplary-city-194015
是我的测试帐户的projectID)
{ 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.
奇怪的是我的服务帐户(test-bq-jobuser@exemplary-city-194015.iam.gserviceaccount.com
)has the 'Job User' role和工作用户角色does contain the bigquery.jobs.create permission
。所以错误信息没有意义。
事实上,我测试了所有可能的访问控制级别(dataViewer,dataEditor,...,admin),我收到除“admin”角色之外的每个角色的错误消息。因此,我的服务帐户配置不正确,或者@ google-cloud / bigquery有一些错误。我不想使用具有“管理员”级别访问权限的服务帐户,因为这样我就可以运行DROP TABLE
- esque查询。
解决方案:
我创建了一个服务帐户,并使用bigquery.jobs.create
和 bigquery.tables.getData
权限为其分配了a custom role。这似乎有效。我可以运行基本SELECT
查询,但DROP TABLE
和其他写操作失败,这就是我想要的。
答案 0 :(得分:1)
如错误消息所示,您的服务帐户无权创建 BigQuery作业
您需要授予它 roles / bigquery.user 或 roles / bigquery.jobUser 访问权限,请参阅BigQuery Access Control Roles,如此参考中所示 dataViewer 和 dataEditor 没有创建职位/查询,但是 admin 可以,但是你没有'需要那个
要执行所需的角色,您可以按照Granting Access to a Service Account for a Resource
中的说明操作使用gcloud从命令行运行
gcloud projects add-iam-policy-binding $BQ_PROJECT \
--member serviceAccount:$SERVICE_ACOUNT_EMAIL \
--role roles/bigquery.user
BQ_PROJECT
是您的项目ID,SERVICE_ACOUNT_EMAIL
是您的服务帐户电子邮件/ ID
或者从Google Cloud Platform console搜索或添加您的服务帐户电子邮件/ ID并为其提供所需的ACL
答案 1 :(得分:1)
我解决了自己的问题。要进行查询,您需要bigquery.jobs.create
和bigquery.tables.getData
权限。 JobUser
角色具有前者而后者不具有前者。我创建了一个自定义角色(并将我的服务帐户分配给该自定义角色),该角色具有两种权限,现在可以正常工作。我使用Google云端控制台用户界面( IAM -> Roles -> +Add )
然后( IAM -> IAM -> <set service account to custom role> )