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

时间:2019-07-16 05:19:57

标签: python google-cloud-platform google-cloud-storage

请有人帮助我进行有关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上使用该服务帐户!

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

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的内容,它仍在“使用”旧项目中的服务帐户-我已经激活了该帐户,选择了该帐户,依此类推。

请有人指出我可能错过的方向吗?我不记得在设置我的原始项目时经历了如此多的痛苦,而我却发现它是如此令人沮丧,以至于我认为简单的事情变得如此困难。

谢谢任何能为我提供帮助的人。

3 个答案:

答案 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个帐户文件并决定使用哪个文件。