如何使用Python从Google Storage中列出存储桶?

时间:2018-07-02 13:47:01

标签: python google-cloud-platform

我在Python脚本中有以下代码:

from google.oauth2 import service_account
SCOPES = ['https://www.googleapis.com/auth/sqlservice.admin']
SERVICE_ACCOUNT_FILE = 'JSON_AUTH_FILE'
credentials = service_account.Credentials.from_service_account_file(
            SERVICE_ACCOUNT_FILE, scopes=SCOPES)
import os
os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = SERVICE_ACCOUNT_FILE

这会对Google进行身份验证。

现在我要列出所有存储桶:

from google.cloud import storage
storage_client = storage.Client()
buckets = list(storage_client.list_buckets())
print(buckets)

但这不起作用。我得到:

google.api_core.exceptions.Forbidden: 403

xxx@yyy.iam.gserviceaccount.com does not have storage.buckets.list access to project

当我单击它时,它也有一个链接(这很奇怪,因为它显示403,但此处显示401:

{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "required",
    "message": "Anonymous caller does not have storage.buckets.list access to project NUMBER.",
    "locationType": "header",
    "location": "Authorization"
   }
  ],
  "code": 401,
  "message": "Anonymous caller does not have storage.buckets.list access to project NUMBER."
 }
}

我在做什么错了?

2 个答案:

答案 0 :(得分:2)

关于此链接的几点建议: https://cloud.google.com/storage/docs/reference/libraries#client-libraries-install-python

您可以通过以下几种方法为服务帐户设置角色以访问Google存储空间: https://cloud.google.com/iam/docs/understanding-roles#cloud_storage_roles

在创建服务帐户时使用默认角色

创建服务帐户时,选择项目角色:存储->存储管理员。设置此角色将使您的服务帐户可以访问和操作Cloud Storage中的对象。使用存储管理员角色可确保您为服务帐户提供最少的特权,以使其无法访问其他服务。

如果您在身份验证方面遇到问题,也许可以考虑将角色设置为项目->编辑器,这应该为服务帐户提供对大多数GCP服务的编辑权限。请注意,如果服务帐户遭到入侵,用户将可以访问GCP项目中的大多数服务。

使用custom role继承多个角色

通过设置自定义角色,您可以继承赋予许多默认角色的权限。做到这一点的一种好方法是使用GCP控制台IAM & Admin -> Roles部分中的“根据选择创建角色”

例如,您可以通过选择每个角色的复选框并创建自己的自定义角色来将 BigQuery Admin Storage Object Admin 组合到一个自定义角色中。然后,您可以在IAM section of GCP中分配给您的服务帐户。


拥有拥有正确权限的服务帐户后,您应该可以设置GOOGLE_APPLICATION_CREDENTIALS环境变量并使用google库访问您的存储桶。

拥有服务帐户的正确角色后,请尝试对代码进行此修改,以测试其是否可以list all the buckets帐户有权访问

import os
from google.cloud import storage

os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = "/home/user/Downloads/[FILE_NAME].json"

# Instantiates a client
storage_client = storage.Client()

# List all the buckets available
for bucket in storage_client.list_buckets():
    print(bucket)

答案 1 :(得分:0)

您需要使用Storage Admin而不是Storage Object Admin来列出存储桶。 Storage Object Admin角色没有storage.buckets.list权限。所有贡献都归功于ScottMcC。