BigQuery Node.js API 权限错误

BigQuery Node.js API Permission Bug

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

为了解决这个问题,我决定使用service account with "jobUser" level access。根据 BQ 文档,这应该允许我 运行 查询,但我不应该 "modify/delete tables"。

所以我 created such a service account 使用 Google Cloud Console UI 并将该文件作为 keyFilename 下面代码中的参数。

// 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。但是,运行此代码会导致以下错误消息(仅供参考:exemplary-city-194015 是我的测试帐户的项目 ID)

{ 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.

st运行ge 是我的服务帐号(test-bq-jobuser@exemplary-city-194015.iam.gserviceaccount.com)has the 'Job User' role and the Job User role does contain the bigquery.jobs.create permission。因此该错误消息没有意义。

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

解法:

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

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

您需要授予它 roles/bigquery.userroles/bigquery.jobUser 访问权限,参见 BigQuery Access Control Roles,如您在此参考中看到的 dataViewerdataEditor 没有 Create jobs/queries,但是 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 是您的服务帐户 email/id

或从 Google Cloud Platform console 搜索或添加您的服务帐户 email/id 并为其提供所需的 ACL

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

做到了这一点