【问题标题】:Why Google Cloud Storage isn't taking my GOOGLE_APPLICATION_CREDENTIALS environment variable [HEROKU]?为什么 Google Cloud Storage 不使用我的 GOOGLE_APPLICATION_CREDENTIALS 环境变量 [HEROKU]?
【发布时间】:2020-09-16 17:58:26
【问题描述】:

我正在使用 Spring Boot 开发一个 POC 网站,以了解 GCP 产品,特别是 Google Cloud Storage。上下文是我正在尝试在用户注册时保存个人资料图片。

从谷歌文档中,我可以使用

StorageOptions.getDefaultInstance().getService();

如果我的环境变量中有 GOOGLE_APPLICATION_CREDENTIALS,则验证我的凭据。事实是,我确实将 GOOGLE_APPLICATION_CREDENTIALS 作为环境变量(我使用的是 Linux Mint)指向我的 .json 文件(这是有效的,因为它使用路径方法有效),但它总是从 GCP lib 返回 401 UNAUTHORIZED。

花费 HOURS 搜索后,只是为了确保我在终端上运行此命令:

gcloud auth application-default login

这个命令的响应是:

The environment variable [GOOGLE_APPLICATION_CREDENTIALS] is set to:
  [/home/<myuser>/<some_folder>/<myapplication>-<id>.json]
Credentials will still be generated to the default location:
  [/home/<myuser>/.config/gcloud/application_default_credentials.json]
To use these credentials, unset this environment variable before
running your application.

Do you want to continue (Y/n)?

用我的浏览器确认并登录后,令我惊讶的是它使用 StorageOptions.getDefaultInstance().getService();

所以我假设 GCP 从 application_default_credentials 文件而不是 GOOGLE_APPLICATION_CREDENTIALS 环境变量中获取凭据。

所以在我的本地环境中,它工作正常。问题是:这个网站部署在 Heroku 上,我不能使用 path 方法,因为我没有'不想将此凭据放在 GitHub 上。 我已经将环境变量放在 Heroku 并且没有工作。 也已经尝试使用这些构建包:

https://github.com/elishaterada/heroku-google-application-credentials-buildpack
https://github.com/gerywahyunugraha/heroku-google-application-credentials-buildpack

但是在 Heroku Cloud 上我无法让它工作。请问有人知道我可以使用12factor 规则运行此程序吗?

【问题讨论】:

    标签: java spring spring-boot heroku google-cloud-storage


    【解决方案1】:

    为了传递凭据,您可以通过environment variables 进行,这实际上就是您提到的那个。要在 Linux 中执行此操作,您应该使用以下命令

    export GOOGLE_APPLICATION_CREDENTIALS="[PATH]"
    

    不过,需要记住的是,此变量仅适用于您当前的 shell 会话,因此如果您打开一个新会话,请再次设置该变量。

    另一方面,执行此任务的另一个选项是传递凭据 using code,正如您在共享链接中看到的那样,您应该使用如下所示的内容。

    GoogleCredentials credentials = GoogleCredentials.fromStream(new FileInputStream(jsonPath))
            .createScoped(Lists.newArrayList("https://www.googleapis.com/auth/cloud-platform"));
      Storage storage = StorageOptions.newBuilder().setCredentials(credentials).build().getService();
    

    最后,如果您不想将凭据指向应用程序代码中,您可以使用Cloud Key Management Service。我认为 KMS 对您的情况来说是一个不错的选择,但最后,您应该做出决定。

    【讨论】:

    • 我尝试使用命令 export GOOGLE_APPLICATION_CREDENTIALS,我也将它放在 bashrc 和 zshrc 配置文件中。事实上,在终端上使用“printenv”时我可以看到我的环境变量,但是当 json 路径位于环境变量上时,GCP 给了我 401 未授权。我可以让它工作的唯一方法是使用登录命令,但我不能在云中使用登录命令......在我的 Heroku 环境变量中,我也添加了这些凭据,但发生了同样的错误。而且我没有使用 GoogleCredentials.fromStream() 只是因为我在 Heroku 上没有 json 文件,只有 env var。
    • 我想使用环境变量,因为这样可以使代码看起来更干净、更可调整并且易于在不同的环境和分支中工作。我不知道这个云密钥管理服务,我会看看它是否适合这个项目。谢谢你帮助我。
    • 只是提供更多详细信息,我尝试了每个命令以使其与环境变量一起使用,使用和不使用双引号导出,将其放在 bash 配置文件、zsh 配置文件等任何东西上。使它在本地环境中运行的唯一方法是 gcloud login 命令。我想知道如何使用环境变量使其在 Heroku 上运行(无需将 credentials.json 直接放在 github 上,因为这将是一个公共存储库)
    • 这似乎是与 Heroku 相关的问题。我发现了一些类似的案例(thisthis one)。此外,这个其他link 可以帮助您执行您想要的任务。希望这些信息对您有所帮助。
    • 非常感谢,塞缪尔!我已经访问了这些链接(具体是this 一个,但只尝试了一些方法。有效的方法来自 Chrisjan。创建两个 heroku vars 和一个 .profile,在每次登录(部署)时在运行时创建一个 .json。我如果有人需要,我会回答这个问题并提供更多详细信息。再次感谢您,Samuel!
    猜你喜欢
    • 2019-09-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-13
    • 2022-10-02
    • 1970-01-01
    • 2021-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多