gsutil ServiceException: 401 Anonymous caller does not have storage.objects.list access to bucket 即使
Posted
技术标签:
【中文标题】gsutil ServiceException: 401 Anonymous caller does not have storage.objects.list access to bucket 即使我在 gcloud 中登录【英文标题】:gsutil ServiceException: 401 Anonymous caller does not have storage.objects.list access to bucket even though I'm loggedin in gcloud 【发布时间】:2018-08-24 11:09:49 【问题描述】:我正在尝试创建一个内部应用程序来将文件上传到谷歌云。我不希望每个单独的用户或这个应用程序都登录,所以我使用的是服务帐户。我登录到服务帐户,一切正常,但是当我尝试上传时,它给了我这个错误: ServiceException: 401 Anonymous caller does not have storage.objects.list access to bucket
如您所见,我使用服务帐户登录,并且我的帐户(无论是服务还是个人)都可以使用
【问题讨论】:
【参考方案1】:我有类似的问题,和往常一样,我花了 2 个小时,但解决方案是微不足道的,只要它写在某个地方......我需要登录(或授权,什么适合你)到 gsutil 除了被授权给 gcloud。我以为他们是有联系的或其他什么,但不。在我运行gsutil config
并通过提供的链接(以及我粘贴回控制台的代码)进行授权后,它开始为我工作。
请注意,我还通过链接到我的项目的服务帐户登录到 gcloud,并在本地保存了服务帐户 .json 密钥(请参阅gcloud auth activate-service-account --help
) .希望这可以帮助任何为此苦苦挣扎的人!
【讨论】:
是的!你是对的,没有记录在任何地方,他们只是建议你使用gcloud
进行身份验证!?!?
如果您运行 gcloud 包装脚本 (.../bin/gsutil),它应该将您的 gcloud 凭据用于 gsutil。如果您直接调用打包的 gsutil (.../platform/gsutil/gsutil),则不会,您需要通过 gsutil config
配置您的凭据。请参阅下面的答案。
现在也可以通过google cloud auth gcloud auth login
这是我的关键gcloud auth activate-service-account
指向我的服务帐户 .json 文件
我不明白解决方案是什么。我通过gcloud auth login
进行了身份验证,但gcsfs
仍然没有使用我的帐户。【参考方案2】:
gcloud auth login
解决了我的问题。您需要这两个步骤:
gcloud auth login
gcloud auth application-default login
【讨论】:
我做了一个pip install gcloud
。安装 gcloud 后,我运行 gcloud auth login
并得到 bash: gcloud: command not found...
这工作得很好,比接受的答案简单得多。 (而且我似乎不需要第二行,在在线命令提示符下运行它。)
这个解决方案对我有用!谢谢。我尝试只使用“gcloud auth login”,它不起作用,在运行“gcloud auth application-default login”之后它终于起作用了
在这里解决了我的问题?
这也解决了我的问题!【参考方案3】:
这发生在我身上,因为我在运行 gcloud init
时初始化不完整。
我使用gcloud init
命令重新初始化了配置,它运行良好。
【讨论】:
类似:我必须运行gcloud auth list
以确定我没有用户登录(令我惊讶),然后gcloud auth login 'my@email.com'
【参考方案4】:
我只能想到几件事可能会导致您看到此错误:
也许您为 gsutil 的独立安装设置了别名(不与 gcloud 共享凭据)?编辑:您也可能调用了错误的 gsutil 条目要点 - 确保您使用的是<path-to-cloud-sdk>/google-cloud-sdk/bin/gsutil
,而不是<path-to-cloud-sdk>/google-cloud-sdk/platform/gsutil/gsutil
。 platform
路径不会自动知道您配置的 gcloud 身份验证选项。
您的服务帐户凭据现在可能已移动/无效?如果您的 boto 文件引用了密钥文件路径并且密钥文件已被移动,则可能会发生这种情况。
也许 gcloud boto 文件(当您运行 gcloud auth login
时创建的 gcloud 与 gsutil 一起使用)已消失。您可以运行gsutil version -l
来查看它是否显示在您的配置路径中。如果 gcloud 的 boto 文件存在,您应该会看到类似以下的一行:
配置路径: /Users/Daniel/.config/gcloud/legacy_credentials/email@domain.tld/.boto
您可以运行gsutil version -l
以获取更多信息并查看上述可能性。特别是,输出中的这些属性可能最有帮助:using cloud sdk
、pass cloud sdk credentials to gsutil
、config path(s)
和 gsutil path
。
【讨论】:
【参考方案5】:使用此命令解决一些问题
gsutil config
跟随浏览器获取代码然后设置。
【讨论】:
【参考方案6】:我遇到了同样的问题。我花了两天时间才让这个东西工作起来。 我正在写整个设置。有关问题的答案,请参阅步骤 2。仅供参考,我的操作系统是 Windows 10
第 1 步: 首先,我在安装 gcloud 时遇到了问题,这就是我所做的。 由于权限问题,应该将 gcloud 添加到路径的脚本 (.\google-cloud-sdk\install.bat) 无法正常工作。 我不得不在两个地方手动添加路径 1)在系统变量中,在“PATH”变量中,我添加了 gcloud bin 的路径,看起来应该像 - C:\Users\774610\google-cloud-sdk\bin - 在我的情况下 2)另外gcloud需要python所以我在最后附加了“.PY”的“PATHEXT”变量。 执行这些任务后,gcloud 开始工作。
第 2 步: 即使 gcloud 正在工作,maven 也无法连接到云存储并且错误是“401 Anonymous caller does not have storage.objects.list access to bucket” 我很确定我确实登录了我的帐户并选择了正确的项目。我还尝试添加环境变量,如本文档“https://cloud.google.com/docs/authentication/getting-started”中所示 尽管所有凭据都已完美设置,但似乎没有任何效果。
在浏览 gcloud 文档时,我遇到了这个命令 - “gcloud auth application-default login”,这正是我所需要的。
Refer here for difference between gcloud auth login and gcloud auth application default login 简而言之,此命令的作用是通过 Web 流获取您的凭据并将它们存储在“应用程序默认凭据的知名位置”,您运行的任何代码/SDK 都将能够自动找到凭据
在此之后,maven 能够成功连接到 google 存储并完成它的工作。
希望对你有帮助,谢谢
【讨论】:
【参考方案7】:您的服务帐户实际上是否具有所需的permission?将授予您此权限的 role(s) 是角色/storage.objectViewer/角色/storage.objectAdmin/角色/storage.admin。
请确保服务帐户在您的 Cloud Console 中确实具有权限,然后它应该可以工作。
--- 更新 ---
由于您在帐户中拥有正确的权限,因此 gsutil 命令中可能未使用正确的帐户。如果您安装了多个 gsutil 工具,则可能会发生这种情况,请确保您的 gsutil 具有指向 .BOTO 文件的正确路径。 github repo 上报告了类似的问题。你可以看看那里的解决方案是否有效。
最终,您可以使用全新安装的新机器/虚拟机来测试它是否有效。您可以通过转到 Cloud Console 并使用 Cloud Shell 轻松完成此操作。无需实际安装,测试应该非常简单。
这应该可以工作,并且基本上可以将您的问题(针对多个安装的问题)隔离在您的原始机器上。之后,您基本上只需要进行全新安装即可修复它。
【讨论】:
如果用户经过身份验证,它不会说“匿名呼叫者”。它会说“来电者”(或者可能有来电者的电子邮件地址)。 是的,确实如此。它与我的个人帐户具有相同的权限,我可以从网络使用但不能从控制台使用 我明白你的意思。在这种情况下,可能是安装问题(多个 gsutil 版本)。您可以通过全新安装或使用新机器进行测试。我编辑的答案中有详细说明。【参考方案8】:我有同样的问题,尝试做gsutil config
然后它推荐我gcloud auth login
在浏览器中打开谷歌。登录后,我可以用gsutil cp -r gs://my_bucket/Directory local_save_path
下载整个bucket并保存在本地。
【讨论】:
【参考方案9】:如果您使用 python(没有 gcloud SDK)安装了 gsutil,运行 gsutil config
并完成初始化步骤可能会有所帮助。
【讨论】:
尽管gsutil
来自标准安装,我仍然必须执行 gsutil config
并且它验证了该工具。虽然mhouglum
的回答描述了我的问题【参考方案10】:
感谢您的所有回复。 我想分享我自己的经验。 我必须使用安装 Gitlab Runner 时定义的用户登录。 默认情况下,安装文档中指定的用户是:“gitlab-runner”。 所以,首先,我为这个用户添加了一个密码:
passwd gitlab-runner
然后:
su - gitlab-runner
gcloud auth login
gcloud auth application-default login
问题解决了。 也许有更好的方法,直接把谷歌的身份验证文件放在 /home/gitlab-runner 下
【讨论】:
【参考方案11】:如果你使用的是服务账号,你需要先授权,否则gsutil
将没有读/写权限
gcloud auth activate-service-account --key-file=service_account_file.json
【讨论】:
【参考方案12】:就我个人而言,我注册了一个具有适当权限的帐户,但尽管使用“sudo gcloud init”验证我的帐户正在运行,但我还是收到了该错误
为我解决的问题是导航到 ~/.gutil 目录并编写以下内容
sudo chown jovyan:jovyan *
它让我的 JupyterLab 终端运行,不是从根目录,而是从默认的 jovyan。 之后它使用了我的帐户,而不是匿名呼叫者
【讨论】:
【参考方案13】:这是编辑角色的另一种方法:
gsutil iam ch allUsers:objectViewer gs://tf-learn-objectdetection
更多文档:
gsutil iam help
【讨论】:
【参考方案14】:我遇到了同样的问题。我用过
gcloud 认证登录
点击链接
【讨论】:
这是现有答案的副本。【参考方案15】:使用 gcloud auth 登录
-
转到提及链接
复制验证码
粘贴验证码
【讨论】:
这是现有答案的副本。以上是关于gsutil ServiceException: 401 Anonymous caller does not have storage.objects.list access to bucket 即使的主要内容,如果未能解决你的问题,请参考以下文章
com.google.protobuf.serviceexception在啥jar包下
尝试创建 EntityManagerFactory 时线程“主”org.hibernate.service.spi.ServiceException 中的异常
尝试下载用户映像时出现Microsoft.Graph.ServiceException
Hibernate中出现异常解决org.hibernate.service.spi.ServiceException: Unable to create requested service
Hibernate中出现异常解决org.hibernate.service.spi.ServiceException: Unable to create requested service
org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine