如何使用我在 Google API 控制台中创建的服务帐号将数据上传到 gsutil 的 Google BigQuery?
首先,我尝试使用 gsutil 将数据上传到云存储,因为这似乎是推荐的模型。在Gmail用户批准下一切正常,但它不允许我使用服务帐户。
似乎我可以使用 Python API 使用签名的 JWT 凭据获取访问令牌,但我更喜欢使用像 gsutil 这样的命令行工具,支持可恢复上传等。
编辑:我想在 cron 中使用 gsutil 每晚将文件上传到云存储,然后将它们导入 BigQuery。
任何帮助或路线将不胜感激。
要扩展@Mike答案,您需要
- 下载服务帐户密钥文件,并将其放入例如
/etc/backup-account.json
gcloud auth activate-service-account --key-file /etc/backup-account.json
现在所有呼叫都使用上述服务帐户。
Google Cloud Storage刚刚发布了支持服务帐户(以及许多其他功能和错误修复)的新版本(3.26)。如果您已经安装了 gsutil,您可以通过运行以下命令来获取此版本:
gsutil update
简而言之,您可以通过运行以下命令来配置服务帐户:
gsutil config -e
有关使用 config 命令的更多详细信息,请参阅gsutil help config
。
有关gsutil
支持的不同凭证类型(和不同用例)的信息,请参阅gsutil help creds
。
Mike Schwartz,Google Cloud Storage Team
服务帐户通常用于识别应用程序,但在使用 gsutil 时,您是交互式用户,使用个人帐户更自然。您可以随时将您的 Google Cloud Storage 资源与您的个人帐户和/或服务帐户相关联(通过访问控制列表或开发人员控制台"团队"选项卡),因此我的建议是将您的个人帐户与 gsutil 一起使用,然后为您的应用程序使用服务帐户。
首先,您应该使用bq
命令行工具从命令行与 BigQuery 进行交互。(在此处阅读并在此处下载)。
我同意 Marc 的观点,即在gsutil
和bq
中使用您的个人凭据是个好主意,bq
命令行工具支持使用服务帐户。使用服务帐户身份验证的命令可能如下所示。
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("%sn" % dataset['id'])
根据乔纳森的请求发布作为答案,而不是评论
是的,如果单个用户不再存在,则由该用户进行的 OAuth 授权将不再有效。 因此,如果您在个人帐户中使用基于用户的流程,则在您离开公司时,您的自动化流程将失败。
我们应该使用 gsutil 支持服务帐户,但目前还没有。
您可以执行以下操作之一:
- 可能会快速将该功能添加到 gsutil/oauth2_plugin/oauth2_helper.py 使用现有的 Python 服务帐户的 OAuth 客户端实现
- 通过服务帐户流在外部检索访问令牌,并将其存储在 ~/.boto 中指定的缓存位置(有点黑客)
- 自己创建一个角色帐号(通过 gmail.com 或 Google 应用套件),并向该帐号授予权限,并将其用于 OAuth 流程。
我们已经提交了支持gsutil服务帐户的功能请求,并得到了团队的一些初步积极反馈。 (虽然不能给出预计到达时间)
截至今天,您无需运行任何命令即可设置要与gsutil
一起使用的服务帐户。您所要做的就是创建包含以下内容的~/.boto
:
[Credentials]
gs_service_key_file=/path/to/your/service-account.json
编辑:您还可以通过设置BOTO_CONFIG
(文档)来告诉gsutil
它应该在哪里查找.boto
文件。
例如,我使用具有以下配置的每个项目使用一个服务帐户,其中/app
是我的应用程序目录的路径:
.env
:BOTO_CONFIG=/app/.boto
.boto
:[Credentials] gs_service_key_file=/app/service-account.json
script.sh
:export $(xargs < .env) gsutil ...
在上面的脚本中,export $(xargs < .env)
用于加载.env
文件(源)。它告诉gsutil
.boto
文件的位置,进而告诉它服务帐户的位置。使用Google Cloud Python库时,您可以使用GOOGLE_APPLICATION_CREDENTIALS
完成所有这些操作,但gsutil
不支持。