无法使用python脚本切换gcloud平台帐户

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上使用该服务帐户!

在阅读了文档和链接(例如thisthis)之后,即使删除并恢复了服务帐户,或者给了它有限的范围,它也无济于事。我已经尝试了几件事:

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)