16

如何使用我在 Google API 控制台中创建的服务帐户使用 gsutil 将数据上传到 Google BigQuery?

首先,我尝试使用gsutil将数据上传到 Cloud Storage ,因为这似乎是推荐的模型。在 gmail 用户批准的情况下一切正常,但它不允许我使用服务帐户。

看来我可以使用 Python API 使用已签名的 JWT 凭据获取访问令牌,但我更喜欢使用支持可恢复上传等的命令行工具,例如 gsutil。

编辑:我想在 cron 中使用 gsutil 每晚将文件上传到 Cloud Storage,然后将它们导入 BigQuery。

任何帮助或指示将不胜感激。

4

6 回答 6

21

Google Cloud Storage 刚刚发布了一个新版本 (3.26) 的 gsutil,它支持服务帐户(以及许多其他功能和错误修复)。如果您已经安装了 gsutil,您可以通过运行以下命令获取此版本:

gsutil update

简而言之,您可以通过运行以下命令配置服务帐户:

gsutil config -e

gsutil help config有关使用 config 命令的更多详细信息,请参阅。
有关gsutil help creds支持的不同类型凭据(和不同用例)的信息,请参阅gsutil

Mike Schwartz,谷歌云存储团队

于 2013-03-26T20:38:41.370 回答
20

要扩展@Mike 答案,您需要

  1. 下载服务帐户密钥文件,并将其放入 eg/etc/backup-account.json
  2. gcloud auth activate-service-account --key-file /etc/backup-account.json

现在所有呼叫都使用所述服务帐户。

于 2019-05-02T15:30:43.493 回答
3

首先,您应该使用bq命令行工具从命令行与 BigQuery 进行交互。(在此处阅读并在此处下载)。

我同意 Marc 的观点,将您的个人凭据与gsutil和一起使用是个好主意bqbq命令行工具支持使用服务帐户。使用服务帐户身份验证的命令可能如下所示。

bq --service_account 1234567890@developer.gserviceaccount.com --service_account_credential_store keep_me_safe --service_account_private_key_file myfile.key query 'select count(*) from publicdata:samples.shakespeare' 

键入bq --help以获取更多信息。

通过 Python 或 Java 在代码中使用服务帐户也很容易。这是一个使用BigQuery 授权指南中的一些代码的快速示例。

import httplib2

from apiclient.discovery import build
from oauth2client.client import SignedJwtAssertionCredentials

# REPLACE WITH YOUR Project ID
PROJECT_NUMBER = 'XXXXXXXXXXX'
# REPLACE WITH THE SERVICE ACCOUNT EMAIL FROM GOOGLE DEV CONSOLE
SERVICE_ACCOUNT_EMAIL = 'XXXXX@developer.gserviceaccount.com'

f = file('key.p12', 'rb')
key = f.read()
f.close()

credentials = SignedJwtAssertionCredentials(
    SERVICE_ACCOUNT_EMAIL,
    key,
    scope='https://www.googleapis.com/auth/bigquery')

http = httplib2.Http()
http = credentials.authorize(http)

service = build('bigquery', 'v2')
datasets = service.datasets()
response = datasets.list(projectId=PROJECT_NUMBER).execute(http)

print('Dataset list:\n')
for dataset in response['datasets']:
  print("%s\n" % dataset['id'])
于 2012-09-15T04:25:29.857 回答
3

服务帐户通常用于识别应用程序,但在使用 gsutil 时,您是交互式用户,使用您的个人帐户更自然。您始终可以将您的 Google Cloud Storage 资源与您的个人帐户和/或服务帐户相关联(通过访问控制列表或开发人员控制台的“团队”选项卡),因此我的建议是使用您的个人帐户和 gsutil,然后使用服务帐户为您的应用程序。

于 2012-09-15T02:58:45.403 回答
2

根据乔纳森的要求,作为答案而不是评论发布

是的,如果用户不再存在,则由单个用户做出的 OAuth 授权将不再有效。因此,如果您将基于用户的流程与您的个人帐户一起使用,那么如果您离开公司,您的自动化流程将会失败。

我们应该使用 gsutil 支持服务帐户,但现在还不支持。

您可以执行以下操作之一:

  1. 可能使用服务帐户的现有 python oauth 客户端实现快速将该功能添加到 gsutil/oauth2_plugin/oauth2_helper.py
  2. 通过服务帐户流从外部检索访问令牌并将其存储在 ~/.boto 中指定的缓存位置(有点hacky)
  3. 自己创建一个角色帐户(通过 gmail.com 或 google 应用程序)并向该帐户授予权限并将其用于 OAuth 流程。

我们已提交功能请求以支持 gsutil 的服务帐户,并从团队获得了一些初步的积极反馈。(虽然不能给出预计到达时间)

于 2012-09-17T02:04:20.990 回答
0

到今天为止,您无需运行任何命令来设置要与gsutil. 您所要做的就是~/.boto使用以下内容进行创建:

[Credentials]
gs_service_key_file=/path/to/your/service-account.json
于 2021-12-16T11:28:59.807 回答