【问题标题】:How to Auth to Google Cloud using Service Account in Python?如何在 Python 中使用服务帐户向 Google Cloud 进行身份验证?
【发布时间】:2017-11-03 19:50:21
【问题描述】:

我正在尝试制作一个将谷歌存储 json 文件上传到 BigQuery 的项目(只需自动化现在手动完成的事情)。

我想为此使用“服务帐户”,因为我的脚本将每天运行。

阅读完所有关于使用服务帐户的信息后,我仍在努力进行身份验证。

我想知道是否有人可以检查并指出我错过了什么?

这是我到目前为止所做的:

  1. 为服务帐号创建了 json 密钥文件
  2. 已安装的客户端库:pip install --upgrade google-cloud-bigquery
  3. 根据:https://cloud.google.com/sdk/docs/安装google cloud sdk
  4. 运行 export GOOGLE_APPLICATION_CREDENTIALS=<path_to_service_account_file> 并正确指定密钥路径

现在我正在尝试运行以下 python 脚本:

from google.cloud import bigquery
bigquery_client = bigquery.Client()

我得到这个错误:

google.auth.exceptions.DefaultCredentialsError:无法自动确定凭据。请设置 GOOGLE_APPLICATION_CREDENTIALS 或 显式创建凭据并重新运行应用程序。更多 资料,请看 https://developers.google.com/accounts/docs/application-default-credentials.

我对 python 和谷歌云 API 都很陌生,所以可能错过了一些东西,

想知道是否有人可以指出我在上述步骤中出现的问题/问题,或者指出我为假人提供的关于使用服务帐户使用 Bigquery 设置和运行简单脚本的说明?

【问题讨论】:

    标签: oauth-2.0 google-bigquery google-cloud-platform service-accounts


    【解决方案1】:

    您是否在与使用导出设置环境变量的命令行会话相同的命令行会话中运行脚本?如果没有,您可能需要考虑为您的用户或系统设置它(请参阅this question 了解更多信息)。

    另一个可能使事情变得更容易并自动处理这些事情的选项是使用gcloud cli tool。如果您查看应用程序默认凭据如何工作下的第二个选项here,您可以找到有关如何使用它为您管理凭据的信息(gcloud auth logingcloud auth application-default login

    【讨论】:

      【解决方案2】:

      我通常在 python 脚本本身中设置这个变量,比如:

      import os
      from google.cloud.bigquery.client import Client
      
      os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = 'path_to_json_file'
      bq_client = Client()
      

      【讨论】:

      • 在本地设置凭据并运行脚本有效。但是,当我为脚本创建 docker 映像时,它显示 JSON 文件不存在!如何将服务 JSON 文件添加到 docker 映像
      • @Madhi 我建议在 SO 上问这个问题,解释你正在尝试做什么(我想这与在构建 docker 进程中未正确添加文件有关,但在你的情况下需要更多信息)
      • 感谢回复评论。我想出了解决方案,并且在 docker 映像中一切正常。谢谢!
      • @Madhi 请将您的解决方案发布给其他人查看
      【解决方案3】:

      如果您对服务帐户权限实施了更细粒度的控制,并且您的应用需要使用其中的几个(比如一个用于 Pub/Sub,一个用于存储),那么您必须设置 @987654321 @ 创建每个客户端之前的环境变量。

      相反,您可以单独加载凭据并将其传递给相应的客户端,如下所示:

      import json
      
      from google.cloud import storage
      from google.oauth2 import service_account
      
      project_id = 'my-test-project'
      
      with open('/path/to/my/service_keys/storage_service.json') as source:
          info = json.load(source)
      
      storage_credentials = service_account.Credentials.from_service_account_info(info)
      
      storage_client = storage.Client(project=project_id, credentials=storage_credentials)
      

      只需在您的 IAM 控制台中确保该帐户具有执行您需要它执行的操作的正确权限,但幸运的是,在这种情况下,错误消息确实提供了丰富的信息。

      【讨论】:

        【解决方案4】:

        这是一个老问题,但我想补充一点,您必须创建一个服务帐户,而不是使用旧帐户。最近的 Google Cloud Next 安全演示文稿指出,不保证默认服务帐户将来会存在,并且可以随时删除(或更改其可用权限),因此没有您的应用程序应该依赖它。此外,我发现使用默认服务帐户时存在潜在的身份验证问题,并且创建一个新帐户更有可能允许您成功进行身份验证所需的控制。

        请参阅以下 11 分钟 10 秒后的 YouTube 演示文稿:

        https://youtu.be/ZQHoC0cR6Qw?t=670

        【讨论】:

          猜你喜欢
          • 2018-11-25
          • 2020-07-21
          • 1970-01-01
          • 1970-01-01
          • 2013-09-23
          • 2019-05-01
          • 2020-05-21
          • 2020-09-20
          • 1970-01-01
          相关资源
          最近更新 更多