代码之家  ›  专栏  ›  技术社区  ›  Josh Bradley

google cloud storage 500内部服务器错误“google::cloud::storage::signedullunavailable”

  •  0
  • Josh Bradley  · 技术社区  · 8 年前

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

    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):
    

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

    2 回复  |  直到 8 年前
        1
  •  3
  •   Daniel Azuma    7 年前

    在这里提供一些解释…

    google app engine(以及google compute engine、kubernetes engine和cloud run)提供与正在运行的虚拟机或实例相关联的“环境”凭据,但仅以OAuth令牌的形式提供。对于大多数API调用来说,这是足够和方便的。

    然而,也有少数例外,谷歌云存储就是其中之一。最近的存储客户端(包括 google-cloud-storage gem )可能需要完整的服务帐户密钥来支持某些涉及 signed URLs . 这把全钥匙是 由应用程序引擎(或其他宿主环境)自动提供。你需要自己提供一个。因此,正如前面的回答所指出的,如果您使用的是云存储,那么您可能无法依赖“环境”凭据。相反,你应该 create a service account ,下载 service account key ,并使其可用于您的应用程序(例如,通过 ActiveStorage configs 或通过设置 GOOGLE_APPLICATION_CREDENTIALS 环境变量)。

        2
  •  2
  •   Josh Bradley    7 年前

    我能搞清楚。我一直在跟踪 Rail's guide on Active Storage with Google Storage Cloud 不清楚如何生成我的凭证文件。

    google:
      service: GCS
      credentials: <%= Rails.root.join("path/to/keyfile.json") %>
      project: ""
      bucket: ""
    

    最初,我以为我不需要一个关键文件,因为这句话 Google's Cloud Storage authentication documentation :

    如果你在谷歌应用引擎或谷歌上运行你的应用程序 计算引擎,环境已提供服务帐户的 身份验证信息,因此不需要进一步设置。

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

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

    我把这个修好了 generating my private key 并将其添加到我的Rails应用程序。