Google cloud storage 谷歌云存储500内部服务器错误';Google::Cloud::Storage::SignedUrlUnavailable';

Google cloud storage 谷歌云存储500内部服务器错误';Google::Cloud::Storage::SignedUrlUnavailable';,google-cloud-storage,Google Cloud Storage,正在尝试让谷歌云存储在我的应用程序上运行。我成功地将图像保存到存储桶中,但在尝试检索图像时,我收到以下错误: GCS Storage (615.3ms) Generated URL for file at key: 9A95rZATRKNpGbMNDbu7RqJx () Completed 500 Internal Server Error in 618ms (ActiveRecord: 0.2ms) Google::Cloud::Storage::SignedUrlUnavailable (

正在尝试让谷歌云存储在我的应用程序上运行。我成功地将图像保存到存储桶中,但在尝试检索图像时,我收到以下错误:

GCS Storage (615.3ms) Generated URL for file at key: 9A95rZATRKNpGbMNDbu7RqJx ()
Completed 500 Internal Server Error in 618ms (ActiveRecord: 0.2ms)

Google::Cloud::Storage::SignedUrlUnavailable (Google::Cloud::Storage::SignedUrlUnavailable):

知道发生了什么吗?我在他们的文档中找不到关于此错误的解释。

我能够找到答案。我一直在跟踪,不清楚如何生成我的凭证文件

google:
  service: GCS
  credentials: <%= Rails.root.join("path/to/keyfile.json") %>
  project: ""
  bucket: ""
google:
服务:地面军事系统
资格证书:
项目:“”
水桶:“
起初,我认为我不需要密钥文件,因为在:

如果您在Google App Engine或Google上运行应用程序 计算引擎,环境已经提供了服务帐户的 身份验证信息,因此无需进一步设置

(我正在使用谷歌应用程序引擎)

所以我注释掉了凭证行并开始测试。奇怪的是,我能够毫无问题地向谷歌云存储系统写信。但是,在检索图像时,我会收到500服务器错误
Google::Cloud::Storage::signedurlavable


我通过将其添加到我的rails应用程序中解决了这个问题。

这里提供一些解释

Google App Engine(以及Google Compute Engine、Kubernetes Engine和Cloud Run)提供与正在运行的VM或实例关联的“环境”凭据,但仅以OAuth令牌的形式提供。对于大多数API调用,这是足够和方便的


然而,也有少数例外,谷歌云存储就是其中之一。最近的存储客户端(包括)可能需要完整的服务帐户密钥来支持涉及的某些呼叫。App Engine(或其他托管环境)不会自动提供此完整密钥。你需要自己提供一个。因此,正如前面的回答所指出的,如果您使用云存储,您可能无法依赖“环境”凭据。相反,您应该下载一个,并将其提供给您的应用程序(例如,通过或设置环境变量)。

从2020年8月的google云存储gem 1.27版开始,另一个可能的解决方案是。文档中的My
Google::Auth.get\u application\u default
返回了一个空对象,但使用的是
Google::Cloud::Storage::Credentials.default.client

如果您在签名时得到
Google::API::ClientError:badRequest:Request包含无效参数
响应,请检查签名URL中的项目名称是否有破折号(即
projects/-/serviceAccounts
路径中的显式项目名称已弃用且不再有效),以及“issuer”字符串是否正确,作为服务帐户的完整电子邮件地址标识符,而不仅仅是服务帐户名称

如果您获得
Google::API::ClientError:forbidden:调用方没有权限
请验证您的服务帐户所具有的角色:

gcloud projects get-iam-policy <project-name>
  --filter="bindings.members:<sa_name>"
  --flatten="bindings[].members" --format='table(bindings.role)'

=> ROLE
     roles/iam.serviceAccountTokenCreator
     roles/storage.admin
gcloud项目获取iam策略
--filter=“bindings.members:”
--flant=“bindings[].members”--format='table(bindings.role)'
=>角色
角色/iam.serviceAccountTokenCreator
角色/storage.admin

serviceAccountTokenCreator需要调用signBlob服务,并且您需要storage.admin拥有需要签名的内容的所有权。我认为这些是project全局权限,很遗憾,我无法让它使用更细粒度的权限(即一个应用程序是某个存储桶的管理员)

该请求是否会重复出现此错误?如果是这样,请将详细信息(存储桶和对象名称、请求时间、您正在使用的库)发送给gs-team@google.com? 这将交给GCS团队,所以不会在这个公共论坛上透露你的详细信息。谢谢你,迈克,我真的弄明白了。未正确设置我的
config/storage.yml
的GCS密钥文件,导致此错误。有点让人困惑,因为我能够写入存储没有问题,我只是无法读取文件,并且没有收到401/403错误。@Josh Bradley,请将解决方案作为答案发布,好吗?我也面临类似问题。想知道在Rails应用程序中在哪里添加私钥吗?