【问题标题】:BigQuery Node.js API Permission BugBigQuery Node.js API 权限错误
【发布时间】:2018-07-19 14:36:59
【问题描述】:

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

为了解决这个问题,我决定使用service account with "jobUser" level access。根据 BQ 文档,这应该允许我运行查询,但我不应该能够“修改/删除表”。

所以我使用 Google Cloud Console UI created such a service account 并将该文件作为以下代码中的 keyFilename 参数传递给 BigQuery 客户端库(适用于 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 运行上述代码。但是,运行此代码会导致以下错误消息(仅供参考:exemplary-city-194015 is my projectID for my test account)

{ 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 和 Job User 角色 does contain the bigquery.jobs.create permission。所以那个错误信息没有意义。

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

解决方案:

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

【问题讨论】:

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


    【解决方案1】:

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

    您需要授予它 roles/bigquery.userroles/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

    【讨论】:

    • 看来我的服务帐户 (test-bq-jobuser@exemplary-city-194015.iam.gserviceaccount.com) 确实具有作业用户角色。 pic1pic2
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2021-10-22
      • 2016-09-29
      • 2022-10-24
      • 2021-07-25
      • 1970-01-01
      • 1970-01-01
      • 2016-05-14
      • 1970-01-01
      • 2015-04-19
      相关资源
      最近更新 更多