问题: 我正在尝试使用 google colab python notebook 读取存储在我项目的一个云存储桶中的 .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 的 identity|auth 平台但它们不共享状态。您通常 (!) 无法使用gcloud
登录并期望使用 SDK 的代码也能通过身份验证- @john-hanley 正确地指出,在
gcloud
和使用 Google SDK 的代码之间共享状态的一种(通常令人困惑的)方法是使用gcloud auth application-default-login
。但是,这仅适用于gcloud
在本地写入其状态,并且当以同一用户身份在同一主机上运行时使用 Google SDK 的代码将能够访问该状态。我认为(!?)这不适用于基于浏览器的协作 - 我不熟悉
gcsfs.GCSFileSystem
但它不是 Google SDK。除非其开发人员特别周到,否则它将无法利用 Google SDK 使用auth.authenticate_user()
完成的身份验证。
所以...
我认为你应该:
- 确保您的用户帐户(
you@gmail.com
或其他)具有roles/storage.objectAdmin
(或任何允许存储的predefined role。 objects.get
). - 使用
google.collab.auth
和auth.authenticate_user()
获取浏览器登录用户的凭据(即you@gmail.com
). - 使用 Google 云存储库,例如
google-cloud-storage
访问 GCS 对象。 Google 图书馆可以利用在上一步中获得的凭据。
更新
这是一个 example .
注意:它使用 API 客户端库而不是 Cloud 客户端库,但它们在功能上是等效的。
关于python - 如何解决 "HttpError: Anonymous caller does not have storage.objects.get access to the Google Cloud Storage object., 401"错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71505271/