【发布时间】:2018-07-19 14:36:59
【问题描述】:
我正在构建一个 Node.js 服务器来针对 BigQuery 运行查询。出于安全原因,我希望此服务器是只读的。例如,如果我使用DROP、INSERT、ALTER 等语句编写查询,我的查询应该被拒绝。但是,应该允许使用 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 role 和bigquery.jobs.create 和 bigquery.tables.getData 权限。这似乎奏效了。我可以运行基本的 SELECT 查询,但 DROP TABLE 和其他写入操作失败,这正是我想要的。
【问题讨论】:
标签: node.js google-cloud-platform google-bigquery google-api-nodejs-client