首页 > 解决方案 > 在 Java 应用程序中对 Cloud Scheduler 进行身份验证

问题描述

我正在使用 Java SDK for google cloud scheduler 创建一些计划作业。这是已作为另一个问题的一部分发布的应用程序代码的链接。该应用程序基本上创建了一个 Cloud Scheduler 作业,每次运行时都会触发 VertexAI 上的自定义训练作业。现在,调度程序对 VertexAI 的调用以创建自定义作业已使用服务帐户进行身份验证。我的问题是关于创建 Cloud Scheduler 作业本身的应用程序代码的身份验证。我已将此应用程序设置为 maven 项目,并创建了一个可执行 jar。该应用程序本身在我的本地工作站上运行。以下是我的观点/问题:

  1. 当我创建一个 docker 映像并将此 jar 和服务帐户密钥复制到映像中,然后将 GOOGLE_APPLICATION_CREDENTIALS 环境变量设置为指向容器内的密钥时,应用程序运行良好并创建了 Cloud Scheduler 作业。
  2. 当我执行与上述相同的操作时,除了我只是在 powershell 中执行 jar(使用指向服务帐户密钥的 GOOGLE_APPLICATION_CREDENTIALS 环境变量),权限被拒绝。
  3. 与 2 相同,只是我只是使用 eclipse“运行应用程序”按钮运行应用程序。

如何进行身份验证以运行应用程序而无需在 docker 容器中运行。有没有一种方法可以在不使用 GOOGLE_APPLICATION_CREDENTIALS 环境变量的情况下进行身份验证,即直接在应用程序代码本身中进行身份验证。示例代码/示例的链接将很有帮助。

编辑:对于第 2 点,问题是环境变量名称中的拼写错误。对于第3点,您可以直接在eclipse中设置环境变量,如@RJC的回答中所述。

标签: javagoogle-cloud-platformgoogle-authenticationgoogle-cloud-scheduler

解决方案


我的机器上没有 Eclipse,但我找到了一个相关的答案,您可以在其中在 IDE 本身中添加特定的环境变量。我建议您尝试执行以下操作,看看是否可以解决问题。

还有另一种不使用 进行身份验证GOOGLE_APPLICATION_CREDENTIALS的方法,即在代码中显式指向您的服务帐户文件。我创建了一个示例代码,它可以在不使用 GOOGLE_APPLICATION_CREDENTIALS 的情况下检索作业名称。身份验证是通过在初始化CloudSchedulerClient.

这是我最后所做的:

  1. 使用gcloud iam service-accounts keys create serviceaccount.json --iam-account=NAME@PROJECT_ID.iam.gserviceaccount.com它将为将在 CredentialsProvider 中使用的服务帐户生成 JSON 文件。
  2. 创建一个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 参考。

请注意,如果处理不当,您使用的服务帐户可能会被未经授权的人读取。我的建议是只为您的服务帐户设置执行任务所需的权限。您还可以遵循此最佳实践来管理您的凭据。


推荐阅读