Pau*_*aul 2 python google-cloud-storage google-cloud-platform
请有人帮我进行有关Google云平台权限的查询吗?我意识到这只是与编程松散相关,所以如果这是错误的论坛,我深表歉意!
我有一个用Python编写的项目(“ ProjectA”),该项目使用Google的云存储和计算引擎。该项目具有各种存储桶,可使用python代码从计算实例和我的家用计算机访问这些存储桶。这个专案使用的服务帐户是专案的「拥有者」,我相信它已启用所有API,而且专案运作得很好。服务帐户名称是“ master@projectA.iam.gserviceaccount.com”。
最近,我开始了一个需要类似资源(存储,计算)等的新项目,但我想将其分开。新项目称为“ ProjectB”,我建立了一个新的主服务帐户,称为master@projectB.iam.gserviceaccount.com。我在ProjectB中的代码生成与访问权限相关的错误,即使我将代码简化为以下几行,该代码也得到了演示:
来自ProjectA的代码如下所示:
from google.cloud import storage
client = storage.Client(project='projectA')
mybucket = storage.bucket.Bucket(client=client, name='projectA-bucket-name')
currentblob = mybucket.get_blob('somefile.txt')
Run Code Online (Sandbox Code Playgroud)
来自ProjectB的代码如下所示:
from google.cloud import storage
client = storage.Client(project='projectB')
mybucket = storage.bucket.Bucket(client=client, name='projectB-bucket-name')
currentblob = mybucket.get_blob('somefile.txt')
Run Code Online (Sandbox Code Playgroud)
这两个存储桶都确实存在,并且显然如果“ somefile.text”不存在,那么currentblob为None,这很好,但是当我执行此代码时,我收到以下错误:
Traceback (most recent call last):
File .... .py", line 6, in <module>
currentblob = mybucket.get_blob('somefile.txt')
File "C:\Python27\lib\site-packages\google\cloud\storage\bucket.py", line 599, in get_blob
_target_object=blob,
File "C:\Python27\lib\site-packages\google\cloud\_http.py", line 319, in api_request
raise exceptions.from_http_response(response)
google.api_core.exceptions.Forbidden: 403 GET https://www.googleapis.com/storage/v1/b/<ProjectB-bucket>/o/somefile.txt: master@ProjectA.iam.gserviceaccount.com does not have storage.objects.get access to projectB/somefile.txt.
Run Code Online (Sandbox Code Playgroud)
注意错误消息是如何显示“ ProjectA”服务帐户没有ProjectB访问权限的-好吧,我希望如此,但是我希望在ProjectB上使用该服务帐户!
在阅读了文档和链接(例如this和this)之后,即使删除并恢复了服务帐户,或者给了它有限的范围,它也无济于事。我已经尝试了几件事:
1)确保我的新服务帐户已在本地计算机(当前正在运行代码的地方)“激活”:
gcloud auth activate-service-account master@projectB.iam.gserviceaccount.com --key-file="C:\my-path-to-file\123456789.json"
Run Code Online (Sandbox Code Playgroud)
这似乎是成功的。
2)验证凭据帐户列表:
gcloud auth list
Run Code Online (Sandbox Code Playgroud)
这列出了两个帐户,一个是我的电子邮件地址(我用于gmail等),另一个是master@projectB.iam.gserviceaccount.com,因此看来我的帐户已正确“注册”了。
3)将服务帐户设置为活动帐户:
gcloud config set account master@projectB.iam.gserviceaccount.com
Run Code Online (Sandbox Code Playgroud)
当我再次查看身份验证列表时,服务帐户旁边会出现一个星号“ *”,因此推测这很好。
4)检查项目是否设置为ProjectB:
gcloud config set project projectB
Run Code Online (Sandbox Code Playgroud)
这似乎还可以。
奇怪的是,当我运行python代码时,即使我似乎更改了所有内容以引用项目B,它仍在“使用”旧项目中的服务帐户-我激活了该帐户,选择了该帐户,依此类推。
请有人指出我可能错过的东西的方向吗?我不记得在设置我的原始项目时经历了如此多的痛苦,而我却发现它是如此令人沮丧,以至于我认为简单的事情变得如此困难。
谢谢任何能给我任何帮助的人。
小智 5
我不确定,但是这个答案来自一个类似的问题: 通过Python中的服务帐户对Google Cloud Storage的许可
通过指向代码中的凭据来明确指定帐户。作为记录在这里:
文档页面中的示例:
def explicit():
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.json')
# Make an authenticated API request
buckets = list(storage_client.list_buckets())
print(buckets)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
74 次 |
最近记录: |