关于Google Cloud Platform:BigQuery Node.js API权限错误

BigQuery Node.js API Permission Bug

我正在构建一个Node.js服务器以对BigQuery运行查询。出于安全原因,我希望该服务器为只读。例如,如果我用DROPINSERTALTER等编写查询,则我的查询应被拒绝。但是,应允许使用SELECT * FROM DATASET.TABLE LIMIT 10之类的东西。

为解决此问题,我决定使用具有" jobUser "级访问权限的服务帐户。根据BQ文档,这应该允许我运行查询,但是我不能"修改/删除表"。

因此,我使用Google Cloud Console UI创建了这样的服务帐户,并将该文件作为下面代码中的keyFilename参数传递给BigQuery客户端库(用于Node.js)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// 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 )

然后我在BigQuery中针对我的测试数据集/表运行以上代码。但是,运行此代码会导致以下错误消息(仅供参考:exemplary-city-194015是我的测试帐户的projectID)

1
{ ApiError: Access Denied: Project exemplary-city-194015: The user [email protected] does not have bigquery.jobs.create permission in project exemplary-city-194015.

奇怪的是我的服务帐户([email protected])具有\\'Job User \\'角色,而Job User角色确实包含bigquery.jobs.create permission。因此,该错误消息没有任何意义。

实际上,我测试了所有可能的访问控制级别(dataViewer,dataEditor,...,admin),并且除" admin "角色以外的每个角色均收到错误消息。因此,我的服务帐户配置不正确,或者@ google-cloud / bigquery出现了一些错误。我不想使用具有\\'admin \\'级访问权限的服务帐户,因为这允许我运行DROP TABLE式查询。

解决方案:

我创建了一个服务帐户,并为其分配了具有bigquery.jobs.createbigquery.tables.getData权限的自定义角色。那似乎行得通。我可以运行基本的SELECT查询,但是DROP TABLE和其他写操作失败,这就是我想要的。


我解决了自己的问题。要进行查询,您需要同时具有bigquery.jobs.createbigquery.tables.getData权限。 JobUser角色具有前者,但没有后者。我创建了一个具有两个权限的自定义角色(并将我的服务帐户分配给了该自定义角色),并且现在可以使用了。我使用Google Cloud Console用户界面( IAM -> Roles -> +Add )然后是( IAM -> IAM -> <set service account to custom role> )


如错误消息所示,您的服务帐户无权创建BigQuery Job

您需要向其授予role / bigquery.user或Roles / bigquery.jobUser访问权限,请参阅BigQuery访问控制角色,如本参考资料中所见,dataViewer和dataEditor没有创建作业/查询,但admin拥有,但是你不需要那个

要执行所需的角色,您可以按照为资源授予对服务帐户的访问权限中的指示

使用gcloud在命令行中运行

1
2
3
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控制台中搜索或添加您的服务帐户电子邮件/ ID,并为其提供所需的ACL