谷歌云获取存储桶 - 适用于 cli 但不适用于 python
Posted
技术标签:
【中文标题】谷歌云获取存储桶 - 适用于 cli 但不适用于 python【英文标题】:Google cloud get bucket - works with cli but not in python 【发布时间】:2020-09-23 20:31:18 【问题描述】:我被要求与外部谷歌存储桶进行集成,我收到了一个凭据 json,
在尝试做的时候
gsutil ls gs://bucket_name
(在使用 creds json 配置自己之后)我收到了有效的响应,以及当我尝试将文件上传到存储桶时。
尝试使用 Python3 时,它不起作用:
在使用google-cloud-storage==1.16.0
(也尝试了较新的版本)时,我正在做:
project_id = credentials_dict.get("project_id")
credentials = service_account.Credentials.from_service_account_info(credentials_dict)
client = storage.Client(credentials=credentials, project=project_id)
bucket = client.get_bucket(bucket_name)
但是在get_bucket
行,我得到:
google.api_core.exceptions.Forbidden: 403 GET https://www.googleapis.com/storage/v1/b/BUCKET_NAME?projection=noAcl: USERNAME@PROJECT_ID.iam.gserviceaccount.com does not have storage.buckets.get access to the Google Cloud Storage bucket.
我正在与之集成的外部合作伙伴说用户设置正确,并证明他们表明我可以使用gsutil
执行操作。
你能帮忙吗?知道可能是什么问题吗?
【问题讨论】:
credentials_dict
是什么?对于from_service_account_info()
调用,它必须是格式化的服务帐户密钥文件的内容。例如。来自文档:service_account_info = json.load(open('service_account.json')) credentials = service_account.Credentials.from_service_account_info( service_account_info)
抱歉格式化,如果是这种情况,我会把它作为答案,只是想澄清一下,没有什么是 credentials_dict 首先...
另外,您为服务帐户设置了哪些权限? gsutil 默认使用gcloud init
设置的用户凭据,因此您的用户可能拥有比您的服务帐户更多的权限。
你应该配置你的谷歌可以 python sdk 并使用正确的凭据初始化它。
【参考方案1】:
请关注these steps 以正确设置 Python 的云存储客户端库。一般情况下,云存储库可以使用Application default credentials or environment variables for authentication。
请注意,推荐使用的方法是设置 authentication using environment variables(即,如果您使用的是 Linux:export GOOGLE_APPLICATION_CREDENTIALS="/path/to/[service-account-credentials].json"
应该可以)并完全避免使用 service_account.Credentials.from_service_account_info()
方法:
from google.cloud import storage
storage_client = storage.Client(project='project-id-where-the-bucket-is')
bucket_name = "your-bucket"
bucket = client.get_bucket(bucket_name)
应该只是工作,因为身份验证是由客户端库通过环境变量处理的。
现在,如果您有兴趣显式使用服务帐户而不是使用service_account.Credentials.from_service_account_info()
方法,您可以通过以下方式直接使用from_service_account_json()
方法:
from google.cloud import storage
# Explicitly use service account credentials by specifying the private key
# file.
storage_client = storage.Client.from_service_account_json(
'/[service-account-credentials].json')
bucket_name = "your-bucket"
bucket = client.get_bucket(bucket_name)
查找有关如何向您的应用程序here 提供凭据的所有相关详细信息。
【讨论】:
from_service_account_info
有什么问题?我想发送 json cred 而无需将其保存在文件中
这种方法没有错!我只是想指出推荐的使用云存储客户端库处理身份验证的方法,如documentation。因为您可以利用客户端库可以使用应用程序默认凭据(通常从 env 变量中读取)轻松地通过 Google API 进行身份验证并向这些 API 发送请求。【参考方案2】:
答案是信任确实是错误的,但当我尝试在客户端 client.bucket(bucket_name)
而不是 client.get_bucket(bucket_name)
上执行时,它确实有效。
【讨论】:
以上是关于谷歌云获取存储桶 - 适用于 cli 但不适用于 python的主要内容,如果未能解决你的问题,请参考以下文章