使用服务帐户json文件通过python推送的GCP云存储文件

时间:2019-03-13 09:29:30

标签: python-3.x google-cloud-platform google-cloud-storage

我已经按照Google文档编写了简单的python程序。这使我出错,提示给定帐户无权访问。尝试了不同的组合,但没有用。

我通过提供给Java程序和gsutil来交叉检查了给定的访问权限。在这两个地方,我都可以访问存储桶并上传文件。 python程序出现问题。请对此问题有所启发。

from google.oauth2 import service_account
from google.cloud import storage

credentials = service_account.Credentials.from_service_account_file('C:/Users/AWS/python/sit.json'
    ,scopes=['https://www.googleapis.com/auth/cloud-platform'])
storage_client = storage.Client(credentials=credentials,project='proj-sit')  
bucket = storage_client.get_bucket('b-sit')
blob = bucket.blob('myfile')
blob.upload_from_string('New contents!. This is test.')

我收到以下错误消息

  Traceback (most recent call last):
  File "C:\Users\AWS\python\mypgm.py", line 21, in <module>
    bucket = storage_client.get_bucket('pearson-gcss-sit') # pearson-gcss-sit  pearson-bbi-dev global-integration-nonprod
  File "D:\Development_Avecto\Python36\lib\site-packages\google\cloud\storage\client.py", line 227, in get_bucket
    bucket.reload(client=self)
  File "D:\Development_Avecto\Python36\lib\site-packages\google\cloud\storage\_helpers.py", line 106, in reload
    method="GET", path=self.path, query_params=query_params, _target_object=self
  File "D:\Development_Avecto\Python36\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/b-sit?projection=noAcl: someid-sit@someinfo-sit.iam.gserviceaccount.com does not have storage.buckets.get access to b-sit.
[Finished in 10.6s]

注意:我可以在console.cloud.google.com中看到角色为“ storage.objectAdmin ”。

有关更多信息,我可以使用下面的java程序上传文件。

GoogleCredentials credentials = GoogleCredentials.fromStream(new FileInputStream(connectionKeyPath))
                                .createScoped(Lists.newArrayList("https://www.googleapis.com/auth/cloud-platform"));
                        Storage storage = StorageOptions.newBuilder().setCredentials(credentials).build().getService();
                        BlobId blobId = BlobId.of("some-sit", "cloudDirectory/file.zip");
                        BlobInfo blobInfo = BlobInfo.newBuilder(blobId).setContentType("application/zip").build();
                        Blob blob = storage.create(blobInfo, fileContent);

我找到了问题的根本原因。

根本原因:我的存储桶可以访问“ roles / storage.objectAdmin”,而不能访问“ storage.buckets.get”。因此,我在具有get_bucket函数的行中收到上述错误。这是我在Google documentation中找到的。

文档中的所有示例代码都具有get_bucket函数来上传文件。我的问题是如何在没有此访问权限的情况下将文件上传到存储桶(storage.buckets.get)?因为我们没有访问权限就通过Java上传到了同一存储桶。

你能对此有所启示吗?请

2 个答案:

答案 0 :(得分:3)

您使用的服务帐户没有正确的permissions

您可以通过在存储桶或项目级别至少授予roles/storage.objectAdmin角色来解决此问题。

  

roles/storage.objectAdmin role

     

授予对对象的完全控制权,包括列出,创建,查看和删除对象。

grant it at bucket level运行:

gsutil iam ch serviceAccount:someid-sit@someinfo-sit.iam.gserviceaccount.com:roles/storage.objectAdmin gs://[BUCKET_NAME]

grant it at project level运行:

gcloud projects add-iam-policy-binding yourProject --member serviceAccount:someid-sit@someinfo-sit.iam.gserviceaccount.com --role roles/storage.objectAdmin

编辑

您需要将凭据传递到storage_client

storage_client = storage.Client('proj-sit', credentials=credentials)

答案 1 :(得分:0)

我已删除行以在代码中获取存储区,并在行下方添加了该行。下面的线对我做了个窍门。因此,我可以使用“ roles / storage.objectAdmin”的访问权限上传文件

bucket = storage_client.bucket('b-sit')