use*_*823 14 oauth-2.0 google-bigquery service-accounts google-cloud-platform
我试图制作一个项目,将谷歌存储json文件上传到BigQuery(只是自动完成现在手动完成的事情).
我希望使用"服务帐户",因为我的脚本将每天运行.
阅读完所有关于使用服务帐户的内容后,我仍然在努力进行身份验证.
我想知道是否有人可以检查并指出我错过了什么?
这是我到目前为止所做的:
pip install --upgrade
google-cloud-bigqueryexport GOOGLE_APPLICATION_CREDENTIALS=<path_to_service_account_file>与正确指定键路径现在我试图运行以下python脚本:
from google.cloud import bigquery
bigquery_client = bigquery.Client()
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
google.auth.exceptions.DefaultCredentialsError:无法自动确定凭据.请设置GOOGLE_APPLICATION_CREDENTIALS或明确创建凭据并重新运行该应用程序.有关详细信息,请参阅 https://developers.google.com/accounts/docs/application-default-credentials.
我对python和google云API都很陌生,所以可能错过了一些东西,
不知道是否有人可以指出我上面的步骤中哪里出现了什么/出了什么问题,或者让我明确指出dummys使用服务帐户设置和运行Bigquery的简单脚本?
Wil*_*uks 23
我通常在python脚本本身设置这个变量,如:
import os
from google.cloud.bigquery.client import Client
os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = 'path_to_json_file'
bq_client = Client()
Run Code Online (Sandbox Code Playgroud)
tar*_*kki 10
如果您对服务帐户权限实施了更细粒度的控制,并且您有一个应用程序需要使用其中几个(例如,一个用于发布/订阅,一个用于存储),那么您必须GOOGLE_APPLICATION_CREDENTIALS在创建每个应用程序之前设置环境变量客户。
相反,您可以单独加载凭据,然后将其传递给相应的客户端,如下所示:
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)
Run Code Online (Sandbox Code Playgroud)
只需在IAM控制台中确保该帐户具有执行所需操作所需的正确权限,但是幸运的是,在这种情况下,错误消息确实很有用。
我只是将凭据设置为 python 代码中的变量,但直接在 python 代码中显示凭据并不是一个好主意:)
#!pip install google-api-python-client
#!pip install google-cloud-dns
from google.oauth2 import service_account
from googleapiclient import discovery
from google.cloud import dns
#Downloaded credentials in JSON format
gcp_sa_credentials={
"type": "service_account",
"project_id": "mygcpprojectid-1122",
"private_key_id": "myprivkeyid",
"private_key": "-----BEGIN PRIVATE KEY-----\nmyprivatekey\n-----END PRIVATE KEY-----\n",
"client_email": "client-mail@mygcpprojectid-1122.iam.gserviceaccount.com",
"client_id": "myclientid",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/client-mail%40mygcpprojectid-1122.iam.gserviceaccount.com"
}
project_id=gcp_sa_credentials["project_id"]
credentials = service_account.Credentials.from_service_account_info(gcp_sa_credentials)
client = dns.Client(project=project_id,credentials=credentials)
Run Code Online (Sandbox Code Playgroud)
您是否在与使用export设置环境变量的命令行会话相同的命令行会话中运行脚本?如果没有,您可能要考虑为您的用户或系统设置它(有关更多信息,请参阅此问题)。
另一个可能使事情变得更加简单并自动处理这些事情的选项是使用gcloud cli工具。如果您在“ 应用程序默认凭据”的工作方式下查看此处的第二个选项,则可以找到有关如何使用它来为您管理凭据的信息(和)。gcloud auth logingcloud auth application-default login
这是一个老问题,但我想补充一点,您必须创建一个新的服务帐户,而不是使用旧的服务帐户。最近的 Google Cloud Next 安全演示指出,不能保证默认服务帐户将来会存在,并且可以随时删除它(或其可用权限发生更改),因此您的任何应用程序都不应该依赖它。我还发现,使用默认服务帐户时存在潜在的身份验证问题,而创建一个新帐户更有可能允许您成功进行身份验证所需的控制。
请参阅以下 YouTube 演示文稿(11 分 10 秒):
https://youtu.be/ZQHoC0cR6Qw?t=670
| 归档时间: |
|
| 查看次数: |
14586 次 |
| 最近记录: |