如何将服务帐户与 gsutil 一起使用,以上传到 CS + BigQuery



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

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

似乎我可以使用 Python API 使用签名的 JWT 凭据获取访问令牌,但我更喜欢使用像 gsutil 这样的命令行工具,支持可恢复上传等。

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

任何帮助或路线将不胜感激。

要扩展@Mike答案,您需要

  1. 下载服务帐户密钥文件,并将其放入例如/etc/backup-account.json
  2. 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 的观点,即在gsutilbq中使用您的个人凭据是个好主意,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 支持服务帐户,但目前还没有。

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

  1. 可能会快速将该功能添加到 gsutil/oauth2_plugin/oauth2_helper.py 使用现有的 Python 服务帐户的 OAuth 客户端实现
  2. 通过服务帐户流在外部检索访问令牌,并将其存储在 ~/.boto 中指定的缓存位置(有点黑客)
  3. 自己创建一个角色帐号(通过 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不支持。

相关内容

  • 没有找到相关文章

最新更新