问题: 我正在尝试使用 google colab python 笔记本读取存储在我的项目的云存储桶之一中的 .gz JSON 文件,但我不断收到此错误:
HttpError: Anonymous caller does not have storage.objects.get access to the Google Cloud Storage object., 401
我的代码:
fs = gcsfs.GCSFileSystem(project='my-project')
with fs.open('bucket/path.json.gz') as f:
gz = gzip.GzipFile(fileobj=f)
file_as_string = gz.read()
json_a = json.loads(file_as_string)
我已经尝试了所有这些身份验证方法,但仍然收到相同的 401 错误:
!gcloud auth login
!gcloud auth list
!gcloud projects list
!gcloud config set project 'myproject-id'
from google.colab import auth
auth.authenticate_user()
!gcloud config set account 'my GCP email'
!gcloud auth activate-service-account
!gcloud auth application-default login
!gsutil config
!gcloud config set pass_credentials_to_gsutil false
!gsutil config -a
我还将我的 GCP IAM 权限设置为:
您的问题并不完全清楚,但是:
gcloud
和 Google SDK 都使用 Google 的身份|身份验证平台 但是它们不共享状态。您通常(!)无法使用 gcloud
登录并期望使用 SDK 的代码也能得到身份验证gcloud
和使用 Google SDK 的代码之间共享状态的一种(通常令人困惑的)方法是使用 gcloud auth application-default login
。然而,这只有效,因为 gcloud
在本地写入其状态,并且使用 Google SDK 的代码在同一主机上以同一用户身份运行时将能够访问此状态。我认为(!?)这不适用于基于浏览器的协作gcsfs.GCSFileSystem
,但是,它不是 Google SDK。除非其开发人员特别周到,否则它将无法利用 Google SDK 使用 auth.authenticate_user()
完成的身份验证。所以...
我认为你应该:
[email protected]
或其他)具有 roles/storage.objectAdmin
(或任何允许 storage.objects.get
的预定义角色)。
google.collab.auth
和 auth.authenticate_user()
获取浏览器登录用户的凭据(即 [email protected]
)。google-cloud-storage
访问 GCS 对象。 Google 库可以利用上一步中获得的凭据。这是一个示例。
注意:它使用 API 客户端库而不是云客户端库,但它们在功能上是等效的。