如何使用 Python + 服务帐户创建 BigQuery 数据传输?

Posted

技术标签:

【中文标题】如何使用 Python + 服务帐户创建 BigQuery 数据传输?【英文标题】:How to create BigQuery Data Transfer w/ Python + Service Account? 【发布时间】:2020-05-27 00:23:09 【问题描述】:

我正在尝试使用 Python 和 google-cloud-bigquery-datatransfer 在 BigQuery 中创建一个数据传输作业,但我遇到了错误:

google.api_core.exceptions.PermissionDenied: 403 用户没有足够的权限:项目 PROJECT_ID 需要 bigquery.transfers.update

我在下面包含了我的代码,这并不是很有趣。我在设置GOOGLE_APPLICATION_CREDENTIALS=/path/to/secrets/service-account.json 时运行它。此服务帐户具有 Owner 状态,因为我认为提高其权限可能会让我摆脱权限错误。

现在我开始认为这个 API 根本不能用于服务帐户,还是我疯了?我在文档中看到了authorization_codeCheckValidAuth,但它说它们是可选的。

Google BigQuery Data Transfer API 是否适用于服务帐号?


import os
import boto3
from google.cloud import bigquery_datatransfer_v1
import google.protobuf.json_format

client = bigquery_datatransfer_v1.DataTransferServiceClient()

parent = client.project_path('PROJECT_ID')

transfer_config = 
    "destination_dataset_id": "neilo",
    "display_name": "NeilO Data Transfer Test",
    "data_source_id": "amazon_s3",
    "params": 
        "destination_table_name_template": "test_table",
        "data_path": "s3://bucket/path/to/files/*.csv.gz",
        "access_key_id": os.environ['AWS_ACCESS_KEY_ID'],
        "secret_access_key": os.environ['AWS_SECRET_ACCESS_KEY'],
        "file_format": "CSV"
    ,
    "schedule": "daily"


transfer_config = google.protobuf.json_format.ParseDict(
    transfer_config, bigquery_datatransfer_v1.types.TransferConfig())

response = client.create_transfer_config(parent, transfer_config)

问题是

【问题讨论】:

您能否确保此服务帐户已授予bigquery.transfers.updatebigquery.transfers.get 权限? 是的,我什至应用了 Owner 角色,该角色包括对 BigQuery 中所有内容的完全权限。 【参考方案1】:

问题是我在设置GOOGLE_APPLICATION_CREDENTIALS 时输入错误,因此我无意中使用了错误 服务帐户。我添加了以下代码来验证正确的项目:

from google.cloud import bigquery
assert bigquery.Client().project == 'PROJECT_ID'

我还使用 Editor 的最小 built-in role 确保服务帐户具有 bigquery.transfers.update 权限:

【讨论】:

以上是关于如何使用 Python + 服务帐户创建 BigQuery 数据传输?的主要内容,如果未能解决你的问题,请参考以下文章

使用 terraform 如何创建一个跨多个项目使用的服务帐户?

如何使用服务帐户 JSON 创建 GoogleCredential

如何使用 REST API 从服务帐户凭据创建访问令牌?

如何通过 terraform 使用服务帐户创建谷歌云 pubsub 订阅?

将python库用于GCP时如何切换项目目标?

如何在 Powershell 中为“网络服务”帐户创建 Windows 服务?