请有人帮助我进行有关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')
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')
两个存储桶都确实存在,并且显然如果“ 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.
请注意该错误消息是如何显示“ 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"
这似乎是成功的。
2)验证凭据帐户列表:
gcloud auth list
这列出了两个帐户,一个是我的电子邮件地址(我用于gmail等),另一个是master@projectB.iam.gserviceaccount.com,因此看来我的帐户已正确“注册”。 / p>
3)将服务帐户设置为活动帐户:
gcloud config set account master@projectB.iam.gserviceaccount.com
当我再次查看身份验证列表时,服务帐户旁边会出现一个星号“ *”,因此大概是不错的。
4)检查项目是否设置为ProjectB:
gcloud config set project projectB
这似乎还可以。
奇怪的是,当我运行python代码时,即使我似乎更改了所有要引用项目B的内容,它仍在“使用”旧项目中的服务帐户-我已经激活了该帐户,选择了该帐户,依此类推。
请有人指出我可能错过的方向吗?我不记得在设置我的原始项目时经历了如此多的痛苦,而我却发现它是如此令人沮丧,以至于我认为简单的事情变得如此困难。
谢谢任何能为我提供帮助的人。
答案 0 :(得分:5)
我不确定,但是这个答案来自一个类似的问题: Permission to Google Cloud Storage via service account in Python
通过指向代码中的凭据来明确指定帐户。如here所述:
文档页面中的示例:
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)
答案 1 :(得分:0)
您是否没有配置的GOOGLE_APPLICATION_CREDENTIALS env变量指向项目A的SA?
答案 2 :(得分:0)
Google SDK的默认行为是从环境变量GOOGLE_APPLICATION_CREDENTIALS中获取服务帐户。
如果要更改帐户,可以执行以下操作:
from google.cloud import storage
credentials_json_file = os.environ.get('env_var_with_path_to_account_json')
client= storage.Client.from_service_account_json(credentials)
以上假设您已经创建了一个json帐户文件,例如:https://cloud.google.com/iam/docs/creating-managing-service-account-keys
且json帐户文件位于环境变量env_var_with_path_to_account_json
这样,您可以拥有2个帐户文件并决定使用哪个文件。