是否可以使用服务帐户在BigQuery“计划查询”功能中计划查询?

时间:2018-11-05 10:15:04

标签: google-bigquery service-accounts

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

我们很少有隔夜运行的ETL计划查询,以优化聚合并降低查询成本。它运作良好,并且没有太多问题。

使用自己的凭据计划查询的人员离开组织时,就会出现问题。我知道在这种情况下我们可以做“更新凭证”。

我通读了文档,也尝试了一下,但是找不到我们是否可以使用服务帐户而不是单个帐户来安排查询。

服务帐户更干净,并且可以与IAM框架的其余部分联系在一起,并且不依赖于单个用户。

因此,如果您有有关计划查询和服务帐户的其他信息,请共享。

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

致谢

4 个答案:

答案 0 :(得分:4)

BigQuery计划查询now确实支持creating有服务帐户的计划查询和updating有服务帐户的计划查询。这些对您有用吗?

答案 1 :(得分:2)

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

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

  

使用创建者的凭据执行计划的查询,并   项目,就好像您自己在执行查询一样

如果您需要使用服务帐户(这是BTW的最佳做法),那么here中列出了一些解决方法。我为后代提出了FR here

答案 2 :(得分:2)

尽管BigQuery UI中不支持该功能,但可以使用python GCP SDK for DTS或从BQ CLI创建传输(包括计划的查询)。

以下是使用Python SDK的示例:

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

答案 3 :(得分:1)

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

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

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