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/gsutilplatform 路径不会自动知道您配置的 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 sdkpass cloud sdk credentials to gsutilconfig 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