如何在 application.properties 文件中指定 GCP 凭据位置(用于在 GCP 中使用 Pub/Sub)?

How to specify the GCP Credential Location in application.properties file (for using the Pub/Sub in GCP)?

通过在 application.properties 文件中指定文件位置来传递服务帐户密钥文件(从 GCP 控制台生成)似乎很简单。但是,我尝试了以下所有选项:

1. spring.cloud.gcp.credentials.location=file:/home/my_user_id/mp6key.json
2. spring.cloud.gcp.credentials.location=file:src/main/resources/mp6key.json
3. spring.cloud.gcp.credentials.location=file:./main/resources/mp6key.json
4. spring.cloud.gcp.credentials.location=file:/src/main/resources/mp6key.json

一切都以同样的错误结束:

java.io.FileNotFoundException: /home/my_user_id/mp6key.json (No such file or directory)

谁能告诉我应该把密钥文件放在哪里,然后我应该如何正确指定文件的路径?

相同的程序 运行 在 Ecplise 中成功使用来自 GCP 的 Pub/Sub 处理发布和订阅消息(使用 GCP 中生成的项目 Id/Service 帐户密钥),但现在卡住了在 GCP 上部署到 运行 后出现上述问题。

您是否尝试过关注此 quickstart?请仔细阅读并解释您在完成快速入门时遇到的任何错误。

无论如何,在 运行 您的 Java 脚本之前,请在控制台上尝试 运行 以下内容(请使用您存储密钥的确切路径进行修改):

export GOOGLE_APPLICATION_CREDENTIALS="/home/user/Downloads/mp6key.json"

您如何在 Java 脚本中验证您的凭据?

我的回答很简单:如果您 运行 在 GCP 上编写代码,则不必使用服务帐户密钥文件。问题消除,问题解决!

更严重的是,看看服务身份。我不知道你现在的服务是什么(Compute?Function?Cloud 运行?)。无论如何,您可以在 GCP 组件上附加任何服务帐户。然后,当您编写代码时,只需使用默认凭证即可。自动加载组件标识。 无需管理密钥,无需安全存储密钥,无需轮换密钥!

如果您提供有关目标平台的更多详细信息,我可以为您提供一些指导来实现这一目标。

请记住,服务帐户密钥文件旨在由在 GCP(预置、其他云提供商,CI/CD、Apigee、...)

更新

当您使用个人帐户时,您也可以使用默认凭据。

  • 在您的计算机上安装 gcloud SDK
  • 使用命令gcloud auth application-default login
  • 按照说明进行操作
  • 尽情享受吧!

如果不行,获取登录命令后显示的<path>,并在名为GOOGLE_APPLICATION_CREDENTIALS.

的环境变量中设置此值

如果您确定要使用服务帐户密钥文件(由于之前的原因这是一个安全问题,但是...),您可以在本地使用它

  • 要么将json密钥文件路径设置到GOOGLE_APPLICATION_CREDENTIALS环境变量中
  • 或运行这个命令gcloud auth activate-service-account --key-file=<path to your json key file>

如果您的文件在资源文件夹中,请尝试

file://mp6key.json

使用 file:// 而不是 file:/ 至少对我有用

如官方documentation所述,可以从文件系统、类路径、URL等多个不同位置获取凭据文件

例如,如果服务帐户密钥文件作为 src/main/resources/key.json 存储在类路径中,则传递以下 属性

spring.cloud.gcp.credentials.location=classpath:key.json

如果密钥文件存储在本地文件系统的其他位置,请在 属性 值

中使用 file 前缀
spring.cloud.gcp.credentials.location=file:<path to key file>

我的线路是这样的:

spring.cloud.gcp.credentials.location=file:src/main/resources/[my_json_file]

这有效。

如果我将它放在项目目录的根目录下,以下内容也有效:

spring.cloud.gcp.credentials.location=file:./[my_json_file]