BigQuery Node.js API 权限错误
BigQuery Node.js API Permission Bug
我正在构建一个 Node.js 服务器以针对 BigQuery 进行 运行 查询。出于安全原因,我希望此服务器是只读的。例如,如果我使用 DROP
、INSERT
、ALTER
等语句编写查询,我的查询应该会被拒绝。但是,应该允许 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.user 或 roles/bigquery.jobUser 访问权限,参见 BigQuery Access Control Roles,如您在此参考中看到的 dataViewer 和 dataEditor 没有 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.create
和 bigquery.tables.getData
权限。 JobUser
角色有前者没有后者。我创建了一个具有这两种权限的自定义角色(并将我的服务帐户分配给该自定义角色),现在可以使用了。我使用 Google Cloud Console UI ( IAM -> Roles -> +Add )
然后 ( IAM -> IAM -> <set service account to custom role> )
做到了这一点
我正在构建一个 Node.js 服务器以针对 BigQuery 进行 运行 查询。出于安全原因,我希望此服务器是只读的。例如,如果我使用 DROP
、INSERT
、ALTER
等语句编写查询,我的查询应该会被拒绝。但是,应该允许 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.user 或 roles/bigquery.jobUser 访问权限,参见 BigQuery Access Control Roles,如您在此参考中看到的 dataViewer 和 dataEditor 没有 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.create
和 bigquery.tables.getData
权限。 JobUser
角色有前者没有后者。我创建了一个具有这两种权限的自定义角色(并将我的服务帐户分配给该自定义角色),现在可以使用了。我使用 Google Cloud Console UI ( IAM -> Roles -> +Add )
然后 ( IAM -> IAM -> <set service account to custom role> )