是否可以使用服务帐户来安排 BigQuery "Schedule Query" 功能中的查询?

Is it possible to use service accounts to schedule queries in BigQuery "Schedule Query" feature ?

我们正在使用 BigQuery 的 Beta 计划查询功能。 详情:https://cloud.google.com/bigquery/docs/scheduling-queries

我们几乎没有 ETL 计划查询 运行 一夜之间优化聚合并降低查询成本。它运作良好,没有太多问题。

当使用自己的凭据安排查询的人员离开组织时,就会出现问题。我知道在这种情况下我们可以做到 "update credential"。

我通读了文档并进行了一些尝试,但无法真正找到我们是否可以使用服务帐户而不是个人帐户来安排查询。

服务帐户更干净,并且与 IAM 框架的其余部分相关联,并且不依赖于单个用户。

因此,如果您有关于预定查询和服务帐户的任何其他信息,请分享。

感谢您抽出时间阅读问题并做出答复。

此致

据我所知,遗憾的是您还不能使用服务帐户直接安排查询。也许 Google 员工会纠正我,但 BigQuery 文档隐含地说明了这一点:

https://cloud.google.com/bigquery/docs/scheduling-queries#quotas

A scheduled query is executed with the creator's credentials and project, as if you were executing the query yourself

如果您需要使用服务帐户(顺便说一句,这是很好的做法),那么列出了一些解决方法 here. I've raised a FR here 供后代使用。

虽然 BigQuery UI 不支持它,但可以使用 python 适用于 DTS 的 GCP SDK 或从 BQ CLI 创建传输(包括计划查询)。

以下是使用PythonSDK的例子:

r"""Example of creating TransferConfig using service account.

Usage Example:
1. Install GCP BQ python client library.
2. If it has not been done, please grant p4 service account with
iam.serviceAccout.GetAccessTokens permission on your project.
  $ gcloud projects add-iam-policy-binding {user_project_id} \
   --member='serviceAccount:service-{user_project_number}@'\
   'gcp-sa-bigquerydatatransfer.iam.gserviceaccount.com' \
   --role='roles/iam.serviceAccountTokenCreator'

   where {user_project_id} and {user_project_number} are the user project's
   project id and project number, respectively. E.g.,
  $ gcloud projects add-iam-policy-binding my-test-proj \
  --member='serviceAccount:service-123456789@'\
  'gcp-sa-bigquerydatatransfer.iam.gserviceaccount.com'\
  --role='roles/iam.serviceAccountTokenCreator'

3. Set environment var PROJECT to your user project, and
GOOGLE_APPLICATION_CREDENTIALS to the service account key path. E.g.,
   $ export PROJECT_ID='my_project_id'
   $ export GOOGLE_APPLICATION_CREDENTIALS=./serviceacct-creds.json'
4. $ python3 ./create_transfer_config.py
"""

import os
from google.cloud import bigquery_datatransfer
from google.oauth2 import service_account
from google.protobuf.struct_pb2 import Struct

PROJECT = os.environ["PROJECT_ID"]
SA_KEY_PATH = os.environ["GOOGLE_APPLICATION_CREDENTIALS"]

credentials = (
    service_account.Credentials.from_service_account_file(SA_KEY_PATH))

client = bigquery_datatransfer.DataTransferServiceClient(
    credentials=credentials)
# Get full path to project
parent_base = client.project_path(PROJECT)

params = Struct()
params["query"] = "SELECT CURRENT_DATE() as date, RAND() as val"
transfer_config = {
    "destination_dataset_id": "my_data_set",
    "display_name": "scheduled_query_test",
    "data_source_id": "scheduled_query",
    "params": params,
}

parent = parent_base + "/locations/us"

response = client.create_transfer_config(parent, transfer_config)
print response

BigQuery 计划查询 now does support creating a scheduled query with a service account and updating 使用服务帐户的计划查询。这些对你有用吗?

这个问题很老了,是在我搜索相同问题时出现在这个线程上的。 是的,可以使用服务帐户来安排大型查询作业。

创建计划查询作业时,单击“高级选项”,您将获得 select 服务帐户的选项。

默认情况下使用请求用户的凭据。 图片来自 bigquery“创建计划查询”1