java - 在 Java 应用程序中对 Cloud Scheduler 进行身份验证
问题描述
我正在使用 Java SDK for google cloud scheduler 创建一些计划作业。这是已作为另一个问题的一部分发布的应用程序代码的链接。该应用程序基本上创建了一个 Cloud Scheduler 作业,每次运行时都会触发 VertexAI 上的自定义训练作业。现在,调度程序对 VertexAI 的调用以创建自定义作业已使用服务帐户进行身份验证。我的问题是关于创建 Cloud Scheduler 作业本身的应用程序代码的身份验证。我已将此应用程序设置为 maven 项目,并创建了一个可执行 jar。该应用程序本身在我的本地工作站上运行。以下是我的观点/问题:
- 当我创建一个 docker 映像并将此 jar 和服务帐户密钥复制到映像中,然后将 GOOGLE_APPLICATION_CREDENTIALS 环境变量设置为指向容器内的密钥时,应用程序运行良好并创建了 Cloud Scheduler 作业。
- 当我执行与上述相同的操作时,除了我只是在 powershell 中执行 jar(使用指向服务帐户密钥的 GOOGLE_APPLICATION_CREDENTIALS 环境变量),权限被拒绝。
- 与 2 相同,只是我只是使用 eclipse“运行应用程序”按钮运行应用程序。
如何进行身份验证以运行应用程序而无需在 docker 容器中运行。有没有一种方法可以在不使用 GOOGLE_APPLICATION_CREDENTIALS 环境变量的情况下进行身份验证,即直接在应用程序代码本身中进行身份验证。示例代码/示例的链接将很有帮助。
编辑:对于第 2 点,问题是环境变量名称中的拼写错误。对于第3点,您可以直接在eclipse中设置环境变量,如@RJC的回答中所述。
解决方案
我的机器上没有 Eclipse,但我找到了一个相关的答案,您可以在其中在 IDE 本身中添加特定的环境变量。我建议您尝试执行以下操作,看看是否可以解决问题。
还有另一种不使用 进行身份验证GOOGLE_APPLICATION_CREDENTIALS
的方法,即在代码中显式指向您的服务帐户文件。我创建了一个示例代码,它可以在不使用 GOOGLE_APPLICATION_CREDENTIALS 的情况下检索作业名称。身份验证是通过在初始化CloudSchedulerClient
.
这是我最后所做的:
- 使用
gcloud iam service-accounts keys create serviceaccount.json --iam-account=NAME@PROJECT_ID.iam.gserviceaccount.com
它将为将在 CredentialsProvider 中使用的服务帐户生成 JSON 文件。 - 创建一个
CredentialsProvider
对象,该对象将调用服务帐户的已创建 JSON 文件。
try {
JobName name = JobName.of("[PROJECT]", "[LOCATION]", "[JOB]");
CredentialsProvider credentialsProvider =
FixedCredentialsProvider.create(
ServiceAccountCredentials.fromStream(new FileInputStream("/path/to/serviceaccount.json")));
CloudSchedulerSettings cloudSchedulerSettings = CloudSchedulerSettings.newBuilder().setCredentialsProvider(credentialsProvider).build();
CloudSchedulerClient cloudSchedulerClient = CloudSchedulerClient.create(cloudSchedulerSettings);
System.out.println(cloudSchedulerClient.getJob(name).toString()); // To display the output
cloudSchedulerClient.close();
} catch (IOException e) {
e.printStackTrace();
}
如需其他指导,请参阅此处的自定义凭据的API 参考。
请注意,如果处理不当,您使用的服务帐户可能会被未经授权的人读取。我的建议是只为您的服务帐户设置执行任务所需的权限。您还可以遵循此最佳实践来管理您的凭据。
推荐阅读
- java - fork/join,输入数组需要同步吗?
- python - 如何在python中旋转数据框
- html - 带有“display:flex”的引导程序“.row”类导致“text-align:center”不适用于“p”标签
- android - Android Studio 标准列表视图:E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
- pandas - 熊猫:严格替换值
- java - 无法打开 zip 文件。Gradle 的依赖缓存可能已损坏(这有时会在网络连接超时后发生。)
- javascript - 带有百分比的 svg 饼图
- .net - 从网站同时触发多个功能
- java - 每次我需要向服务器发送一些东西或接收一些东西时,我是否需要重新创建一个新的 Socket?
- java - 无法发现端点 url