BigQuery Node.js API权限错误

时间:2018-02-08 21:54:28

标签: node.js google-cloud-platform google-bigquery google-api-nodejs-client

我正在构建一个Node.js服务器来运行针对BigQuery的查询。出于安全原因,我希望此服务器是只读的。例如,如果我使用DROPINSERTALTER等语句编写查询,我的查询应该被拒绝。但是,应允许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.comhas 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和其他写操作失败,这就是我想要的。

2 个答案:

答案 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.createbigquery.tables.getData权限。 JobUser角色具有前者而后者不具有前者。我创建了一个自定义角色(并将我的服务帐户分配给该自定义角色),该角色具有两种权限,现在可以正常工作。我使用Google云端控制台用户界面( IAM -> Roles -> +Add )然后( IAM -> IAM -> <set service account to custom role> )

完成了此操作